Ot wes thi bist uf tomis


36

私はこの単純な暗号が大好きです。人間が読むことのできる言葉を読んで、隙間を埋めるのはとても楽しいです...

Ot wes thi bist uf tomis, ot wes thi wurst uf tomis, 
ot wes thi egi uf wosdum, ot wes thi egi uf fuuloshniss, 
ot wes thi ipuch uf biloif, ot wes thi ipuch uf oncridaloty, 
ot wes thi siesun uf loght, ot wes thi siesun uf derkniss, 
ot wes thi sprong uf hupi, ot wes thi wontir uf dispeor, 
wi hed ivirythong bifuri as, wi hed nuthong bifuri as, 
wi wiri ell guong dorict tu hievin, wi wiri ell guong dorict thi uthir wey – 
on shurt, thi piroud wes su fer loki thi prisint piroud, 
thet sumi uf ots nuosoist eathurotois onsostid un ots biong riciovid, 
fur guud ur fur ivol, on thi sapirletovi digrii uf cumperosun unly.

ルールは非常に単純です:

  • 入力として一部のテキスト(ASCII文字、大文字/小文字、句読点)を受け入れます。
  • 母音ごとに、次の母音まで回転するか、最初に戻ります。
    • a => e
    • e => i
    • i => o
    • o => u
    • u => a
  • 大文字の母音は大文字のまま、小文字の母音は小文字のままです。
  • これらの変換後にテキストを出力します。
  • アクセントをサポートする必要はありません。
  • 他のすべての文字は変更しないでください。
  • 最小のバイト数で実行してください。
  • 好きな古い言語。

テストケース

It was the best of times, it was the worst of times,
it was the age of wisdom, it was the age of foolishness,
it was the epoch of belief, it was the epoch of incredulity,
it was the season of light, it was the season of darkness,
it was the spring of hope, it was the winter of despair,
we had everything before us, we had nothing before us,
we were all going direct to heaven, we were all going direct the other way –
in short, the period was so far like the present period,
that some of its noisiest authorities insisted on its being received,
for good or for evil, in the superlative degree of comparison only.

でる:

Ot wes thi bist uf tomis, ot wes thi wurst uf tomis, 
ot wes thi egi uf wosdum, ot wes thi egi uf fuuloshniss, 
ot wes thi ipuch uf biloif, ot wes thi ipuch uf oncridaloty, 
ot wes thi siesun uf loght, ot wes thi siesun uf derkniss, 
ot wes thi sprong uf hupi, ot wes thi wontir uf dispeor, 
wi hed ivirythong bifuri as, wi hed nuthong bifuri as, 
wi wiri ell guong dorict tu hievin, wi wiri ell guong dorict thi uthir wey – 
on shurt, thi piroud wes su fer loki thi prisint piroud, 
thet sumi uf ots nuosoist eathurotois onsostid un ots biong riciovid, 
fur guud ur fur ivol, on thi sapirletovi digrii uf cumperosun unly.

に:

The quick brown fox jumps over the lazy dog.

でる:

Thi qaock bruwn fux jamps uvir thi lezy dug.

に:

Home is where the heart is.

でる:

Humi os whiri thi hiert os.

に:

Boaty McBoatface

でる:

Buety McBuetfeci

に:

AEIOUaeiou

でる:

EIOUAeioua

に:

Programming Puzzles And Code Golf

でる:

Prugremmong Pazzlis End Cudi Gulf


4
うーん 古い英語?
iammax

10
それでもBeowulfより読みやすい。
スミート

4
私にはキウイ翻訳者のように見えます。
マグー

1
「ivol」への暗号化が「悪」と同じように効果的に発音されるのが好きです。
エンリコボルバ

回答:



22

MS-SQL、51バイト

SQL 2017以降で動作します:

SELECT TRANSLATE(v,'AEIOUaeiou','EIOUAeioua')FROM t

新しい関数TRANSLATEは個々の文字の置換を実行するため、この課題に最適です。

入力は、IOルールに従って、varchar列vを持つ既存のテーブルtを介して行われます

この場合、大文字と小文字を区別する照合を使用して、大文字と小文字を区別するサーバーで実行するか、COLLATEキーワード(文字の合計にはカウントされません)を使用して、テーブルを作成する必要があります。

CREATE TABLE t(v varchar(max) COLLATE Latin1_General_CS_AS)

編集:SSMSは、「テキストへの結果」ウィンドウで結果を返すときに、上記の長い引用符を切り捨てる場合があります。これはクライアントの設定であり、私のプログラムのバグではありません

修正するにはTools > Options > Query Results > SQL Server > Results to Text、「各列に表示される最大文字数」に移動して増やします。


