Konwerter „A” na Ę


12

Obecnie skanuję kilka ręcznie pisanych dokumentów i przekształcam je w .txtpliki. Ponieważ mam okropne pismo, konwerter .jpg-> .txtkonwertuje niektóre moje umlauty na „normalną” literę otoczoną przez'

Zadanie

Napisz program lub funkcję, która:

  • Podano ciąg
    • możesz wybrać dowolną stronę kodową we / wy tak długo, jak
    • dane wejściowe będą (oprócz spacji) zawierać tylko znaki do wydrukowania ze strony kodowej.
      • Będzie tylko jedno rozwiązanie, więc rzeczy takie jak 'a'e'się nie pojawią
  • Konwertuje wszystkie znaki w następującym zestawie AEIOUaeiounaÄËÏÖÜäëïöü
    • Jeśli i tylko jeśli są otoczone przez 'postacie:
      • Przykład :'a''e' -> äë
    • Jeśli ciąg od jest pojedynczą literą.
      • na przykład w 'AE'ogóle się nie zmienia, wyprowadzając „tak jak jest”.
    • Jeśli postać z nie jest postacią AEIOUaeiou, postać ta się nie zmieni.

Uwaga: Znak From / from string to ten pomiędzy '.

Przypadki testowe

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
Aktywnym składnikiem wszystkich testami są albo 'A'albo 'a'... nie to, co uważam za dobre testami.
Leaky Nun

1
Czy możesz dodać przykład z 'w'(jak wnie jest AEIOUaeiou)?
jimmy23013

