"A" in Ä umwandeln


12

Momentan scanne ich ein paar handgeschriebene Dokumente und konvertiere sie in .txtDateien. Da ich eine schreckliche Handschrift habe, konvertiert der .jpg-> .txtKonverter einige meiner Umlaute in den "normalen" Buchstaben von'

Aufgabe

Schreiben Sie ein Programm oder eine Funktion, die:

  • Wird mit einem String versehen
    • Sie können eine beliebige E / A-Codepage auswählen, solange
    • Die Eingabe enthält (neben Leerzeichen) nur druckbare Zeichen aus Ihrer Codepage.
      • Es wird nur eine Lösung geben, daher werden Dinge wie 'a'e'nicht erscheinen
  • Konvertiert alle Zeichen im folgenden Satz AEIOUaeiouinÄËÏÖÜäëïöü
    • Wenn und nur wenn sie von 'Zeichen umgeben sind:
      • Beispiel :'a''e' -> äë
    • Wenn der from- String ein einzelner Buchstabe ist.
      • 'AE'ändert sich zum Beispiel überhaupt nicht und gibt so aus, wie sie ist.
    • Wenn das von- Zeichen kein Zeichen von AEIOUaeioudiesem Zeichen ist, ändert sich nichts.

Hinweis: Das Zeichen from / from ist die Zeichenfolge zwischen '.

Testfälle

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
Der Wirkstoff in all Ihren Testfällen ist entweder 'A'oder 'a'... nicht das, was ich für gute Testfälle halte.
Undichte Nonne

1
Kannst du mit ein Beispiel hinzufügen 'w'(wie wgehört nicht dazu AEIOUaeiou)?
Jimmy23013

8
Das Kombinieren von Diakritika hatte einen unbekannten Status , wurde dann zugelassen und dann abgelehnt . Dies hat mindestens 4 Antworten ungültig gemacht. Boo! Zischen! Ich habe mein Upvote in ein Downvote geändert :(
Digital Trauma

1
@DigitalTrauma Das tut mir sehr leid.
Roman Gräf

4
Testfall hinzufügen:'q'e'd'
Anzeigename

Antworten:


11

JavaScript (ES6), 81 70 68 Bytes

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

Versuch es

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>


Erläuterung

  • s=> Anonyme Funktion, die die Eingabezeichenfolge als Argument über den Parameter "s" verwendet.
  • s.replace(x,y) Gibt die Zeichenfolge zurück, wobei "x" durch "y" ersetzt wird.
  • /'[aeiou]'/gi Regulärer Ausdruck ohne Berücksichtigung der Groß- und Kleinschreibung, der mit allen Vorkommen eines Vokals in einfachen Anführungszeichen übereinstimmt.
  • c=> Übergibt jede Übereinstimmung des regulären Ausdrucks über den Parameter "c" an eine anonyme Funktion.
  • "ï ÖÄöä ËÜëüÏ "[n]Gibt das n-te Zeichen (0 indiziert) in der Zeichenfolge "ï ÖÄöä ËÜëüÏ" zurück, ähnlich wie "ï ÖÄöä ËÜëüÏ ".charAt(n).
  • c.charCodeAt(1)%15 Ruft den Rest des Zeichencodes des zweiten Zeichens in "c" (dh des Vokalzeichens) ab, wenn er durch 15 geteilt wird.

Alternative, 40/52 36/48 Bytes (35/47 Zeichen)

Das Folgende war meine Antwort, bevor das Kombinieren von Diakritika verboten wurde (Boo-Urnen!) - besser gesehen in dieser Geige

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

ETHproductions schlägt jedoch vor, dass dies mit der Hinzufügung von .normalize()zusätzlichen 12 Bytes gültig wäre.

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

OP hat noch nicht geantwortet codegolf.stackexchange.com/users/59183/dzaima
Adám

Nein, wenn das Kombinieren von Diakritika erlaubt ist.
Adám

Das Kombinieren von Diakritika ist jetzt verboten.
Adám

Ich glaube, Sie können dies bestätigen, indem Sie .normalize()das Ende der Funktion ergänzen.
ETHproductions

Bist du sicher, @ETHproductions? Wenn das Kombinieren von diakritischen Zeichen verboten ist, ist es ihnen dann nicht untersagt, überhaupt in einer Antwort zu erscheinen ?
Shaggy

8

Perl 5, 25 Bytes

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

24 Bytes plus 1 für -pestatt-e

Dabei wird die Regel verwendet, dass Sie eine beliebige E / A-Codepage auswählen können, sofern diese die Zeichen unterstützt AEIOUaeiouÄËÏÖÜäëïöü'. Außerdem wird das /aFlag für reguläre Ausdrücke verwendet, mit dem \wgenau auf die Zeichen verwiesen wird, abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789unabhängig davon, wie sie codiert sind.

Die ausgewählte E / A-Codepage für mein Skript lautet wie folgt:

 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  '

(Ich kann dieses Skript nicht mit den Testfällen in der Frage testen, da sie einige wirklich seltsame Zeichen enthalten, wie t.)


Vielen Dank an Grimy , der mir drei Bytes gespart hat. Früher hatte ich s/'([a-z])'/chr 1+ord$1/gie, die (die Codierung und) die interessante Tatsache, die [a-z]in Perl speziell behandelt wird, verwendet, um genau zu passen, abcdefghijklmnopqrstuvwxyzegal die Codierung. Meine frühere Antwort ist, IMO, interessanter, aber diese ist kürzer, also, zum Teufel, ich werde es nehmen.


1
Ich habe die Liste "Lücken, die standardmäßig verboten sind" vor dem Posten sorgfältig geprüft, und die Erfindung einer Codepage gehörte nicht dazu. Dies und insbesondere die Tatsache, dass die Frage die Verwendung einer "beliebigen I / O-Codepage" auffordert, scheinen diese Antwort zuzulassen. Und dann a-zmacht der Trick die Antwort tatsächlich interessant, anstatt nur zu betrügen. (IMO jedenfalls.)
msh210

3
Dies ist die Art von Trick, die nur einmal lustig ist, aber ich glaube, Sie sind der erste, der sie verwendet, also funktioniert sie (=
Grimmy

1
Sie können 3 Bytes einsparen, indem Sie \wanstelle von [a-z]und /aanstelle von verwenden /i. Wenn der Modifikator "/ a" aktiviert ist, werden \wdie Zeichen [a-zA-Z0-9_] unabhängig von ihrer Codierung zugeordnet.
Grimmy

@ Grimy, danke! Ich werde bearbeiten ....
msh210


4

Japt , 29 Bytes

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

Probieren Sie es online!

Erläuterung

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
Das Kombinieren von diakritischen Zeichen ist umstritten.
Undichte Nonne

Schlagen Sie mich zu. Ihre Lösung ist allerdings viel kürzer als meine ... Gut gemacht.
Luke

@LeakyNun Umstritten für diese Frage oder allgemein?
Digitales Trauma

Umstritten für diese Frage, weil Sie sie in den Kommentaren angesprochen haben, aber nie angesprochen wurden.
Undichte Nonne

@ Adám Schlage dich um 38 Sekunden ;-)
ETHproductions

4

Javascript, 67 Bytes

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

Probieren Sie es online!

Ersetzen Sie alle Zeichen zwischen Anführungszeichen entweder durch das entsprechende umlaute Zeichen oder durch die Übereinstimmung selbst, wenn es sich nicht um eine Gruppe von Zeichen handelt, die geändert werden müssen.


3

Gelee , 36 Bytes

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

Probieren Sie es online!

Das scheint für Jelly ziemlich kompliziert zu sein!

Wie?

Hinweis: Da sich die Zeichen nicht auf der Codepage befinden, sondern im Bereich eines Bytes in Unicode liegen, müssen sie meiner Meinung nach aus Ordnungszahlen erstellt werden.

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

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

Probieren Sie es online!

Hexdump:

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

Dies ist nur eine direkte Übersetzung meiner vim Antwort, damit ich alle Golfsprachen schlagen kann. : P



1

/// 67 Bytes

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

Probieren Sie es online!

Dies funktioniert, indem ungepunktete Buchstaben in einfachen Anführungszeichen ( 'A') durch den gleichen Buchstaben wie gepunktete Buchstaben ohne einfache Anführungszeichen () ersetzt werden.Ä ) ersetzt werden. Ein einziger Ersatz hierfür sieht wie folgt aus (vor dem Golf): /'A'/Ä/.

