「A」からÄへのコンバーター


12

現在、大量の手書き文書をスキャンし、それらを.txtファイルに変換しています。私はひどい手書き文字を持っているので.jpg- > .txtコンバータはに私のウムラウトの一部を変換し、「正常」で包まれた手紙'

仕事

以下のプログラムまたは関数を作成します。

  • 文字列が与えられます
    • 限り、任意のI / Oコードページを選択できます。
      • 文字をサポートしていますAEIOUaeiouÄËÏÖÜäëïöü'
      • 入力コードページと出力コードページは同じです。
    • 入力には(スペースの横に)コードページからの印刷可能な文字のみが含まれます。
      • 解決策は1つのみであるため、'a'e'表示されません
  • 以下のセット内のすべての文字を変換AEIOUaeiouしますÄËÏÖÜäëïöü
    • '文字で囲まれている場合にのみ:
      • 'a''e' -> äë
    • 場合文字列は、単一の文字です。
      • たとえば、'AE'まったく変更せずに、そのまま出力します。
    • from文字がその文字以外の文字でない場合、AEIOUaeiou変更されません。

注:from文字/ from文字列はの間の文字です'

テストケース

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
あなたのテストケースのすべての有効成分は、どちらかである'A''a'...私は良いテストケースを考慮していないものを。
リーキー修道女

1
あなたが例を追加することができます'w'(としてwの一つではありませんかAEIOUaeiou)?
jimmy23013

