重复韵律并在元音上循环


15

元音押韵:苹果和香蕉

有一首传统的儿童歌曲,一遍又一遍地重复相同的文本,只有每次将每个元音都替换为随机的元音,但在当前节中保持不变。

挑战

目的是提出对输入文本执行这种转换的最短代码。

规则

  1. 您必须将韵母打印多次,因为其中有不同的元音。
  2. 每个打印件必须以换行符分隔(接受\n和的特定于平台的组合\r)。
  3. 为了进行迭代i,请用i原始文本中的第一个不同的元音替换每个元音。
  4. 输入文本是一系列可打印的ASCII字符(范围[32, 126]
  5. 输入将不包含嵌入式换行符。
  6. 仅元音字符必须受到影响,其他元音必须完全作为输入输出。
  7. 只有元音字符才算:鼻元音,虽然听起来像元音(如法语“ Tintin”),但不能作为单个元音处理。
  8. 大小写对于输出很重要,但是是位置性的(用大写替换元音替换大写元音)
  9. 大写元音与小写元音没有区别(即a<=> A
  10. 连续元音总是分开考虑的(即,Boat产生BootBaat
  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荣耀)!

Answers:


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大写字母音译Vowels到AAAAAS和所有小写vowels来a\A是一个转义字符,它引用ASCII 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

嗯,自生成代码。我不太了解Retina,但这令人印象深刻!
joH1

@ joH1对我来说,令人印象深刻的是它节省了60个字节!
尼尔


4

bash,96个字节

两个等长解决方案:

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(间接地)节省了一个字节(直接在循环内打印而不是加入,仅适用于旧版)。

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

在线尝试!

使用Elixir重写,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字节答案短。您可以通过循环和打印而不是映射来再打一个字节:19个字节。您的TIO y也应使用6而不是5btw。
凯文·克鲁伊森

@KevinCruijssen编辑,谢谢!关于- y元音版本,当我回答:| ...时,我不小心复制了错误的TIO链接:
Xcoder先生,18年

嗯,现在我又知道了为什么要i在代码中加上..对于没有元音的输入,您的答案将失败。预期为空输出,但实际上会打印输出本身。.
::

1
@KevinCruijssen 20人的作品,所以我回滚并修复了第二个链接。
Xcoder先生,

4

Japt v2.0a0 -R24 22个字节

黄柏y为元音。更改两次的\y出现\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

要将s y替换为cs,将其视为元音y

在线尝试!

怎么样?

Ø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,两个成对在一行中,其中两个成对在其中左对不成对,则隐含中间的参数)
Erik the Outgolfer

谢谢(Z> _ <),不确定我的TIO会话是怎么回事,但是删除冗余项ð却没有用;重新启动固定。
乔纳森·艾伦,

TBH,我实际上也固定了x€x但您忍了我。:P
暴民埃里克(Erik the Outgolfer)

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
        ]
    ]
]

3

[R 138,129个字节

function(x,U=utf8ToInt,a=U(V<-'aeiouAEIOU'))for(i in (which(a%in%U(x))-1)%%5)cat(chartr(V,intToUtf8(rep(a[i+c(1,6)],e=5)),x),'
')

在线尝试!

  • y 不算元音

2

蟒蛇,129 119 112字节

import re
f=lambda s:'\n'.join(r('[AEIOU]',v.upper(),r('[aeiou]',v,s))for v in'aeiou'if v in s.lower());r=re.sub

在线尝试!

不治疗 ÿ 作为元音。

-7个字节,感谢@ Mr.Xcoder


很高兴看到您可以使用它,并且打了一下高尔夫球!尼斯的工作
joH1


2

JavaScript(Node.js),99字节

对待 ÿ 作为辅音。

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)+""));}

-8个字节,感谢@ joH1

不带 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谢谢,不知道如何我错过了..
凯文Cruijssen



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.