Convertitore da 'A' a Ä


12

Attualmente sto scansionando un sacco di documenti scritti a mano e li sto convertendo in .txtfile. Dato che ho una terribile calligrafia, il convertitore .jpg-> .txtconverte alcune delle mie umlaut nella lettera "normale" racchiusa da'

Compito

Scrivi un programma o una funzione che:

  • Viene data una stringa
    • puoi scegliere qualsiasi codepage I / O purché
    • l'input conterrà (accanto agli spazi) solo caratteri stampabili dalla tua tabella codici.
      • Ci sarà solo una soluzione, quindi cose come 'a'e'non appariranno
  • Converte tutti i caratteri nel seguente set AEIOUaeiouinÄËÏÖÜäëïöü
    • Se, e solo se, sono circondati da 'caratteri:
      • Esempio :'a''e' -> äë
    • Se la stringa da è una singola lettera.
      • per esempio 'AE'non cambia affatto, producendo così com'è.
    • Se il personaggio da non è un personaggio fuori da AEIOUaeiouquel personaggio non cambierà.

Nota: il carattere from / from string è quello tra '.

Casi 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
Il principio attivo in tutti i tuoi test è o 'A'o 'a'... non quello che considero buoni test.
Leaky Nun,

1
Puoi aggiungere un esempio con 'w'(come wnon è uno di AEIOUaeiou)?
jimmy23013,

8
La combinazione dei segni diacritici aveva uno stato sconosciuto , quindi era consentita , quindi era vietata . Ciò ha invalidato almeno 4 risposte. Boo! Sibilo! Ho cambiato il mio voto in un voto negativo :(
Digital Trauma

1
@DigitalTrauma Mi dispiace molto per quello.
Roman Gräf,

4
Aggiungi testcase:'q'e'd'
Visualizza nome

Risposte:


11

JavaScript (ES6), 81 70 68 byte

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

Provalo

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>


Spiegazione

  • s=> Funzione anonima che accetta la stringa di input come argomento tramite il parametro "s".
  • s.replace(x,y) Restituisce la stringa con "x" sostituita da "y".
  • /'[aeiou]'/gi Espressione regolare senza distinzione tra maiuscole e minuscole che corrisponde a tutte le occorrenze di una vocale racchiusa tra virgolette singole.
  • c=> Passa ogni corrispondenza dell'espressione regolare a una funzione anonima tramite il parametro "c".
  • "ï ÖÄöä ËÜëüÏ "[n]Restituisce l'ennesimo carattere (0 indicizzato) nella stringa "ï ÖÄöä ËÜëüÏ", simile a "ï ÖÄöä ËÜëüÏ ".charAt(n).
  • c.charCodeAt(1)%15 Ottiene il resto del codice carattere del secondo carattere in "c" (ovvero il carattere vocale) quando diviso per 15.

Alternativo, 40/52 36/48 byte (35/47 caratteri)

La seguente è stata la mia risposta prima che la combinazione dei segni diacritici fosse vietata (Boo-urne!) - meglio visto in questo violino

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

Tuttavia, ETHproductions suggerisce che con l'aggiunta di .normalize()ulteriori 12 byte ciò sarebbe valido.

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


No, se è consentita la combinazione di segni diacritici.
Adám,

La combinazione di segni diacritici è ora vietata.
Adám,

Credo che tu possa renderlo valido aggiungendo .normalize()alla fine della funzione.
ETHproductions

Sei sicuro, @ETHproductions? Se segni diacritici, che conciliano sono vietate, non sono forse vietato apparire in una risposta a tutti ?
Shaggy,

8

Perl 5, 25 byte

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

24 byte, più 1 per -peanziché-e

Questo fa uso della regola che "è possibile scegliere qualsiasi codepage I / O purché supporti i caratteri AEIOUaeiouÄËÏÖÜäëïöü'". Utilizza anche la /abandiera sulle regex, che fa \wriferimento a precisamente i personaggi abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789indipendentemente da come sono codificati.

La tabella codici I / O scelta per il mio script è questa:

 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  '

(Non posso testare questo script sui casi di test nella domanda, in quanto includono alcuni personaggi davvero strani, come t.)


Grazie a Grimy per avermi salvato tre byte. In precedenza, avevo s/'([a-z])'/chr 1+ord$1/gie, che utilizzava (la codifica e) il fatto interessante che [a-z]è inserito in un caso speciale in Perl per adattarsi esattamente abcdefghijklmnopqrstuvwxyzindipendentemente dalla codifica. La mia prima risposta è, IMO, più interessante, ma questa è più breve, quindi, diamine, la prenderò.


1
Ho controllato attentamente l'elenco delle "scappatoie vietate per impostazione predefinita" prima di pubblicarlo, e inventare una tabella codici non era tra queste. Ciò, in particolare il fatto che la domanda ha invitato a utilizzare "qualsiasi codepage I / O", sembra consentire questa risposta. E poi il a-ztrucco rende la risposta realmente interessante invece che semplicemente un imbroglione. (IMO, comunque.)
msh210,

3
Questo è il tipo di trucco che è divertente solo una volta, ma credo che tu sia il primo ad usarlo, quindi funziona (=
Grimmy

1
È possibile salvare 3 byte utilizzando \winvece di [a-z], così come /ainvece di /i. Se il modificatore "/ a" è \wattivo , corrisponde ai caratteri [a-zA-Z0-9_], indipendentemente dal modo in cui sono codificati.
Grimmy,

@Grimy, grazie!
Modificherò


4

Japt , 29 byte

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

Provalo online!

Spiegazione

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'uso della combinazione di segni diacritici è controverso.
Leaky Nun,

Battimi. La tua soluzione è molto più breve della mia però ... Ben fatto.
Luca,

@LeakyNun Controverso per questa domanda o in generale?
Digital Trauma,

Controversa per questa domanda perché l'hai sollevata nei commenti ma non è mai stata affrontata.
Leaky Nun,

@Adám ti ha battuto per 38 secondi ;-)
ETHproductions

4

Javascript, 67 byte

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

Provalo online!

Sostituisci tutti i caratteri tra virgolette con il corrispondente carattere umlauted o la corrispondenza stessa se non è nel gruppo di caratteri che devono essere modificati.


3

Gelatina , 36 byte

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

Provalo online!

Questo sembra abbastanza complicato per Jelly!

Come?

Nota: poiché i caratteri non si trovano nella tabella codici, ma si trovano nell'intervallo di un byte in Unicode, penso che debbano essere creati da ordinali, quindi l'ho fatto.

œṣ⁹Ṫ¤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 byte

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

Provalo online!

hexdump:

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

Questa è solo una traduzione diretta della mia risposta virtuale in modo da poter battere tutte le lingue del golf. : P



1

/// , 67 byte

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

Provalo online!

Funziona sostituendo le lettere senza punti racchiuse tra virgolette singole ( 'A') con la stessa lettera di un punto, senza le virgolette singole ( Ä). Una sola sostituzione di questo assomiglia a questo (prima che il campo da golf): /'A'/Ä/.

Il campo prende due fenomeni comuni, //e '/, e li usa come sostituti.


1

Swift - 201 byte

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)}

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


