'A' - Ä dönüştürücü


12

Şu anda bir grup el yazısı dokümanı tarıyorum ve .txtdosyalara dönüştürüyorum . Korkunç bir el yazım olduğu için .jpg-> .txtdönüştürücü, benim umlaut'umun bir kısmını "normal" harfine dönüştürüyor'

Görev

Aşağıdaki gibi bir program veya işlev yazın:

  • Bir dize verilir
    • sürece herhangi bir I / O kod sayfasını seçebilirsiniz
      • karakterleri destekler AEIOUaeiouÄËÏÖÜäëïöü'.
      • Giriş ve Çıkış kod sayfaları aynıdır.
    • giriş (boşlukların yanında) yalnızca kod sayfanızdan yazdırılabilir karakterler içerir.
      • Sadece bir çözüm olacak, böylece böyle 'a'e'görünmeyecek
  • Aşağıdaki sette tüm karakterlerin dönüştürür AEIOUaeiouiçinÄËÏÖÜäëïöü
    • Yalnızca ve yalnızca 'karakterlerle çevriliyse :
      • Örnek :'a''e' -> äë
    • Eğer gelen dize tek mektup.
      • örneğin olduğu 'AE'gibi çıktı olarak hiç değişmez.
    • Eğer gelen karakterin bir karakter dışında değil AEIOUaeiouo karakteri değişmez.

Not: karakterden / dizesinden arasındaki biridir '.

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
Tüm test vakalarınızdaki aktif madde ya 'A'ya 'a'... iyi test vakaları olarak düşündüğüm şey değil.
Sızdıran Rahibe

1
İle bir örnek ekleyebilir misiniz 'w'(olduğu gibi wdeğil AEIOUaeiou)?
jimmy23013