1
SQLがこれに対しても競争力に近いことに本当にショックを受けています。また、それはクールな機能です!教えてくれてありがとう:)
ニックハートリー

@NicHartleyええ、彼らは各バージョンにいくつかの便利な機能を追加しているようです。REPLACEいくつかのトリックにも使用できREPLACE(TRANSLATE(v,'1234567890','xxxxxxxxxx'),'x','')ます。たとえば、文字列からすべての数字を削除します。まだ長いですが、ネストされた10個よりはるかに短いですREPLACE
BradC


14

Haskell、52バイト

(a:b)!c|a/=c=b!c|1>0=b!!0
a!b=b
map("aeiouaAEIOUA"!)

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

Lynn !!0は、それよりも短いことを指摘することで2バイト節約しましたhead

説明

Haskellでコーディングしたことがない場合、これはおそらく不吉な山のように見えるでしょう。最初にそれをアンゴルフし、それから分解しましょう:

(a:b)!c
 |   a/=c   = b!c
 |otherwise = b!!0
a!b=b
map("aeiouaAEIOUA"!)

まず!、文字列sと文字を受け取る関数がありますc。最初のパターンマッチキャッチは、文字列が空でない場合に入力を受け入れます。文字列が空でない場合、最初の文字をと比較しcます。最初の文字が等しくない場合、cそれを投げて!、文字列の残りとで再度呼び出しますc。等しい場合、文字列の2番目の文字を返します。

次のパターンマッチは、他のすべての場合、つまり文字列が空の場合に文字列をキャッチします。この場合、戻るだけcです。

全体として、この関数は文字cと文字列sを取り、cin が最初に出現した後に文字を返しますs。これを渡すとaeiouaAEIOUA、単一の文字で暗号化が実行されます。関数全体を作成するには、これを文字列全体にマッピングする必要があります。


12

網膜10 9 8バイト

T`uo`vVA

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

ニールのおかげで1バイト節約できました!そして、Martinに感謝します!

Retinaの新しいバージョンには母音クラスがあり、結果が少し短くなります。音訳では「その他」のクラスも使用します。だから、to「aeiouAEIOUA」のようなクラスのルックスながら、from「uaeiouAEIOUA」のようなクラスのルックス

uへの2番目のマッピングは既ににマップさAれているため、実行されないため、これは問題を引き起こしません。ua


9バイト:T`_o`uvUV
ニール

これは非常に短い答えです!
-AJFaraday

@ニール賢い、ありがとう!_fromセットに入れることは文字通りそれを扱うと思ったが、それはそれをしないように見える。
FryAmTheEggman

3
もう1つは剃ることができますが、残念ながらStaxを結び付けることはできません:tio.run
Martin Ender

@MartinEnderありがとう!それは巧妙なセットアップであり、2つを混ぜ合わせます。私はYまだあまり使用していないので、明日それを試してみます。
FryAmTheEggman

9

Perl 5 + -p、24 23バイト

y;AEIOUaeiou;EIOUAeioua

オンラインで試す

@DomHastingsのおかげで-1バイト


1
-pもう+1としてカウントされず、代わりにこの答えは「Perl 5 + -p」にあると考えます。
エリックアウトゴルファー

1
これはまた、sedの中で動作します
KritixiのLithos

1
;区切り文字として使用すると、1バイト節約できます!
ドムヘイスティングス

更新、@ Cowsquackはもうありません
ナウエルフイウル

6

Python 3、62バイト

lambda x:x.translate(str.maketrans('aeiouAEIOU','eiouaEIOUA'))

strの静的str.maketransメソッドを使用して変換テーブル(辞書)を作成します。関連する文字を目的の文字に翻訳します。


これはどこでI / Oを実行しますか?
reinierpost

@reinierpostこれは関数です。入力はxパラメータを介して行われます。Pythonでは、ラムダ関数はreturnステートメントを必要としません。
-mypetlion

6

C、85 76 67 65 64バイト

f(char*c){for(;*c;)putchar(1[index("AEIOUAaeioua",*c++)?:c-2]);}

Kevin CruijssenのJavaの回答のポート。こちらからオンラインでお試しください。

おかげケビンCruijssen9バイトをゴルフして、11バイトをゴルフしてくれたChristoph、1バイトをゴルフしてくれたceilingcatに感謝します。

ゴルフされていないバージョン:

f(char* c) { // function taking a char array as parameter and implicitly returning an unused int
    for(; *c ;) // loop over the input
        putchar(1 [index("AEIOUAaeioua", * c++) ?: c-2]); // find the first pointer to the current char in the vowels string, NULL if not present; if it's not NULL, print the next vowel, otherwise just print the char
}

1
gccの標準拡張はないようです。私はPHPからそれを知っていて、単にそれを試しました。
クリストフ

