Convertisseur de 'A' à Ä


12

J'analyse actuellement un tas de documents manuscrits et je les convertis en .txtfichiers. Comme j'ai une terrible écriture, le convertisseur .jpg-> .txtconvertit certains de mes trémas en lettre "normale" entourée de'

Tâche

Écrivez un programme ou une fonction qui:

  • Est donné une chaîne
    • vous pouvez choisir n'importe quelle page de code d'E / S tant que
    • l'entrée ne contiendra (à côté des espaces) que des caractères imprimables de votre page de codes.
      • Il n'y aura qu'une seule solution, donc des choses comme 'a'e'n'apparaîtront pas
  • Convertit tous les caractères de l'ensemble suivant AEIOUaeiouenÄËÏÖÜäëïöü
    • Si et seulement si, ils sont entourés de 'caractères:
      • Exemple :'a''e' -> äë
    • Si la chaîne from est une seule lettre.
      • par exemple, 'AE'ne change pas du tout, sortie telle quelle.
    • Si le caractère from n'est pas un caractère, AEIOUaeiouce caractère ne changera pas.

Remarque: Le caractère from / from string est celui entre les deux '.

Cas de test

Input
Output
<empty line>

'A'sthetik
Ästhetik

Meinung ist wichtig!
Meinung ist wichtig!

Ich sagte: "Er sagte: 'Ich habe Hunger'"
Ich sagte: "Er sagte: 'Ich habe Hunger'"

Ich sagte: "Er sagte: ''A'sthetik'"
Ich sagte: "Er sagte: 'Ästhetik'"

Hämisch rieb er sich die H'a'nde
Hämisch rieb er sich die Hände

H'a''a'slich isn't a German word
Hääslich isn't a German word

since it's really called h'a'sslich
since it's really called hässlich

6
L'ingrédient actif dans tous vos tests est soit 'A'ou 'a'... pas ce que je considère comme de bons tests.
Leaky Nun