8
Aksanları birleştirmek bilinmeyen bir duruma , daha sonra izin verildi , sonra izin verilmedi . Bu en az 4 cevabı geçersiz kıldı. Boo! Hiss! Yukarı oyumu bir aşağı oyuna değiştirdim :(
Digital Trauma

1
@DigitalTrauma Bunun için çok üzgünüm.
Roman Gräf

4
Testcase ekle:'q'e'd'
Görünen Ad 5

Yanıtlar:


11

JavaScript (ES6), 81 70 68 bayt

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

Dene

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>


açıklama

  • s=> "S" parametresi ile giriş dizesini bağımsız değişken olarak alan anonim işlev.
  • s.replace(x,y) "Y" ile değiştirilen "x" dizesini döndürür.
  • /'[aeiou]'/gi Tek tırnak içine alınmış bir sesli harfin tüm örnekleriyle eşleşen, büyük / küçük harfe duyarlı olmayan düzenli ifade.
  • c=> Normal ifadenin her eşleşmesini "c" parametresi aracılığıyla anonim bir işleve geçirir.
  • "ï ÖÄöä ËÜëüÏ "[n]"Ï ÖÄöä ËÜëüÏ" dizesindeki n. Karakteri (0 dizine eklenmiş) döndürür "ï ÖÄöä ËÜëüÏ ".charAt(n).
  • c.charCodeAt(1)%15 15'e bölündüğünde "c" harfinde (yani sesli harf) ikinci karakterin karakter kodunun geri kalanını alır.

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

Aşağıdaki aksanları birleştirmeden önce cevabım izin verilmedi (Boo-urns!) - Bu Fiddle'da daha iyi izlendi

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

Bununla birlikte, ETHproductions , .normalize()ilave 12 bayt eklenmesiyle bunun geçerli olacağını ileri sürmektedir .

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


Hayır, aksanların birleştirilmesine izin verilirse.
Adám

Aksanları birleştirmek artık yasaklanmıştır.
Adám

.normalize()Fonksiyonun sonuna ekleyerek bunu geçerli hale getirebileceğinizi düşünüyorum .
ETHproductions

Emin misiniz, @ETHproductions? Birleştirerek diacritics yasak, bunlar bir cevap görünmesini yasak olmadığını hiç ?
Shaggy

8

Perl 5, 25 bayt

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

24 bayt, artı 1 -peyerine-e

Bu, "karakterleri desteklediği sürece herhangi bir G / Ç kod sayfasını seçebilirsiniz" kuralını kullanır AEIOUaeiouÄËÏÖÜäëïöü'. Ayrıca /aregexes üzerinde bayrak kullanır , bu da neden olur\wabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789 nasıl kodlandıklarına bakılmaksızın karakterlere tam olarak atıfta bulunur .

Betiğim için seçilen G / Ç kod sayfası şudur:

 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  '

(Bu komut dosyasını sorudaki test senaryolarında test edemiyorum, çünkü gerçekten garip karakterler içeriyorlar, t .)


Grimy'e beni üç bayt kurtardığı için teşekkürler . Daha önce, s/'([a-z])'/chr 1+ord$1/giekodlama ne olursa olsun, [a-z]Perl'de özel olarak kapsanan ilginç gerçeği (kodlama ve) kullandı abcdefghijklmnopqrstuvwxyz. Daha önceki cevabım, IMO, daha ilginç, ama bu daha kısa, yani, ne halt alacağım.


1
Bunu göndermeden önce "varsayılan olarak yasaklanmış boşluklar" listesini dikkatlice kontrol ettim ve bir kod sayfası icat etmek bunlar arasında değildi. Bunun yanı sıra, özellikle "herhangi bir G / Ç kod sayfası" nın kullanılmasına davet edilen sorunun bu cevaba izin verdiği görülüyor. Ve sonra a-zhile cevabı sadece bir hile yerine aslında ilginç kılıyor. (IMO, neyse.)
msh210

3
Bu sadece bir kez komik olan bir numara, ama ilk kullanan siz olduğuna inanıyorum, bu yüzden işe yarıyor (=
Grimmy

1
Sen kullanarak 3 bayt kurtarabilecek \wyerine [a-z]yanı sıra, /ayerine /i. "/ A" değiştiricisi \wetkinse, nasıl kodlandıklarına bakılmaksızın [a-zA-Z0-9_] karakterleriyle eşleşir.
Grimmy

@Grimy, teşekkürler! Düzenleyeceğim ....
msh210


4

Japt , 29 bayt

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

Çevrimiçi deneyin!

açıklama

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
Aksanları birleştirmenin kullanılması tartışmalıdır.
Leaky Nun

Beni döv. Çözümünüz benimkinden çok daha kısa ... Aferin.
Luke

@LeakyNun Bu soru için mi yoksa genel olarak tartışmalı mı?
Dijital Travma

Bu soru için tartışmalı çünkü yorumlarda dile getirdin ama asla ele alınmadı.
Leaky Nun

@ Adám Seni 38 saniye yendi ;-)
ETHproductions

4

Javascript, 67 bayt

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

Çevrimiçi deneyin!

Tırnak işaretleri arasındaki tüm karakterleri, karşılık gelen uydurulmuş karakterle veya değiştirilmesi gereken karakter grubunda değilse eşleşmenin kendisiyle değiştirin.


3

Jöle , 36 bayt

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

Çevrimiçi deneyin!

Bu Jelly için oldukça karmaşık görünüyor!

Nasıl?

Not: Karakterler kod sayfasında değil, ancak Unicode bir bayt aralığı içinde olduklarından ordinals oluşturulması gerektiğini düşünüyorum, bu yüzden var.

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

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

Çevrimiçi deneyin!

HexDump:

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

Bu sadece vim cevabımın doğrudan çevirisidir, böylece tüm golf dillerini yenebilirim. : P



1

/// , 67 bayt

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

Çevrimiçi deneyin!

Bu, tekli tırnaklarla ( 'A') çevrili noktalı olmayan harfleri , tekli tırnaklar ( Ä) olmadan noktalı ile aynı harfle değiştirerek çalışır . Bunun tek bir değiştirilmesi şöyle görünür (golften önce):/'A'/Ä/ .

Golf iki yaygın olaylar alır //ve '/ve yedek olarak bunları kullanır.


1

Swift - 201 bayt

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

Kullanımı: g("'A'sthetik") // => Ästhetik


1
characters.map{blah blah}ve replacingOccurrences()eğlenceyi gerçekten öldür: ((
Bay Xcoder

1

APL (Dyalog) , 53 bayt

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

Çevrimiçi deneyin!

Alıntılanan sesli harflere aşağıdaki işlevi uygulamak için PCRE R eplace (RegEx'i v olarak kaydeder ) kullanır:

{ anonim işlev

' ÄËÏÖÜäëïöü'[] Dizeyi dizine ekleyin (karşılık gelen iki boşluğa dikkat edin '[):

  ⍵.Match eşleşen dize

  2⊃ ikinci harfi seç (sesli harf)

  v⍳v  dizinini bul

}


1

AWK , 99 bayt

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

Çevrimiçi deneyin!

İçinde bazı akıllı regex ile gelmeye çalıştım gensubama başarısız oldu :(


1

SOGL , 43 35 (UTF-8) bayt

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

Açıklama:

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, bunun ̈+SOGL'deki bir fonksiyon olduğunu düşünebiliriz.
Adám

Aksanları birleştirmek artık yasaklanmıştır.
Adám

1

05AB1E , 30 29 24 bayt

Emigna sayesinde -6 bayt

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

05AB1E äëïöükod sayfasındaki karakterleri rahatça içeriyor .

Çevrimiçi deneyin!

(eski kod)

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

Açıklama (eski):

ž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

Çevrimiçi deneyin!


Sen yerini alabilir ile Š.
Emigna

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

@Emigna Tekrar teşekkürler.
Okx

Ayrıca Ibaşlangıçta gerek yok :)
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)

Bu bir fonksiyon, tam bir program değil.

Okunabilirlik için biçimlendirilmiş:

import re

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

Daha fazla golf için akıllı ipuçları için @ValueInk'e teşekkürler.


Benim için koşmuyor. TypeError ile durur.
totallyhuman

@totallyhuman emin misin? Benim için çalışıyor gibi görünüyor. aİşlevi, değiştirmek istediğiniz dizeyle çağırmanız gerekir .
numbermaniac


1
Python match.__getitem__(g), Python 3.6 için yeni olan raporları gösterir , bu nedenle büyük olasılıkla başlığınızda belirtilmelidir. Ayrıca, normal ifadenizi '([AEIOUaeiou])'değiştirirseniz x[0][1], yerine bir bayt olarak değiştirip x[1]kullanın . -3-2
Değer Mürekkebi

1
Aslında, import re;a=lambda i,p="'([AEIOUaeiou])'":re.sub ...artık bir returnifadeye ihtiyaç duymadan biraz ek yükü kestiğiniz için daha da kısa !
Değer Mürekkebi

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.