Der Golf nimmt zwei gemeinsame Vorkommen, //und '/, und verwendet sie als Ersatz.


1

Swift - 201 Bytes

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

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


1
characters.map{blah blah}und replacingOccurrences()töte wirklich den Spaß: ((
Mr. Xcoder

1

APL (Dyalog) , 53 Bytes

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

Probieren Sie es online!

Verwendet PCRE R eplace (Speichern der RegEx als v ) die folgende Funktion zitiert Vokale anzuwenden:

{ anonyme Funktion

' ÄËÏÖÜäëïöü'[] Indizieren den String (beachten Sie zwei Leerzeichen entsprechend'[ ) mit:

  ⍵.Match die übereinstimmende Zeichenfolge

  2⊃ wähle den zweiten Buchstaben (den Vokal)

  v⍳ Index finden in v

}


1

AWK , 99 Bytes

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

Probieren Sie es online!

Ich habe versucht, eine clevere Regex in einem zu finden, gensubaber es ist fehlgeschlagen :(


1

SOGL , 43 35 (UTF-8) Bytes

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

Erläuterung:

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
Man könnte meinen, das ̈+ist eine Funktion in SOGL.
Adám

Das Kombinieren von Diakritika ist jetzt verboten.
Adám

1

05AB1E , 30 29 24 Bytes

-6 Bytes dank Emigna

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

05AB1E hat bequemerweise die Zeichen äëïöüin seiner Codepage.

Probieren Sie es online!

(alter Code)

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

Erklärung (veraltet):

ž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

Probieren Sie es online!


Sie könnten ersetzen mit Š.
Emigna

Sie könnten noch ein paar Bytes mitžMDu«S''«''ì"äëïöü"Du«S:
Emigna

@Emigna Nochmals vielen Dank.
Ok,

Sie brauchen auch nicht die Iam Anfang :)
Emigna

1

Python 3.6, 98 92 Zeichen

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

Es ist eine Funktion, kein vollständiges Programm.

Zur besseren Lesbarkeit formatiert:

import re

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

Vielen Dank an @ValueInk für clevere Tipps zum weiteren Golfen.


Läuft nicht für mich. Stoppt mit einem TypeError.
totalhuman

@totallyhuman bist du sicher? Es scheint für mich zu funktionieren. Sie müssen die aFunktion mit der Zeichenfolge aufrufen, die Sie ersetzen möchten.
numbermaniac


1
Python docs meldet, dass match.__getitem__(g)Python 3.6 neu ist, und sollte daher wahrscheinlich in Ihrem Header angegeben werden. Wenn Sie Ihren regulären Ausdruck in ändern, '([AEIOUaeiou])'speichern Sie ein Byte, indem Sie x[0][1]in x[1]und -3anstelle von ändern -2.
Value Ink

1
Eigentlich ist es sogar noch kürzer, import re;a=lambda i,p="'([AEIOUaeiou])'":re.sub ...da Sie einiges an Aufwand sparen , weil Sie keine returnErklärung mehr benötigen !
Value Ink

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.