1
@Christoph再帰の使用が好きですが、末尾にを出力できるかどうかはわかりません\0。また、これはclangでコンパイルされた場合は機能しません:tio.run
## S9ZNzknMS ///

1
@Christoph:未定義の動作がどこにあるのか興味があったので、clangバージョンをデバッグしました。 const char *res = strchr("AEIOU...", 0)文字列リテラルのターミネータへのポインタを返します。 putchar(res[1])文字列リテラルの終わりを超えて読み取ります。gccでは、どうやら別の0バイトが見つかり、動作するように見えますが、clangでは73 'I'(おそらくmainの文字列リテラル「It was ...」から取得しますが、asmはチェックしませんでした)。したがってputchar、0は返されず*c++、マップされていないページを読み取ると最終的にセグメンテーション違反が発生します。
ピーター

2
@PeterCordesええ、私は疑いを持ってここでそれについて知りました。とにかくここでさらに2バイト節約されましたf(char*c){for(;*c;)putchar(1[strchr("AEIOUAaeioua",*c++)?:c-2]);}。今のところこれで終わりだと思います。
クリストフ

1
そのためほかの可換性の@Rogem、 a[b]==*(a+b)==*(b+a)==b[a]。したがって1[...]==(...)[1]
天井猫



5

Pythonの279の 68 67バイト

@ArnoldPalmerのおかげで-1バイト

V='uaeiouAEIOUA'
print''.join((V[1:]+c)[V.find(c)]for c in input())

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


67バイト。また、通知が殺到した場合は申し訳ありませんが、しばらくコメントを投稿しておらず、その方法を忘れていました。
アーノルドパーマー

@ArnoldPalmerありがとう!それは大丈夫です、私は離れていて、彼らはすべて私を逃しました:D
Dead Possum





4

Java 10、97 87バイト

s->{for(var c:s){var t="AEIOUAaeioua"+c+c;System.out.print(t.charAt(t.indexOf(c)+1));}}

@ArnauldのJavaScriptの回答(彼の60バイトバージョン)に触発されてから-10バイト。

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

説明:

s->{                         // Method with character-array parameter and no return-type
  for(var c:s){              //  Loop over the input characters
    var t="AEIOUAaeioua"     //  Temp-String containing the order of vowels 
                             //  (including additional 'A' and 'a'),
          +c+c;              //  appended with two times the current character
    System.out.print(        //  Print:
      t.charAt(              //   The character in String `t` at index:
         t.indexOf(c)+1));}} //    The (first) index of the current character in `t` + 1

4

05AB1E14 13 11バイト

žMDÀ‡žMuDÀ‡

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


1
あなたは、単に複数行の文字列として入力を取ることによって、2つのバイトを保存することができ、そうする必要はありません|»オンラインそれを試してみてください:11バイト
ケビンCruijssen

@KevinCruijssenありがとう!これは最近の05AB1Eリリースで修正されたものではありませんか?
カルド

わからない 今年の初め頃から05AB1Eのみを開始しました。知りたい場合は、機能が追加されたときに05AB1Eチャットで @Adnanに尋ねることができます。
ケビンCruijssen


3

APL + WIN、55バイト

入力文字列のプロンプト:

i←(10≥n←'AEIOUaeiou'⍳s)/⍳⍴s←⎕⋄s[i]←'EIOUAeioua'[n~11]⋄s

3

おたふく風邪、38バイト

R T W $TR(T,"AEIOUaeiou","EIOUAeioua")

Mumpsは通常、キャリッジリターンを追加しません。入力から出力を分離する必要性が見られなかったため、最初の実行では少し奇妙に見えます。たとえば、最後のテストケースの出力は次のようになります。

Programming Puzzles And Code GolfPrugremmong Pazzlis End Cudi Gulf

キャリッジリターンを追加する場合は、次のように2バイトを追加します。

R T W !,$TR(T,"AEIOUaeiou","EIOUAeioua")

3

Vim + tpope / vim-abolish、30バイト

:%S/{a,e,i,o,u}/{e,i,o,u,a}/g<cr>

代替ソリューション、また30バイト:

Oe,i,o,u<esc>|D:%s/{a,<C-r>"}/{<C-r>",a}/g

metaによると、vimの回答はバイトペナルティなしでプラグインを使用できます。これはvimの答えではなく、vim +廃止の答えです。


廃止は非常に便利なプラグインです。READMEのこのセクションでは、このコマンド(Subvertコマンド)の仕組みについて詳しく説明しています。


3

CJam29 19バイト

q"aeioua"_eu+_1m<er

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

@Peter Taylorのおかげで-10バイト

説明:

