Konverter 'A' ke Ä


12

Saat ini saya sedang memindai banyak dokumen tulisan tangan dan mengonversinya menjadi .txtfile. Karena saya memiliki tulisan tangan yang buruk .jpg, .txtkonverter -> mengkonversi beberapa umlaut saya ke huruf "normal" yang terbungkus oleh'

Tugas

Tulis program atau fungsi yang:

  • Diberi string
    • Anda dapat memilih codepage I / O selama
      • itu mendukung karakter AEIOUaeiouÄËÏÖÜäëïöü'.
      • codepages Input dan Output adalah sama.
    • input akan (di samping spasi) hanya berisi karakter yang dapat dicetak dari codepage Anda.
      • Hanya akan ada satu solusi, sehingga hal-hal seperti 'a'e'tidak akan muncul
  • Mengubah semua karakter pada set berikut AEIOUaeioukeÄËÏÖÜäëïöü
    • Jika, dan hanya jika, mereka dikelilingi oleh 'karakter:
      • Contoh :'a''e' -> äë
    • Jika dari string adalah satu huruf.
      • misalnya 'AE'tidak berubah sama sekali, menghasilkan apa adanya.
    • Jika karakter dari bukan karakter dari AEIOUaeioukarakter itu tidak akan berubah.

Catatan: Karakter dari / dari string adalah satu di antara keduanya '.

Testcases

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
Bahan aktif dalam semua testcase Anda adalah salah satu 'A'atau 'a'... bukan yang saya anggap sebagai testcases yang baik.
Leaky Nun

1
Bisakah Anda menambahkan contoh dengan 'w'(seperti wbukan salah satu dari AEIOUaeiou)?
jimmy23013