1
characters.map{blah blah}e replacingOccurrences()uccidi davvero il divertimento: ((
Mr. Xcoder

1

APL (Dyalog) , 53 byte

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

Provalo online!

Utilizza PCRE R eplace (salvando RegEx come v ) per applicare la seguente funzione alle vocali tra virgolette:

{ funzione anonima

' ÄËÏÖÜäëïöü'[] Indicizza la stringa (nota due spazi corrispondenti a '[) con:

  ⍵.Match la stringa corrispondente

  2⊃ scegli la seconda lettera (la vocale)

  v⍳ trova indice in v

}


1

AWK , 99 byte

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

Provalo online!

Ho provato a trovare qualche regex intelligente in un gensubma non ci sono riuscito :(


1

SOGL , 43 35 (UTF-8) byte

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

Spiegazione:

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
Heh, si potrebbe pensare che ̈+sia una funzione in SOGL.
Adám,

La combinazione di segni diacritici è ora vietata.
Adám,

1

05AB1E , 30 29 24 byte

-6 byte grazie a Emigna

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

05AB1E ha comodamente i caratteri äëïöünella sua tabella codici.

Provalo online!

(vecchio codice)

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

Spiegazione (obsoleta):

ž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

Provalo online!


È possibile sostituire con Š.
Emigna,

Potresti salvare qualche altro byte conžMDu«S''«''ì"äëïöü"Du«S:
Emigna,

@Emigna Grazie ancora.
Okx,

Inoltre non è necessario Iall'inizio :)
Emigna,

1

Python 3.6, 98 92 caratteri

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

È una funzione, non un programma completo.

Formattato per la leggibilità:

import re

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

Grazie a @ValueInk per suggerimenti intelligenti per ulteriori golf.


Non corre per me. Si ferma con un TypeError.
totalmente umano

@totallyhuman ne sei sicuro? Sembra funzionare per me. È necessario chiamare la afunzione con la stringa che si desidera sostituire.
numbermaniac,


1
I documenti di Python riportano che match.__getitem__(g)è nuovo in Python 3.6, quindi dovrebbe probabilmente essere specificato nell'intestazione. Inoltre, se si cambia il regex per '([AEIOUaeiou])'risparmiare un byte cambiando x[0][1]per x[1]e utilizzare -3al posto di -2.
Valore dell'inchiostro

1
In realtà, è ancora più breve da fare import re;a=lambda i,p="'([AEIOUaeiou])'":re.sub ...poiché hai tagliato un bel po 'di spese generali dal non aver più bisogno di una returndichiarazione!
Value Ink

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.