8
組み合わせdiacriticalsは持っていた未知の状態を、その後、許可されたし、次いで、禁止します。これにより、少なくとも4つの回答が無効になりました。ブー!ヒス!私は私のアップ投票をダウン投票に変更しました:(
デジタルトラウマ

1
@DigitalTraumaそれは非​​常に残念です。
ローマングラフ

4
:テストケースを追加'q'e'd'
表示名

回答:


11

JavaScript(ES6)、81 70 68バイト

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

それを試してみてください

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>


説明

  • s=> パラメータ「s」を介して入力文字列を引数として取る匿名関数。
  • s.replace(x,y) 「x」を「y」に置き換えた文字列を返します。
  • /'[aeiou]'/gi 単一引用符で囲まれた母音のすべての出現に一致する大文字と小文字を区別しない正規表現。
  • c=> パラメータ "c"を介して、正規表現の各一致を匿名関数に渡します。
  • "ï ÖÄöä ËÜëüÏ "[n]文字列「ïÖÄöäËÜëüÏ」のn番目の文字(インデックス0)を返します"ï ÖÄöä ËÜëüÏ ".charAt(n)
  • c.charCodeAt(1)%15 15で除算すると、「c」の2番目の文字(母音文字)の文字コードの残りを取得します。

代替、40 / 52 36/48バイト(35/47文字)

以下は、発音区別記号を組み合わせる前の私の答えでした(ブータン!)- このフィドルでよく見る

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

ただし、ETHproductions.normalize()、追加の12バイトを追加すると、これが有効になることを示唆しています。

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


いいえ、発音区別記号の組み合わせが許可されている場合。
アダム

分音記号の組み合わせは現在禁止されています。
アダム

.normalize()関数の最後に追加することでこれを有効にできると思います。
ETHproductions

@ETHproductionsよろしいですか?組み合わせ発音区別符号が禁止されている場合、彼らは答えに表示されてから禁止されていないすべての
シャギー

8

Perl 5、25バイト

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

24バイト、-pe代わりに1-e

これは、「文字をサポートしている限り、任意のI / Oコードページを選択できる」というルールを利用しますAEIOUaeiouÄËÏÖÜäëïöü'。また/a、正規表現のフラグも使用します。これにより\wabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789エンコード方法に関係なく、文字を正確に参照できます。

スクリプト用に選択されたI / Oコードページは次のとおりです。

 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  '

(質問のテストケースでこのスクリプトをテストすることはできません。これには、t


3バイト節約してくれたGrimyに感謝します。以前、私はs/'([a-z])'/chr 1+ord$1/gie、エンコーディングに関係なく[a-z]正確に一致するようにPerlで特別に作られた(エンコーディングおよび)興味深い事実を利用していましたabcdefghijklmnopqrstuvwxyz。私の以前の答えは、IMO、より興味深いですが、これは短いので、一体何だと思います。


1
これを投稿する前に、「デフォルトで禁止されている抜け穴」リストを注意深くチェックしましたが、コードページの発明はその中にはありませんでした。それに加えて、質問が「任意のI / Oコードページ」の使用を勧めたという事実は、この答えを許可しているようです。そして、このa-zトリックは、単なるチートではなく、答えを実際に興味深いものにします。(とにかく、IMO)
msh210

3
これは一度だけ面白いトリックの一種ですが、あなたがそれを使用する最初の人だと思うので、それは動作します(=
Grimmy

1
あなたは、使用して3つのバイトを救うことができる\w代わりの[a-z]と同様に、/a代わりに/i。「/ a」修飾子が有効な場合、\wエンコード方法に関係なく、文字[a-zA-Z0-9_]と一致します。
グリムミー

@Grimy、ありがとう!編集します
...-msh210


4

Japt、29バイト

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

オンラインでお試しください!

説明

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
分音記号の組み合わせの使用は議論の余地があります。
リーキー修道女

それに私を打つ。あなたのソリューションは私のものよりもはるかに短いです...よくやった。
ルーク

@LeakyNunこの質問に対して議論の余地があるのですか、それとも一般的なのですか?
デジタル外傷

あなたはコメントでそれを提起したが、対処されなかったため、この質問については議論の余地がある。
リーキー修道女

@Adámはあなたを38秒
倒しました

4

Javascript、67バイト

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

オンラインでお試しください!

引用符で囲まれたすべての文字を、対応するウムラウトされた文字、または変更が必要な文字のグループにない場合はマッチ自体で置き換えます。


3

ゼリー、36 バイト

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

オンラインでお試しください!

これはJellyにとってはかなり複雑なようです!

どうやって?

注:文字はコードページ上ではなく、Unicodeの1バイトの範囲内にあるため、序数から作成する必要があると思います。

œṣ⁹Ṫ¤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バイト

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

オンラインでお試しください!

Hexdump:

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

これは、すべてのゴルフ言語を打ち負かすことができるように、vimの答えを直接翻訳したものです。:P



1

///、67バイト

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

オンラインでお試しください!

これは、シングルクォート('A')で囲まれたドットなしの文字を、シングルクォート(Ä)なしで、ドットと同じ文字で置き換えることで機能します。これを1回置き換えると、次のようになります(ゴルフの前)/'A'/Ä/

ゴルフでは、2つの一般的なオカレンス、//および'/を使用し、それらを代替として使用します。


1

スイフト-201バイト

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

使用法: g("'A'sthetik") // => Ästhetik


1
characters.map{blah blah}そしてreplacingOccurrences()本当に楽しみを殺します:((
Mr. Xcoder

1

APL(Dyalog)、53バ​​イト

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

オンラインでお試しください!

PCRE Rプレースを使用(RegExをvとして保存)を使用して、引用された母音に次の関数を適用します。

{ 匿名関数

' ÄËÏÖÜäëïöü'[…次] の文字列にインデックスを付けます(に対応する2つのスペースに注意してください'[)。

  ⍵.Match 一致した文字列

  2⊃ 2番目の文字(母音)を選ぶ

  v⍳vで  インデックスを見つける

}



1

SOGL43 35(UTF-8)バイト

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

説明:

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
それ̈+はSOGLの機能だと思うかもしれません。
アダム

分音記号の組み合わせは現在禁止されています。
アダム

1

05AB1E30 29 24バイト

Emignaのおかげで-6バイト

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

05AB1Eのäëïöüコードページには便利な文字が含まれています。

オンラインでお試しください!

(旧コード)

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

説明(古い):

ž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

オンラインでお試しください!


あなたは置き換えることができŠ
エミグナ

でさらに数バイト節約できますžMDu«S''«''ì"äëïöü"Du«S:
エミグナ

@Emignaありがとうございます。
Okx

またI、最初は必要ありません:)
エミグナ

1

Pythonの3.6、98の 92文字

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

これは機能であり、完全なプログラムではありません。

読みやすいようにフォーマット:

import re

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

さらにゴルフをするための賢いヒントをくれた@ValueInkに感謝します。


私のために実行されません。TypeErrorで停止します。
完全に人間の

@totallyhumanよろしいですか?私のために働いているようです。a置き換える文字列を使用して関数を呼び出す必要があります。
numbermaniac


1
Python docsでは、match.__getitem__(g)Python 3.6の新機能が報告されているため、ヘッダーで指定する必要があります。また、正規表現をに'([AEIOUaeiou])'変更x[0][1]したx[1]場合、の-3代わりにを使用してバイトを保存します-2
バリューインク

1
実際にはimport re;a=lambda i,p="'([AEIOUaeiou])'":re.sub ...return文が不要になったことでかなりのオーバーヘッドが削減されるため、さらに短くなります。
バリューインク

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.