8
Menggabungkan diakritik memiliki status yang tidak diketahui , kemudian diizinkan , lalu dianulir . Ini membatalkan setidaknya 4 jawaban. Boo! Mendesis! Saya telah mengubah upvote saya menjadi downvote :(
Digital Trauma

1
@DigitalTrauma Saya sangat menyesal untuk itu.
Roman Gräf

4
Tambahkan testcase:'q'e'd'
Nama Tampilan

Jawaban:


11

JavaScript (ES6), 81 70 68 byte

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

Cobalah

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>


Penjelasan

  • s=> Fungsi anonim mengambil string input sebagai argumen melalui parameter "s".
  • s.replace(x,y) Mengembalikan string dengan "x" digantikan oleh "y".
  • /'[aeiou]'/gi Ekspresi reguler yang tidak sensitif huruf yang cocok dengan semua kemunculan vokal yang diapit oleh tanda kutip tunggal.
  • c=> Lewati setiap kecocokan ekspresi reguler ke fungsi anonim melalui parameter "c".
  • "ï ÖÄöä ËÜëüÏ "[n]Mengembalikan karakter ke-n (0 diindeks) dalam string "ï ÖÄöä ËÜëüÏ", mirip dengan "ï ÖÄöä ËÜëüÏ ".charAt(n).
  • c.charCodeAt(1)%15 Dapatkan sisa kode karakter dari karakter kedua di "c" (yaitu karakter vokal) ketika dibagi 15.

Alternatif, 40/52 36/48 byte (35/47 karakter)

Berikut ini adalah jawaban saya sebelum menggabungkan diakritik dilarang (Boo-guci!) - lebih baik dilihat di Fiddle ini

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

Namun, ETHproductions menunjukkan bahwa dengan .normalize()tambahan 12 byte tambahan ini akan valid.

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


Tidak, jika menggabungkan diakritik diperbolehkan.
Adám

Menggabungkan diakritik sekarang dilarang.
Adám

Saya yakin Anda bisa menjadikan ini valid dengan menambahkan .normalize()ke akhir fungsi.
ETHproduksi

Apakah Anda yakin, @ETHproductions? Jika menggabungkan diakritik dilarang, apakah mereka tidak dilarang tampil dalam jawaban sama sekali ?
Shaggy

8

Perl 5, 25 byte

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

24 byte, ditambah 1 untuk -pebukannya-e

Ini menggunakan aturan bahwa "Anda dapat memilih codepage I / O selama mendukung karakter AEIOUaeiouÄËÏÖÜäëïöü'". Itu juga menggunakan /aflag pada regexes, yang menyebabkan \wuntuk merujuk secara tepat karakter-karakter itu abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789tidak peduli bagaimana mereka dikodekan.

Codepage I / O yang dipilih untuk skrip saya adalah ini:

 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  '

(Saya tidak dapat menguji skrip ini pada kasus uji dalam pertanyaan, karena mereka menyertakan beberapa karakter yang sangat aneh, seperti t.)


Terima kasih kepada Grimy karena telah menyelamatkan saya tiga byte. Sebelumnya, saya punya s/'([a-z])'/chr 1+ord$1/gie, yang memanfaatkan (pengkodean dan) fakta menarik yang [a-z]dikurung dalam Perl agar sama persis dengan abcdefghijklmnopqrstuvwxyzapa pun pengkodeannya. Jawaban saya sebelumnya adalah, IMO, lebih menarik, tetapi yang ini lebih pendek, jadi, apa-apaan, saya akan menerimanya.


1
Saya hati-hati memeriksa daftar "celah yang dilarang secara default" sebelum memposting ini, dan menemukan codepage tidak ada di antara mereka. Itu, ditambah terutama fakta bahwa pertanyaan itu mengundang penggunaan "setiap I / O codepage", tampaknya memungkinkan jawaban ini. Dan kemudian a-ztriknya membuat jawaban itu benar-benar menarik, bukan sekadar cheat. (Pokoknya, IMO.)
msh210

3
Ini adalah jenis trik yang hanya lucu sekali, tetapi saya percaya Anda adalah yang pertama menggunakannya, jadi itu berhasil (=
Grimmy

1
Anda dapat menyimpan 3 byte dengan menggunakan \wbukan [a-z], dan /abukannya /i. Jika pengubah "/ a" berlaku, \wcocok dengan karakter [a-zA-Z0-9_], terlepas dari bagaimana mereka dikodekan.
Grimmy

@ Grimy, terima kasih! Saya akan mengedit ....
msh210


4

Japt , 29 byte

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

Cobalah online!

Penjelasan

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
Menggunakan kombinasi diakritik itu kontroversial.
Leaky Nun

Kalahkan aku untuk itu. Solusi Anda jauh lebih pendek daripada milik saya ... Bagus sekali.
Lukas

@LeakyNun Kontroversial untuk pertanyaan ini atau secara umum?
Digital Trauma

Kontroversial untuk pertanyaan ini karena Anda mengemukakannya di komentar tetapi tidak pernah diatasi.
Leaky Nun

@ Adam Mengalahkan Anda dengan 38 detik ;-)
ETHproduksi

4

Javascript, 67 byte

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

Cobalah online!

Ganti semua karakter antara tanda kutip dengan karakter umlaut yang sesuai, atau cocok sendiri jika tidak ada dalam kelompok karakter yang perlu diubah.


3

Jelly , 36 byte

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

Cobalah online!

Ini sepertinya cukup rumit untuk Jelly!

Bagaimana?

Catatan: Karena karakter tidak pada halaman kode, tetapi berada dalam kisaran byte di Unicode, saya pikir mereka harus dibuat dari ordinals, jadi saya punya.

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

Cobalah online!

Hexdump:

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

Ini hanya terjemahan langsung dari jawaban vim saya sehingga saya bisa mengalahkan semua bahasa golf. : P



1

/// , 67 byte

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

Cobalah online!

Ini berfungsi dengan mengganti huruf tidak bertitik yang dikelilingi oleh tanda kutip tunggal ( 'A') dengan huruf yang sama dengan tanda titik, tanpa tanda kutip tunggal ( Ä). Sebuah penggantian tunggal ini terlihat seperti ini (sebelum golf): /'A'/Ä/.

Golf mengambil dua kejadian umum, //dan '/, dan menggunakannya sebagai pengganti.


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

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


1
characters.map{blah blah}dan replacingOccurrences()benar - benar mematikan kesenangan: ((
Tn. Xcoder

1

APL (Dyalog) , 53 byte

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

Cobalah online!

Menggunakan PCRE R eplace (menyimpan RegEx sebagai v ) untuk menerapkan fungsi berikut ke vokal yang dikutip:

{ fungsi anonim

' ÄËÏÖÜäëïöü'[... ] mengindeks string (perhatikan dua spasi yang berkaitan dengan '[) dengan:

  ⍵.Match string yang cocok

  2⊃ pilih huruf kedua (vokal)

  v⍳ cari indeks dalam v

}


1

AWK , 99 byte

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

Cobalah online!

Saya mencoba untuk datang dengan beberapa regex pintar dalam gensub:( tetapi gagal


1

SOGL , 43 35 (UTF-8) byte

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

Penjelasan:

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, orang bisa berpikir itu ̈+adalah fungsi di SOGL.
Adám

Menggabungkan diakritik sekarang dilarang.
Adám

1

05AB1E , 30 29 24 byte

-6 byte terima kasih kepada Emigna

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

05AB1E dengan mudah memiliki karakter äëïöüdi halaman kode-nya.

Cobalah online!

(kode lama)

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

Penjelasan (kedaluwarsa):

ž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

Cobalah online!


Anda bisa menggantinya dengan Š.
Emigna

Anda dapat menyimpan beberapa byte lagi denganžMDu«S''«''ì"äëïöü"Du«S:
Emigna

@Emigna Terima kasih lagi.
Okx

Anda juga tidak memerlukannya Idi awal :)
Emigna

1

Python 3.6, 98 92 karakter

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

Itu sebuah fungsi, bukan program yang lengkap.

Diformat agar mudah dibaca:

import re

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

Terima kasih kepada @ValueInk untuk tips cerdas untuk bermain golf lebih lanjut.


Tidak lari untuk saya. Berhenti dengan TypeError.
sepenuhnya manusia

@ benar-benar manusia apakah Anda yakin? Sepertinya itu bekerja untuk saya. Anda perlu memanggil afungsi dengan string yang ingin Anda ganti.
numbermaniac


1
Python docs melaporkan bahwa match.__getitem__(g)ini baru untuk Python 3.6 sehingga mungkin harus ditentukan di header Anda. Juga, jika Anda mengubah regex Anda untuk '([AEIOUaeiou])'Anda menyimpan byte dengan mengubah x[0][1]ke x[1]dan menggunakan -3bukan -2.
Value Ink

1
Sebenarnya, ini lebih singkat import re;a=lambda i,p="'([AEIOUaeiou])'":re.sub ...karena Anda memotong sedikit overhead karena tidak perlu lagi returnpernyataan!
Value Ink

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.