8
Łączenie znaków diakrytycznych miało nieznany status , następnie były dozwolone , a następnie zostały niedozwolone . To unieważniło co najmniej 4 odpowiedzi. Gwizd! Syk! Zmieniłem swoje zdanie na opinię :(
Digital Trauma

1
@DigitalTrauma Przykro mi z tego powodu.
Roman Gräf

4
Dodaj przypadek testowy:'q'e'd'
Nazwa wyświetlana

Odpowiedzi:


11

JavaScript (ES6), 81 70 68 bajtów

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

Spróbuj

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>


Wyjaśnienie

  • s=> Anonimowa funkcja przyjmująca ciąg wejściowy jako argument za pomocą parametru „s”.
  • s.replace(x,y) Zwraca ciąg z „x” zastąpionym przez „y”.
  • /'[aeiou]'/gi Wyrażenie regularne bez rozróżniania wielkości liter, które pasuje do wszystkich wystąpień samogłoski ujętej w pojedyncze cudzysłowy.
  • c=> Przekazuje każde dopasowanie wyrażenia regularnego do funkcji anonimowej za pomocą parametru „c”.
  • "ï ÖÄöä ËÜëüÏ "[n]Zwraca n-ty znak (zindeksowany 0) w ciągu „ï ÖĘöä ËÜëüÏ”, podobnie jak "ï ÖÄöä ËÜëüÏ ".charAt(n).
  • c.charCodeAt(1)%15 Pobiera pozostałą część kodu drugiego znaku w „c” (tj. Znak samogłoski) po podzieleniu przez 15.

Alternatywnie, 40/52 36/48 bajtów (35/47 znaków)

Oto moja odpowiedź przed połączeniem znaków diakrytycznych została niedozwolona (Boo-urny!) - lepiej to zobaczyć w tym skrzypce

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

Jednak ETHproductions sugeruje, że po dodaniu .normalize()dodatkowych 12 bajtów byłoby to prawidłowe.

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

OP nadal nie odpowiedział na codegolf.stackexchange.com/users/59183/dzaima
Adám

Nie, jeśli dozwolone jest łączenie znaków diakrytycznych.
Adám

Łączenie znaków diakrytycznych jest teraz zabronione.
Adám

Wierzę, że możesz to zrobić, dodając .normalize()na końcu funkcji.
ETHprodukcje

Jesteś pewien, @ETHproductions? Jeśli łączące znaki diakrytyczne są zakazane, nie są one zabronione pojawiające się w odpowiedzi na wszystko ?
Kudłaty

8

Perl 5, 25 bajtów

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

24 bajty plus 1 za -pezamiast-e

Wykorzystuje to zasadę, że „możesz wybrać dowolną stronę kodową we / wy, o ile obsługuje ona znaki AEIOUaeiouÄËÏÖÜäëïöü'”. Wykorzystuje także /aflagę w wyrażeniach regularnych, co powoduje, \wże odnoszą się one dokładnie do znaków abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789bez względu na to, jak są one zakodowane.

Wybrana strona kodowa we / wy dla mojego skryptu jest następująca:

 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  '

(Nie mogę przetestować tego skryptu na testowych przypadkach w pytaniu, ponieważ zawierają one naprawdę dziwne znaki, takie jak t.)


Dzięki Grimy za uratowanie mi trzech bajtów. Wcześniej miałem s/'([a-z])'/chr 1+ord$1/gie, który wykorzystywał (kodowanie i) interesujący fakt, który [a-z]jest specjalnie zaprojektowany w Perlu, aby pasował dokładnie abcdefghijklmnopqrstuvwxyzbez względu na kodowanie. Moja wcześniejsza odpowiedź brzmi: IMO, bardziej interesujące, ale ta jest krótsza, więc do cholery, wezmę to.


1
Przed opublikowaniem tego uważnie sprawdziłem listę „luk, które są domyślnie zabronione”, a wymyślenie strony kodowej nie było wśród nich. To, a zwłaszcza fakt, że pytanie zachęca do użycia „dowolnej strony kodowej we / wy”, wydaje się umożliwiać tę odpowiedź. A potem a-zsztuczka sprawia, że ​​odpowiedź jest naprawdę interesująca, a nie tylko oszustwem. (W każdym razie IMO)
msh210

3
Jest to sztuczka, która jest zabawna tylko raz, ale uważam, że jesteś pierwszą, która ją stosuje, więc działa (=
Grimmy

1
Możesz zapisać 3 bajty, używając \wzamiast [a-z], jak i /azamiast /i. Jeśli obowiązuje modyfikator „/ a”, \wdopasowuje znaki [a-zA-Z0-9_], niezależnie od sposobu ich kodowania.
Grimmy,

@Grimy, dzięki! Będę edytować ....
msh210


4

Japt , 29 bajtów

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

Wypróbuj online!

Wyjaśnienie

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
Stosowanie łączenia znaków diakrytycznych jest kontrowersyjne.
Leaky Nun

Pokonaj mnie do tego. Twoje rozwiązanie jest jednak znacznie krótsze niż moje ... Dobra robota.
Łukasz

@LeakyNun Kontrowersyjny w stosunku do tego pytania lub ogólnie?
Cyfrowa trauma

Kontrowersyjne dla tego pytania, ponieważ podniosłeś je w komentarzach, ale nigdy nie zostało ono poruszone.
Leaky Nun

@ Adám Pokonał cię o 38 sekund ;-)
ETHprodukcje

4

JavaScript, 67 bajtów

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

Wypróbuj online!

Zamień wszystkie znaki między cudzysłowami na odpowiadające im znaki i same dopasowania, jeśli nie należą one do grupy znaków, które wymagają zmiany.


3

Galaretka , 36 bajtów

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

Wypróbuj online!

Wydaje się to dość skomplikowane dla Galaretki!

W jaki sposób?

Uwaga: Ponieważ znaki nie znajdują się na stronie kodowej, ale mieszczą się w zakresie bajtu w Unicode, myślę, że muszą być tworzone z rzędnych, więc mam.

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

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

Wypróbuj online!

Hexdump:

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

To jest tylko bezpośrednie tłumaczenie mojej odpowiedzi vima, dzięki czemu mogę pokonać wszystkie języki gry w golfa. : P



1

/// , 67 bajtów

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

Wypróbuj online!

Działa to poprzez zamianę kropkowanych liter otoczonych pojedynczymi cudzysłowami ( 'A') na tę samą literę co kropka, bez pojedynczych cudzysłowów ( Ä). Pojedyncza wymiana ta wygląda następująco (przed golfa) /'A'/Ä/.

Pole przyjmuje dwa wspólne wystąpienia, //i '/, i używa ich jako zamienniki.


1

Swift - 201 bajtów

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

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


1
characters.map{blah blah}i replacingOccurrences()naprawdę zabijają zabawę: ((
Pan Xcoder

1

APL (Dyalog) , 53 bajty

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

Wypróbuj online!

Korzysta z PCRE R eplace (zapisując RegEx jako v ), aby zastosować następującą funkcję do cytowanych samogłosek:

{ funkcja anonimowa

' ÄËÏÖÜäëïöü'[] Indeksuj ciąg (zwróć uwagę na dwie spacje odpowiadające '[) za pomocą:

  ⍵.Match dopasowany ciąg

  2⊃ wybierz drugą literę (samogłoskę)

  v⍳ znajdź indeks w v

}


1

AWK , 99 bajtów

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

Wypróbuj online!

Próbowałem wymyślić jakieś sprytne wyrażenie regularne w ciągu, gensubale nie udało się :(


1

SOGL , 43 35 (UTF-8) bajtów

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

Wyjaśnienie:

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, można by pomyśleć, że ̈+jest to funkcja w SOGL.
Adám

Łączenie znaków diakrytycznych jest teraz zabronione.
Adam

1

05AB1E , 30 29 24 bajtów

-6 bajtów dzięki Emignie

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

05AB1E ma dogodnie znaki äëïöüna stronie kodowej.

Wypróbuj online!

(stary kod)

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

Objaśnienie (nieaktualne):

ž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

Wypróbuj online!


Można wymienić z Š.
Emigna

Możesz zaoszczędzić jeszcze kilka bajtów za pomocąžMDu«S''«''ì"äëïöü"Du«S:
Emigna

@Emigna Jeszcze raz dziękuję.
Okx

Nie potrzebujesz też Ina początku :)
Emigna

1

Python 3.6, 98 92 znaków

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

To funkcja, a nie pełny program.

Sformatowane dla czytelności:

import re

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

Dzięki @ValueInk za sprytne wskazówki dotyczące dalszej gry w golfa.


Nie działa dla mnie. Zatrzymuje się z błędem typu.
całkowicie ludzki

@ totalniehuman jesteś pewien? Wygląda na to, że działa dla mnie. Musisz wywołać afunkcję z ciągiem, który chcesz zastąpić.
numbermaniac


1
Python docs raporty, które match.__getitem__(g)są nowością w Pythonie 3.6, więc prawdopodobnie powinny być określone w nagłówku. Ponadto, jeśli zmienisz wyrażenie regularne na, '([AEIOUaeiou])'możesz zapisać bajt, zmieniając x[0][1]na x[1]i używaj -3zamiast -2.
Wartość tuszu

1
W rzeczywistości jest to jeszcze krótsze, import re;a=lambda i,p="'([AEIOUaeiou])'":re.sub ...ponieważ uciąłeś sporo kosztów ogólnych, ponieważ nie potrzebujesz już returnoświadczenia!
Wartość tuszu

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.