1
Pouvez-vous ajouter un exemple avec 'w'(comme ce wn'est pas le cas AEIOUaeiou)?
jimmy23013

8
La combinaison de signes diacritiques avait un statut inconnu , puis a été autorisée , puis refusée . Cela a invalidé au moins 4 réponses. Huer! Sifflement! J'ai changé mon vote positif en un vote négatif :(
Digital Trauma

1
@DigitalTrauma Je suis vraiment désolé pour ça.
Roman Gräf

4
Ajouter un testcase:'q'e'd'
Nom d'affichage

Réponses:


11

JavaScript (ES6), 81 70 68 octets

s=>s.replace(/'[aeiou]'/gi,c=>"ï   ÖÄöä ËÜëüÏ "[c.charCodeAt(1)%15])

Essayez-le

f=
s=>s.replace(/'[aeiou]'/gi,c=>"ï   ÖÄöä ËÜëüÏ "[c.charCodeAt(1)%15])
i.addEventListener("input",_=>o.innerText=f(i.value))
console.log(f("'A'sthetik")) // Ästhetik
console.log(f("Meinung ist wichtig!")) // Meinung ist wichtig!
console.log(f(`Ich sagte: "Er sagte: 'Ich habe Hunger'"`)) // Ich sagte: "Er sagte: 'Ich habe Hunger'"
console.log(f(`Ich sagte: "Er sagte: ''A'sthetik'"`)) // Ich sagte: "Er sagte: 'Ästhetik'"
console.log(f("Hämisch rieb er sich die H'a'nde")) // Hämisch rieb er sich die Hände
console.log(f("H'a''a'slich isn't a German word")) // Hääslich isn't a German word
console.log(f("since it's really called h'a'sslich")) // since it's really called hässlich
<input id=i><pre id=o>


Explication

  • s=> Fonction anonyme prenant la chaîne d'entrée en argument via le paramètre "s".
  • s.replace(x,y) Renvoie la chaîne avec "x" remplacé par "y".
  • /'[aeiou]'/gi Expression régulière insensible à la casse qui correspond à toutes les occurrences d'une voyelle entourée de guillemets simples.
  • c=> Transmet chaque correspondance de l'expression régulière à une fonction anonyme via le paramètre "c".
  • "ï ÖÄöä ËÜëüÏ "[n]Renvoie le nième caractère (0 indexé) dans la chaîne "ï ÖÄöä ËÜëüÏ", similaire à "ï ÖÄöä ËÜëüÏ ".charAt(n).
  • c.charCodeAt(1)%15 Obtient le reste du code de caractère du deuxième caractère en "c" (c'est-à-dire le caractère de voyelle) lorsqu'il est divisé par 15.

Alternative, 40/52 36/48 octets (35/47 caractères)

Ce qui suit était ma réponse avant de combiner les diacritiques ont été interdits (Boo-urns!) - mieux vu dans ce violon

s=>s.replace(/'([aeiou])'/gi,"$1̈")

Cependant, ETHproductions suggère qu'avec l'ajout de .normalize()12 octets supplémentaires, cela serait valide.

s=>s.replace(/'([aeiou])'/gi,"$1̈").normalize()


Non, si la combinaison de signes diacritiques est autorisée.
2017

La combinaison de diacritiques est désormais interdite.
2017

Je pense que vous pouvez rendre cela valide en ajoutant .normalize()à la fin de la fonction.
ETHproductions

Êtes-vous sûr, @ETHproductions? Si combinaison diacritiques sont interdites, sont - ils pas interdit d'apparaître dans une réponse à tout ?
Shaggy

8

Perl 5, 25 octets

s/'(\w)'/chr 1+ord$1/age

24 octets, plus 1 pour -peau lieu de-e

Cela utilise la règle selon laquelle "vous pouvez choisir n'importe quelle page de code d'E / S tant qu'elle prend en charge les caractères AEIOUaeiouÄËÏÖÜäëïöü'". Il utilise également le /adrapeau sur les expressions rationnelles, ce qui provoque \wune référence précise aux caractères, abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789quel que soit leur mode de codage.

La page de code d'E / S choisie pour mon script est la suivante:

 1  a
 2  ä
 3  e
 4  ë
 5  i
 6  ï
 7  o
 8  ö
 9  u
10  ü
11  A
12  Ä
13  E
14  Ë
15  I
16  Ï
17  O
18  Ö
19  U
20  Ü
21  '

(Je ne peux pas tester ce script sur les cas de test dans la question, car ils incluent des personnages vraiment étranges, comme t.)


Merci à Grimy de m'avoir sauvé trois octets. Plus tôt, j'avais s/'([a-z])'/chr 1+ord$1/gie, qui utilisait (l'encodage et) le fait intéressant qui [a-z]est spécial dans Perl pour correspondre précisément abcdefghijklmnopqrstuvwxyzquel que soit l'encodage. Ma réponse précédente est, l'OMI, plus intéressante, mais celle-ci est plus courte, alors, bon sang, je vais la prendre.


1
J'ai soigneusement vérifié la liste des "failles qui sont interdites par défaut" avant de poster ceci, et inventer une page de code n'en faisait pas partie. Cela, plus particulièrement le fait que la question invitait à utiliser "n'importe quelle page de code d'E / S", semble permettre cette réponse. Et puis l' a-zastuce rend la réponse réellement intéressante au lieu d'une simple triche. (OMI, de toute façon.)
msh210

3
C'est le genre de truc qui n'est drôle qu'une seule fois, mais je pense que vous êtes le premier à l'utiliser, donc ça marche (=
Grimmy

1
Vous pouvez économiser 3 octets en utilisant \wau lieu de [a-z], ainsi qu'au /alieu de /i. Si le modificateur "/ a" est en vigueur, \wcorrespond aux caractères [a-zA-Z0-9_], quelle que soit la façon dont ils sont codés.
Grimmy

@Grimy, merci! Je vais éditer ....
msh210


4

Japt , 29 octets

r"'%v'"@"ï   ÖÄöä ËÜëüÏ "gXc1

Essayez-le en ligne!

Explication

r"'%v'"@"ï   ÖÄöä ËÜëüÏ "gXc1

r"'%v'"@                       // Replace each match X of /'<vowel>'/ in the input with
        "ï   ÖÄöä ËÜëüÏ "g     //   the character in this string at index
                          Xc1  //     X.charCodeAt(1).
                               //   Values larger than the length of the string wrap around,
                               //   so this is effectively equal to " ... "[n%15].
                               // Implicit: output result of last expression

1
L'utilisation de diacritiques combinés est controversée.
Leaky Nun

Battez-moi. Votre solution est cependant beaucoup plus courte que la mienne ... Bravo.
Luke

@LeakyNun Controversé pour cette question ou en général?
Digital Trauma

Controverse pour cette question car vous l'avez soulevée dans les commentaires mais elle n'a jamais été abordée.
Leaky Nun

@ Adám Beat you by 38 seconds ;-)
ETHproductions

4

Javascript, 67 octets

s=>s.replace(/'.'/g,c=>"äëïöüÄËÏÖÜ"['aeiouAEIOU'.indexOf(c[1])]||c)

Essayez-le en ligne!

Remplacez tous les caractères entre guillemets soit par le caractère umlauted correspondant, soit par la correspondance elle-même si elle ne fait pas partie du groupe de caractères à modifier.


3

Gelée , 36 octets

œṣ⁹Ṫ¤j
“.ạẏụ’D196;+\Ọż⁾''jЀØc¤;@Wç/

Essayez-le en ligne!

Cela semble assez compliqué pour Jelly!

Comment?

Remarque: Étant donné que les caractères ne sont pas sur la page de code, mais sont dans la plage d'un octet en Unicode, je pense qu'ils doivent être créés à partir d'ordinaux, donc je l'ai.

œṣ⁹Ṫ¤j - Link 1, Replace: char list S [...], list R [char T, char list F]
œṣ     - split S at sublists equal to:
    ¤  -   nilad followed by link(s) as a nilad:
  ⁹    -     link's right argument, R
   Ṫ   -     tail - yield char list F and modify R to become [T]
     j - join with R (now [T])
       - all in all split S at Rs and join back up with [T]s.

“.ạẏụ’D196;+\Ọż⁾''jЀØc¤;@Wç/ - Main link: char list S
       196;                   - 196 concatenate with:
“.ạẏụ’                        -   base 250 literal 747687476
      D                       -   to decimal list [7,4,7,6,8,7,4,7,6]
           +\                 - cumulative reduce with addition: [196,203,207,214,220,228,235,239,246,252]
             Ọ                - cast to characters: ÄËÏÖÜäëïöü
                       ¤      - nilad followed by link(s) as a nilad:
               ⁾''            -   literal ["'", "'"]
                     Øc       -   vowel yield: AEIOUaeiou
                  jЀ         -   join mapped:  ["'A'", "'E'", ...]
              ż               - zip together
                          W   - wrap S in a list
                        ;@    - concatenate (swap @rguments)
                           ç/ - reduce with last link (1) as a dyad
                              - implicit print

3

V , 24 octets

Óã'¨[aeiou]©'/±:
éiD@"

Essayez-le en ligne!

Hexdump:

00000000: d3e3 27a8 5b61 6569 6f75 5da9 272f 160b  ..'.[aeiou].'/..
00000010: b13a 0ae9 6944 4022                      .:..iD@"

Ceci est juste une traduction directe de ma réponse vim afin que je puisse battre toutes les langues de golf. : P



1

/// , 67 octets

/~/'\///`/\/\/~/'A~Ä`E~Ë`I~Ï`O~Ö`U~Ü`a~ä`e~ë`i~ï`o~ö`u~ü/

Essayez-le en ligne!

Cela fonctionne en remplaçant les lettres non pointées entourées de guillemets simples ( 'A') par la même lettre qu'un pointillé, sans les guillemets simples ( Ä). Un remplacement simple de cela ressemble à ce (avant le golf): /'A'/Ä/.

Le golf prend deux occurrences communes, //et '/, et les utilise comme remplacements.


1

Swift - 201 octets

import Foundation;func g(s:String){var e=s;var r="aeiouAEIOUäëïöüÄËÏÖÜ".characters.map{String($0)};for i in r[0...9]{e=e.replacingOccurrences(of:"'\(i)'",with:r[r.index(of:i)!+10])};print(e)}

Usage: g("'A'sthetik") // => Ästhetik


1
characters.map{blah blah}et replacingOccurrences()vraiment tuer le plaisir: ((
M. Xcoder

1

APL (Dyalog) , 53 octets

(v'''[AEIOUaeiou]''')⎕R{'  ÄËÏÖÜäëïöü'[v2⊃⍵.Match]}

Essayez-le en ligne!

Utilise PCRE R eplace (sauvegarde du RegEx sous v ) pour appliquer la fonction suivante aux voyelles citées:

{ fonction anonyme

' ÄËÏÖÜäëïöü'[] Indexez la chaîne (notez deux espaces correspondant à '[) avec:

  ⍵.Match la chaîne correspondante

  2⊃ choisir la deuxième lettre (la voyelle)

  v⍳ trouver l'index dans v

}


1

AWK , 99 octets

{split("AEIOUaeiou",p,"")
for(i=1;i<=split("ÄËÏÖÜäëïöü",r,"");i++)gsub("'"p[i]"'",r[i])}1

Essayez-le en ligne!

J'ai essayé de trouver une expression rationnelle intelligente dans un gensubmais j'ai échoué :(


1

SOGL , 43 35 (UTF-8) octets

L∫:ÆW ':h++;"äëïöü”:U+Wŗ

Explication:

L∫                        repeat 10 times, pushing current iteration (0-based)
  :                       duplicate the iteration
   ÆW                     get the index (1-based) in "aeiouAEIOU"
      ':h++               quote it
           ;              put the copy (current iteration) ontop
            "äëïöü”       push "äëïöü"
                   :      duplicate it
                    U     uppercase it
                     +    join together, resulting in "äëïöüÄËÏÖÜ"
                      W   get the index (1-based) in it
                       ŗ  replace [in the input, current char from "aeiouAEIOU" with
                          the corresponding char in "äëïöüÄËÏÖÜ"

3
Hé, on pourrait penser que ̈+c'est une fonction dans SOGL.
Adám

La combinaison de diacritiques est désormais interdite.
Adám

1

05AB1E , 30 29 24 octets

-6 octets grâce à Emigna

žMDu«S''«''ì"äëïöü"Du«S:

05AB1E a commodément les caractères äëïöüdans sa page de codes.

Essayez-le en ligne!

(ancien code)

žMDu«Svy''.ø})"äëïöü"Du«¹ŠS:

Explication (obsolète):

žM                             Push aeiou                    ['aeiou']
  D                            Duplicate                     ['aeiou', 'aeiou']
   u                           Uppercase                     ['aeiou', 'AEIOU']
    «                          Concatenate                   ['aeiouAEIOU']
     vy                        For each...
       ''                        Push '
         .ø                      Surround a with b (a -> bab)
           }                   End loop
            )                  Wrap stack to array           [["'a'", "'e'", "'i'", "'o'", "'u'", "'A'", "'E'", "'I'", "'O'", "'U'"]]
             "äëïöü"           String literal.               [["'a'", "'e'", "'i'", "'o'", "'u'", "'A'", "'E'", "'I'", "'O'", "'U'"], 'äëïöü']
                    Du«        Duplicate, uppercase, concat  [["'a'", "'e'", "'i'", "'o'", "'u'", "'A'", "'E'", "'I'", "'O'", "'U'"], 'äëïöüÄËÏÖÜ']
                       ¹       Push first input
                        Š      Push c, a, b                  ["'A'sthetik", ["'a'", "'e'", "'i'", "'o'", "'u'", "'A'", "'E'", "'I'", "'O'", "'U'"], 'äëïöüÄËÏÖÜ']
                          S    Convert to char list          ["'A'sthetik", ["'a'", "'e'", "'i'", "'o'", "'u'", "'A'", "'E'", "'I'", "'O'", "'U'"], ['ä', 'ë', 'ï', 'ö', 'ü', 'Ä', 'Ë', 'Ï', 'Ö', 'Ü']]
                           :   Replace all                   ['Ästhetik']
                               Implicit print

Essayez-le en ligne!


Vous pouvez remplacer par Š.
Emigna

Vous pourriez économiser quelques octets de plus avecžMDu«S''«''ì"äëïöü"Du«S:
Emigna

@Emigna Merci encore.
Okx

Vous n'avez pas non plus besoin du Idébut :)
Emigna

1

Python 3.6, 98 92 caractères

import re;a=lambda i,p="'([AEIOUaeiou])'":re.sub(p,lambda x:'ÄËÏÖÜäëïöü'[p.index(x[1])-3],i)

C'est une fonction, pas un programme complet.

Formaté pour la lisibilité:

import re

a = lambda i, p="'([AEIOUaeiou])'":\
    re.sub(p, lambda x: 'ÄËÏÖÜäëïöü'[p.index(x[1]) - 3], i)

Merci à @ValueInk pour des conseils astucieux pour continuer à jouer au golf.


Ne court pas pour moi. Arrête avec une TypeError.
2017 totalement humain

@totallyhuman êtes-vous sûr? Cela semble fonctionner pour moi. Vous devez appeler la afonction avec la chaîne que vous souhaitez remplacer.
numbermaniac


1
Python docs rapporte une match.__getitem__(g)nouveauté de Python 3.6, il devrait donc probablement être spécifié dans votre en-tête. De plus, si vous changez votre regex en '([AEIOUaeiou])'vous enregistrez un octet en changeant x[0][1]en x[1]et en utilisant -3au lieu de -2.
Value Ink

1
En fait, c'est encore plus court import re;a=lambda i,p="'([AEIOUaeiou])'":re.sub ...car vous évitez un peu de frais généraux de ne plus avoir besoin d'une returndéclaration!
Value Ink

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.