韻を繰り返し、母音でループする


15

母音韻:リンゴとバナナ

すべての母音がランダムな母音に置き換えられるたびに同じテキストを何度も繰り返す伝統的な子供の歌がありますが、現在のスタンザ全体で一定です。

チャレンジ

目的は、入力テキストに対してこのような変換を実行する最短のコードを提案することです。

ルール

  1. 韻は、はっきりした母音が存在するのと同じ回数だけ印刷する必要があります。
  2. 各印刷は改行で区切る必要があります(プラットフォーム固有のコンボ\nとコンボ\rは受け入れられます)。
  3. 繰り返しのi場合、各母音をi元のテキストのth番目の別個の母音に置き換えます。
  4. 入力テキストは、印刷可能なASCII文字(範囲[32, 126]
  5. 入力には埋め込み改行が含まれません。
  6. 母音文字のみが影響を受ける必要があり、その他は入力として正確に出力される必要があります。
  7. 母音文字のみがカウントされます。鼻の母音は、母音のように聞こえますが(フランス語の"Tintin"のように)、単一の母音として処理してはなりません。
  8. 出力では大文字と小文字が区別されますが、位置は異なります(大文字の母音の置換は大文字の置換母音で行われます)
  9. 大文字の母音は、小文字の母音と区別されません(つまり、a<=> A
  10. 連続した母音は常に別々に考慮されます(つまりBoatBootとの両方を生成しますBaat
  11. 文字yは母音または子音(英語を話しているように)を表すため、母音または子音として扱うことは許可されますが、答えはy母音として扱うかどうかを明示的に指定する必要があります。

例:

こんにちは世界

Hello world!

与える:

Helle werld!
Hollo world!

y母音として処理された元のフランス語のテキスト(翻訳済み)からの抜粋:

An elephant that was rambling all gently in the woods...

与える:

An alaphant that was ramblang all gantla an tha waads...
En elephent thet wes rembleng ell gentle en the weeds...
In iliphint thit wis rimbling ill gintli in thi wiids...
Yn ylyphynt thyt wys rymblyng yll gyntly yn thy wyyds...
On olophont thot wos romblong oll gontlo on tho woods...

先頭の大文字の母音の動作に注意してください。大文字と小文字はインデックスに保持されます(ルール8および9)。

母音なしの例

次のような母音を含まない入力

lgn@hst:~$ rm -rf ./* ~ /

出力を生成しないか、単一の改行を生成する必要があります。

単一母音入力

単一の母音を含む入力はそのまま出力されます。

Dad sat at a car and saw a fat bat.

与える:

Dad sat at a car and saw a fat bat.

これはなので、最少のバイトカウントコードが勝ちます(永遠のPPCG栄光以外はありません)!

回答:


6

網膜、45バイト

~(K`A\EI\OU
L$`\\?(.)
./$1/i&$*\T`Vv`5*$&$L$&

オンラインでお試しください!y母音としてはカウントされません。説明:

K`A\EI\OU

テキストをリテラル文字列で置き換えますA\EI\OU

L$`\\?(.)

オプションでバックスラッシュを前に付けた各文字に一致します。

./$1/i&$*\T`Vv`5*$&$L$&

各文字のRetinaコードの行を出力します。

~(

元の入力を使用して、生成されたコード(以下に示す)を評価します。これ.により、コードは(最終)バッファーを出力しません。これ/<vowel>/i&により、入力に特定の母音が含まれる場合にのみ、行の残りが実行されます(大文字と小文字を区別しません)。これ*により、行の結果が無視され、次の母音をテストできます。これ\により、結果は無視される前に独自の行に出力されます。T`Vv`AAAAAa大文字transliterates Vにowels AAAAAsおよびすべて小文字vにowels a\AASCII 07(BEL)を参照のエスケープですが、EOおよびo(ビルトインされている彼らのリテラル値を与えるためにエスケープする必要のある文字クラスe 文字クラスではありませんが、幸いにもエスケープではありません。)

./A/i&*\T`Vv`AAAAAa
./E/i&*\T`Vv`\E\E\E\E\E\e
./I/i&*\T`Vv`IIIIIi
./O/i&*\T`Vv`\O\O\O\O\O\o
./U/i&*\T`Vv`UUUUUu

Mmh、自己生成コード。私はRetinaをよく知りませんが、それは印象的です!
joH1

@ joH1まあ、私にとって印象的なビットは、それが60バイトを節約したことです!
ニール


4

bash、96バイト

2つの等しい長さのソリューション:

v=aeiouAEIOU;for x in `grep -o [$v]<<<$1|sed 's/./\L&&&&&\U&/'|awk !a[\\$0]++`;{ tr $v $x<<<$1;}
v=aeiouAEIOU;for x in `tr -cd $v<<<$1|sed 's/./\L&&&&&\U&\n/g'|awk !a[\\$0]++`;{ tr $v $x<<<$1;}

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

入力をコマンドライン引数として受け取り、STDOUTに出力します。


4

05AB1E(レガシー)、19 バイト

(間接的に)Kevinのおかげで1バイト節約されました(結合するのではなく、ループ内で直接印刷します。レガシーバージョンでのみ動作します)。

lžMÃÙεžMDu«s5×Du«‡=

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

Elixir rewriteを使用して、20バイト

lžMÃÙεžMDu«s5×Du«‡}»

オンラインでお試しください!(なしy)| オンラインでお試しください!(とyžM置き換えられるžO-同じレガシーバージョンに適用されます)

使い方

lžMÃÙεžMDu«s5×Du«‡}»     Full program. Example: "Hello"
l                        Convert the input to lowercase. "Hello" –> "hello"
 žMÃ                     Keep only lowercase vowels. "hello" –> "eo"
    Ù                    Remove duplicates. "eo" –> "eo"
     ε            }      For each of the characters (example with "e"):
      žMDu«              Yield "aeiouAEIOU"
           s5×           Swap, and repeat the current char 5 times. "e" –> "eeeee"
              Du«        Duplicate, uppercase and merge. "eeeee" –> "eeeeeEEEE"
                 ‡       Transliteration. For each item in B, replace it in A with
                         the corresponding item in C.
                   »     Join on newlines.

私が用意した21バイトの答えよりも短い、いい答えです。マッピングの代わりにループして印刷することで、もう1バイトをゴルフできます19バイト。TIO は、の代わりにをy使用する必要があります。65
ケビンクルーッセン

@KevinCruijssen編集、ありがとう!y私が答えたとき-vowelバージョン、私は間違ったTIOリンクをコピー:| ...
ミスターXcoder

ああ、今iでは、コードになぜ含まれているのかがわかりました。Expectedは空の出力ですが、実際には入力自体を出力します。:(
Kevin Cruijssen

1
@KevinCruijssen 20バイトで動作するため、2つ目のリンクをロールバックして修正しました。
氏Xcoder

4

JAPT v2.0a0 -R24の 22バイト

扱いy母音として。\ytoの両方の出現を変更\vして、子音として扱います。

v f\y â £r\y_Xc^H*ZøZu

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


説明

v                          :Lowercase
   \y                      :RegEx /[aeiouy]/gi (\v is /[aeiou]/gi)
  f                        :Get all matches as an array
      â                    :Deduplicate
        £                  :Map each X
         r\y               :  Replace all matches of the RegEx above in the input
             _             :  Pass matches through a function as Z
              Xc^          :    XOR the character code of X with
                 H*        :     32 multiplied by
                   Zø      :     Does Z contain
                     Zu    :      Uppercase Z
                           :Implicitly join with newlines and output

3

ゼリー 23 20 18  17 バイト

-2 Erik the Outgolferに感謝

ØcŒHZx5fƇðØc,yð€Y

y母音として扱うには、両方cのsをysに置き換えます。

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

どうやって?

ØcŒHZx5fƇðØc,yð€Y - Link: list of characters, S
Øc                - vowels -> "AEIOUaeiou"
  ŒH              - split in half -> ["AEIOU", "aeiou"]
    Z             - transpose -> ["Aa", "Ee", "Ii", "Oo", "Uu"]
     x5           - times 5 -> ["AAAAAaaaaa", "EEEEEeeeee", "IIIIIiiiii", "OOOOOooooo", "UUUUUuuuuu"]
        Ƈ         - filter keep if:
       f          -   filter keep only -> those of X which have required vowels
                  -                       ...i.e. if S = "blah" then ["AAAAAaaaaa"]
         ð    ð€  - dyadic chain for €ach:
          Øc      -   vowels -> "AEIOUaeiou"
            ,     -   pair       e.g. ["AEIOUaeiou","AAAAAaaaaa"]
             y    -   translate  e.g. swap A for A, E for A, ...
                Y - join with newlines

18バイト(自明)(ż/ペアではZ、左のモナドでペアになっていない2つのダイアドが暗黙的に引数を中間に持っている)
エリックアウトゴルファー

おかげで(Z> _ <)、TIOセッションで何が起こっていたかはわかりðませんが、冗長性を削除することはできませんでした。再起動が修正されました。
ジョナサンアラン

TBH、私も実際に修正しましたx€xしかし、あなたは私を忍者しました。:P
エリック・ザ・アウトゴルファー

3

、229のバイト

y非母音の取得

func[s][v: charset"aoeiu"w: charset"AOEIU"p: copy""parse s[any[[copy c[v | w](if not find p c[append p c lowercase c
parse s[any[[copy n to[v | w | end]](prin n)opt[v(prin c)|[w(prin uppercase copy c)]| skip]]]print""])]| skip]]]

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

少し読みやすい:

f: func [ s ] [
    v: charset "aoeiu"
    w: charset "AOEIU"
    p: copy ""
    parse s[ 
        any [
            [ copy c [ v | w ]
                ( if not find p c [ 
                    append p c
                    lowercase c
                    parse s [
                        any [
                            [ copy n to [ v | w | end ] ]
                                 ( prin n )
                            opt [ v ( prin c )
                                | [ w ( prin uppercase copy c ) ]
                                | skip
                                ]
                            ] 
                        ]
                    print ""
                ] )
            ]
            | skip
        ]
    ]
]



2

JavaScript(Node.js)、99バイト

御Treat走 y 子音として。

s=>(g=F=>Buffer(s).map(c=>2130466>>c&c>64?F(c):c)+`
`)(v=>g[v&=31]||(g[v]=S+=g(c=>c&96|v)),S='')&&S

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

コメント済み

s => (                   // s = input string
  g = F =>               // g = helper function taking a callback function F
    Buffer(s)            // turn s into a Buffer
    .map(c =>            // for each ASCII code c in s:
      2130466            //   2130466 is a vowel bitmask: 1000001000001000100010
                         //                               u     o     i   e   a
      >> c               //   the ECMAScript specification enforces that the shiftCount is
                         //   the result of masking out all but the least significant 5 bits
      & c > 64           //   also make sure to ignore non-letter characters
      ?                  //   if a vowel is identified:
        F(c)             //     invoke F with c
      :                  //   else:
        c                //     just yield c
    ) + `\n`             // end of map(); coerce back to a string and append a newline
  )(v =>                 // invoke g with a callback that takes v:
    g[v &= 31] || (      //   unless this vowel has already been encountered:
      g[v] =             //     mark it as encountered
      S +=               //     and append to the output string S
      g(                 //     the result of another call to g:
        c => c & 96 | v  //       where vowels are replaced with v, using the original case
      )                  //     end of inner call to g
    ),                   //
    S = ''               //   start with S = ''
  ) && S                 // end of outer call to g; return S

2

Java 10、196 188バイト

s->{var d=new int[99];for(var c:s.toUpperCase().replaceAll("[^AEIOU]","").toCharArray())if(d[c]++<1)System.out.println(s.replaceAll("[AEIOU]",c+"").replaceAll("[aeiou]",(char)(c+32)+""));}

@ joH1のおかげで-8バイト。

yバイトを節約するための母音なし。

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

説明:

s->{                       // Method with String parameter and no return-type
  var d=new int[99];       //  Integer-array indicating which vowels we've already output
  for(var c:s.toUpperCase()//  Convert the input to uppercase
            .replaceAll("[^AEIOU]","")
                           //  Remove all non-vowels
            .toCharArray())//  Convert it to a character array)
                           //  And loop over those vowel-characters
    if(d[c]++              //   Increase the vowel-count by 1
             <1)           //   And if it was 0 this iteration:
      System.out.println(  //    Print with trailing newline:
        s                  //     The input,
         .replaceAll("[AEIOU]",c+"")
                           //     with every uppercase vowel replace with the current vowel
         .replaceAll("[aeiou]",(char)(c+32)+""));}
                           //     and every lowercase vowel replaced as well

vループ内の変数のインライン化による188バイト
joH1

@ joH1ありがとう、どうやってそれを見逃したのかわからない..
ケビン・クルーッセン



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