q                       # take all input
 "aeioua"               # push vowel pairs
         _eu            # duplicate, uppercase
            +_          # concatenate, duplicate again
              1m<       # rotate left by 1
                 er     # transliterate

質問は入力について具体的なものではありませんが、入力を受け取るためqではなく、おそらく使用すべきだと思いますl。最初のテストケースは複数行のようです。また、あなたは短縮することができます"eioua"_1m<。実際、さらに進んで、これをゴルフにかけることができますq"aeioua"_eu+_1m<er
ピーターテイラー


2

PHP、90バイト

オンラインで試す

コード

function f($s){echo strtr($s,array_combine(str_split(UuAaEeIiOo),str_split(AaEeIiOoUu)));}

説明

function f($s){
 echo strtr(
       $s,                          #The string to operate
       array_combine(               #combining arrays
            str_split(UuAaEeIiOo),  #splitting this strings
            str_split(AaEeIiOoUu))
              # With array combine php creates an array like
              # ["U"=>"A", "a"=>"e"....and so on]
              # strtr can replace strings in a string, using an array with 
              # the values to replace and with what replace each value.
 );
}

php -r使用して実行した場合は75バイト$argv

<?=strtr($argv,array_combine(str_split(UuAaEeIiOo),str_split(AaEeIiOoUu)));



2

PHP、38バイト

非常に単純で、あまり創造的ではstrtrなく、母音を置き換えるために使用します。

<?=strtr($argn,aeiouAEIOU,eiouaEIOUA);

で実行するecho '<input>' | php -nF <filename>、オンラインで試してください


これは、入力が事前定義された変数に割り当てられているとは想定していませんargnか?その場合、それは無効です。文字列を引数として渡し、$argv1]代わりに使用する必要があります。
シャギー

2
@Shaggyいいえ、-Fフラグを付けて実行すると、コマンドラインの入力で機能します。オプションに関するPHPドキュメントから:-F --process-file PHP file to execute for every input line. Added in PHP 5.Try it online変数の定義は、一部の人々がPHPをローカルにインストールしておらず-F、TIOでフラグを機能させることができなかったからです。
ダビッド

1
ありがとう、@ David-それは今日のPHPの「新しい」ものです:)
シャギー

2

q / kdb +、36 33バイト

溶液:

{(v,2#x)1+(v:"aeiouaAEIOUA")?x}@'

例:

q){(v,2#x)1+(v:"aeiouaAEIOUA")?x}@'"AEIOUaeiou"
"EIOUAeioua
q){(v,2#x)1+(v:"aeiouaAEIOUA")?x}@'"Programming Puzzles And Code Golf"
"Prugremmong Pazzlis End Cudi Gulf"

説明:

母音のインデックスを計算し、次の母音にプッシュするインデックスを追加して、インデックスを作成します。それでもこのアプローチは大幅に改善できると思います...

{(v,2#x)1+(v:"aeiouaAEIOUA")?x}@' / the solution
{                             }@' / apply lambda to each character of input
                            ?x    / look up x in...
          (                )      / do together
             "aeiouaAEIOUA"       / lookup list
           v:                     / save as v
        1+                        / add one
 (     )                          / do together
    2#x                           / take 2 copies of x
  v,                              / prepend v

ボーナス:

私の古い** 36 byte(())ソリューションは非常にクールだと思いますが、リストを徹底的に調べて競争力を高める必要があります。

ssr/[;"uoiea%UOIEA%";"%uoiea%UOIEA"]

2

、35バイト

UT≔AUOIEAauoieaσF¹¹⊞υ➙§σ⊕ι§σι▷SR⟦Sυ

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

素朴な方法。

説明:

UT                                         Set trim option to on, so output won't be a rectangle
    ≔AUOIEAauoieaσ                          Assign "AUIOEAauioea" to s
                   F¹¹                      For i (ι) from 0 to 10
                       ⊞υ                   Push to u (initially empty list)
                          ➙                 Rule of:
                            §σ⊕ι            S[i + 1]
                                 §σι         to S[i]. This is so a->A gets overwriteen by a->e
                                    ▷SR⟦Sυ  Replace input as string using u (now a list of rules)

2

PHP、76バイト。

$s=strtr($s,array_combine(str_split("aeiouAEIOU"),str_split("eiouaEIOUA")));

見てみな!

これは、PHPでこれを行うことができた最短の時間でした。

$s = //overwrite $s variable ($s should be a defined string or input)
    strtr(  //strtr replaces key => value pairs from arrays in a string
        $s, //the string we are converting
        array_combine( //create an array with key value pairs, key should be original vowel letter and value should be it's replacement
            str_split("aeiouAEIOU") //turn vowels (lower and upper) into an array
            ,str_split("eiouaEIOUA") //turn vowel replacements into an array
        )
    );
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.