你知道你的“ KVZ”吗?


23

概念

您可以通过哪些方式加扰英文字母,以便仍可以在不破坏音调的情况下将其演唱到Twinkle Twinkle Little Star音乐中?

规则

交换

让我们假设默认情况下可以自由交换以下每个集合中包含的字母而不会破坏音调:

  • {A,J,K}
  • {B,C,D,E,G,P,T,V,Z}
  • {I,Y}
  • {Q,U}
  • {S,X,F}
  • {M,N}
  • 因此,H,L,O,R和W锁定在适当的位置

输出量

程序需要以任何顺序输出包含完整英文字母的单个RANDOM字符串(或字符列表),前提是该顺序满足上述条件。您应该没有办法预测程序将输出哪个字符串(如果忽略种子),这意味着您不能仅仅对其进行硬编码。

您的程序必须有一定的概率(不一定是统一的)生成9!3!3!2!2!2!=104509440输出。

关于间距,定界符或大小写没有特定的格式限制,只是保持一致。

目标

最小字节获胜!

例子:

  • KCDBPSVHIAJLMNOZQRXGUEWFYT
  • A,G,Z,V,P,X,C,H,Y,K,J,L,N,M,O,T,U,R,S,D,Q,B,W,F,I, Ë
  • KVTDCFBHIJALNMOPURSZQGWXYE
  • jcdebxthikalnmogursvq pwfyz
  • ABCDEFGHIJKLMNOPQRSTUVWXYZ

非示例:

  • HLWROABCDEFZXYGIJKMNPQTSVU

概念验证:(Python3,529字节)

import random
g1 = ['A', 'J', 'K']
g2 = ['B', 'C', 'D', 'E', 'G', 'P', 'T', 'V', 'Z']
g3 = ['I', 'Y']
g4 = ['Q', 'U']
g5 = ['S', 'X', 'F']
g6 = ['M', 'N']
random.shuffle(g1)
random.shuffle(g2)
random.shuffle(g3)
random.shuffle(g4)
random.shuffle(g5)
random.shuffle(g6)
print(g1[0] + g2[0] + g2[1] + g2[2] + g2[3] + g5[0] + g2[4] + 'H' + g3[0] + g1[1] + g1[2] + 'L' + g6[0] + g6[1] + 'O' + g2[5] + g4[0] + 'R' + g5[1] + g2[6] + g4[1] + g2[7] + 'W' + g5[2] + g3[1] + g2[8])

5
不应Z“锁定在位”,不与其他人押韵吗?
毛茸茸的

3
我想取决于你来自哪里。如果您说“ zed”,则将其取出是有意义的,否则,如果您说“ zee”,则将其留在里面。最终,其余部分取决于您自己。它们应该是与严格规则相对的指导方针和起点:)
面包王

3
均匀随机或具有非零概率的每种可能性,还是其他?
jimmy23013

8
@PeterTaylor我认为这样做的目的是可以轻松地在乐曲中间交换组中的成员,同时保持原音的节奏和节奏-因此,尽管他们有节奏,但W是3个音节,而U仅是1,这将改变歌曲的节奏。

2
对于那些像我一样不知道问题在说什么的人:en.wikipedia.org/wiki/Alphabet_song
anatolyg

Answers:


6

05AB1E,28 个字节

A.•¬=©ƶÓÄûkTVã”ØζÞ•Dás#€.rJ‡

输出为单个小写字符串。

n

说明:

A                    # (a) Push the lowercase alphabet
 .•¬=©ƶÓÄûkTVã”ØζÞ•  # Push compressed string "ajk bcdegptvz iy qu sxf mn"
  Dá                 # (b) Duplicate it, and only keep the letters (removing the spaces)
    s#               # Swap to get the string again, and split it by spaces
      €.r            # Shuffle each substring randomly
         J           # (c) Join it back together to a single string
                    # Transliterate all characters from (b) to (c) in string (a)
                     # (and output the result implicitly)

看到这个05AB1E尖矿(部分如何压缩字符串不是字典的一部分吗?理解为什么.•¬=©ƶÓÄûkTVã”ØζÞ•"ajk bcdegptvz iy qu sxf mn"


7

Python 3中140个 133 124 123字节

d=*map(set,'AJK BCDEGPTVZ IY QU SXF MN H L O R W'.split()),
print([d[int(c,16)].pop()for c in'0111141620075581394131a421'])

在线尝试!

-1字节,感谢Jo King


Python 2中174个 170 158字节

from random import*
s=''
for c in'abbbbebHcaaLffObdRebdbWecb':s+=choice(list(set(('AJK BCDEGPTVZ IY QU SXF MN '+c).split()['abcdef'.find(c)])-set(s)))
print s

在线尝试!



3

Pyth59 57 56字节

hMeD,Vs.SMJc"ajk bcdegptvz iy qu fsx mn h l o r w"dxLGsJ

在线尝试!

输出是小写字母的数组。

hMeD,Vs.SMJc"ajk bcdegptvz iy qu fsx mn h l o r w"dxLGsJ   Implicit: d=" ", G=<lowercase alphabet>
          Jc"ajk bcdegptvz iy qu fsx mn h l o r w"d        Chop the grouping string on spaces, store in J
                                                      sJ   Concatenate J into single string
                                                   xLG     Find the index of each letter in grouping string in the unaltered alphabet
       .SMJ                                                Shuffle each group in J
      s                                                    Concatenate into a single string
    ,V                                                     Pair the shuffled string with their 'correct' positions in the alphabet
  eD                                                       Order the pairs by the derived positions (last element of each pair)
hM                                                         Keep the letter from each pair (the first element)
                                                           Implicit print


3

Perl 6,76个字节

{my@a='A'..'Z';<AJK BCDEGPTVZ IY QU SXF MN>>>.&{@a[.ords X-65].=pick(*)};@a}

在线尝试!

匿名代码块,不带参数,返回字符列表。

说明:

{                                                                          } # Anonymous code block
 my@a='A'..'Z';      # Initialise @a as a list of the alphabet
               <AJK BCDEGPTVZ IY QU SXF MN>   # For each of the sets of letters
                                           >>.&{@a[.ords X-65].=       }  # Set those indexes
                                                                pick(*)   # To a random order
                                                                        ;@a  # And return

3

的JavaScript - 421 344 328 320 306 280 277 276个 ... 176字节

-77字节-我自己的

-18字节-感谢@tsh@Geza Kerecsenyi,他们使我明白了@tsh最初指出的内容是

-8字节-感谢@Geza Kerecsenyi

-14字节-在@Geza Kerecsenyi的 帮助下

- 28字节-我自己的

-3字节-再次在@Geza Kerecsenyi的 帮助下

-1字节-怎么会发生...

...

-100字节- @Kaiido在整个事情降下来之前,通过一些步骤将其杀死至176字节

打高尔夫球:

c=[,'AJK','BCDEGPTVZ','IY','QU','SXF','MN'].map(s=>[...s]);alert([...'1222252H311L66O24R5242W532'].reduce((o,v)=>o+(+v?(p=>p.splice((Math.random()*p.length)|0,1))(c[v]):v),""))

在线尝试


1
您至少可以用'BCDEGPTVZ'替换['B','C','D','E','G','P','T','V','Z']。保存一些字节
tsh

1
尝试'BCDEGPTVZ'.split``代替.split('')-2。
Geza Kerecsenyi

1
另外,您可以y=q=>q.split``在代码的顶部定义,并将所有要传递到的数组字符串设为y()-例如a=['A','J','K']变成a=y("AJK")
Geza Kerecsenyi

1
并替换'BCDEGPTVZ'.split('')y('BCDEGPTVZ')
Geza Kerecsenyi

1
'abcdef'.includes(s)?r(eval(s)):l[i]
Geza Kerecsenyi

2

符文附魔,210字节

>yy `AJK`06B$̤$@
>`BCDEGPTVZ`06B$$$$ $̤$y $ $y @
>̤`IY`06Byyy$yyy̤ @
> ̤`QU`06Byy̤ $y @
> ̤`FSX`06B $yy̤$yy@
>y̤ `MN`06Byyy $@
}}f}l3-[r\
3-[2'RA?rR1Kl'RAs]{1-:0)?\}l
> ̤`HLORW`06Bo$y $y$y$yy@ \~{{B͍

在线尝试!

随机性不统一,因为在Runic中没有很好的方法来做到这一点。相反,它会随机旋转每个字母集合(例如[BCDEGPTVZ],一个分组)一定量(例如,将上面的集合旋转4,其中堆栈的顶部在右侧,结果将是[BCDEGZPTV]),然后随机决定是否反转堆栈。它执行15次这些操作。结果,所有可能的排序都是可能的,但并非同等可能。(如果这还不够的话,增加它的成本为零字节,最多15000个随机播放循环)。

这是处理改组的代码部分:

  v              vvvv           Loop counter

}}f}l3-[r\                      < Loop entry
[2'RA?r1KRl'RAs]{1-:0)?\}l3-
                       \~{{B͍    < loop exit

 ^^^^^^                         Randomly reverse
          ^^^^^                 Rotate by a random an amount

其余代码将展开为:

                     ABCDEFGHIJKLMNOPQRSTUVWXYZ
>      `AJK`08B      $        $$;
> `BCDEGPTVZ`08B      $$$$ $        $   $ $   $;
>         `IY`08B            $               $;
>          `QU`08B                   $   $;
>          `FSX`08B       $            $    $;
>            `MN`08B             $$;
>          `HLORW`08Bo      $   $  $  $    $;

^                                                   Create IPs
 ^^^^^^^^^^^^^^^^                                   Set letter groupings
                  ^^^                               Call shuffle function
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^    Print letters
                     ^                              Last letter group needs to be sorted

如果通过更改两个字节使字母保持整齐(但一旦反转),则字母将正常打印,这可用于验证所有字母分组是否在正确的位置打印。空格使B命令异相,因此所有IP都可以在不冲突的情况下同时使用功能循环,然后又使它们恢复同相。

对于高尔夫来说,首先修剪所有行上可以删除的任何空间,然后将每个两个空间转换为y,并且将和的每个序列yyyy转换为,̤因为̤yyyy的延迟量相同,但便宜2个字节。循环出口还与HLORW主程序段组合在一起,以节省间隔字节(12个字节)。


2

Perl 5中103 91 85个字节

map{my%l;@l{/./g}++;@k{/./g}=keys%l}AJK,BCDEGPTVZ,SXF,IY,QU,MN;say map$k{$_}||$_,A..Z

在线尝试!

该代码(ab)利用了以下事实:Perl的哈希键(%l)输出是随机的,以创建%k所有可修改字母到其可能对应字母之一的映射()。在输出时,任何不存在的键都假定为不变。


除了Perl的哈希键输出完全不是随机的。它是完全确定性的,只是受密钥本身的影响而难以预测。这就是为什么此代码在每次运行时都会产生相同的输出的原因。Dunno是否取消这种方法的资格。
John Bollinger

@JohnBollinger这仅在程序运行中正确。在一次运行中,如果哈希未修改,则哈希顺序将相同。在两次运行或经过修改后,每次调用perl时都会创建一个随机种子。 参考
Xcali

好的,@ Xcali,我已经纠正了。但是,您的“在线尝试”至少使我误解了一部分。链接,它会反复为我生成相同的输出。它必须是缓存或其他东西。
John Bollinger

使用keys绝对是一个好方法,但是您可以使用以下方法节省6个字节sort rand 2,...:( 在线尝试!
Dom Hastings


1

Python 3,149字节

a,b,i,q,s,m,h,l,o,r,w=(set(s)for s in["AJK","BCDEGPTVZ","IY","QU","SXF","MN",*"HLORW"])
print([eval(c).pop()for c in[*"abbbbsbhiaalmmobqrsbqbwsib"]])

在线尝试!

通过对字母集使用pop()进行随机化


1

APL(Dyalog扩展),55字节

完整程序。打印带有前导和尾随空格的大写字母,但没有中间空格。

{(?⍨∘≢⊇⊢)@(∊∘⍺)⊢⍵}/⌈'AjkBcdegptvzIyQuSxfMn'(⊂⍤⊢,⍨∊⊂⊣)⎕A

在线尝试!

⎕A 大写字母

'AjkBcdegptvzIyQuSxfMn'() 应用以下匿名默认函数,将其作为右参数,将指示的字符串作为左参数:

 对于左参数,

 分割它,开始一个新的段

 左参数字符是右参数的成员(即大写字母)

,⍨ 附加

 的封装(把它作为一个单一的元素)
 的
 右边的参数

 大写的一切

{}/ 减少以下匿名lambda,得到… "QU"λ("SXF"λ("MN"λ"A-Z"))

⊢⍵ 在正确的参数上(加扰中的字母)

()@(∊∘⍺) 将以下匿名默认函数应用于左引数(押韵组)成员的子集

   在那个子集上

   重新排序为

  ?⍨ 子集中字母
   长度
  计数的 随机排列


1

木炭,43字节

FαF⪪”&↖(vJf#S»↖ιηa↷N↖⪪νP´↑x‖υ” F№κι‽Φκ¬№KAμ

在线尝试!链接是详细版本的代码。木炭没有改组运算符,但是我想出了一种无需替换的采样方法。说明:

Fα

循环遍历字母表中的每个字母。

F⪪”&↖(vJf#S»↖ιηa↷N↖⪪νP´↑x‖υ” 

AJK BCDEGPTVZ IY QU SXF MN H L O R W在空格处分割字符串,然后在子字符串上循环。

F№κι

循环遍历当前字母出现在子字符串中的次数。(我使用循环,因为条件else语句需要计算。另外,我可以对包含当前字母的子字符串进行相同字节数的过滤。)

‽Φκ¬№KAμ

打印随机字符,但排除已经打印的字符。


0

视网膜,80字节

K`1A2B2C2D2E5F2GH3I1J1KL6M6NO2P4QR5S2T4U2VW5X3Y2Z
~(K`123456
.
?O`$&.¶
)`¶$
[blank line]
\d
[blank line]

在线尝试!

可能不是最受关注的方法,但是我还是会提交它。

说明:

K`1A2B2C2D2E5F2GH3I1J1KL6M6NO2P4QR5S2T4U2VW5X3Y2Z

将工作字符串设置为1A2B2C2D2E5F2GH3I1J1KL6M6NO2P4QR5S2T4U2VW5X3Y2Z。例如A,组中每个字母前都有一个数字,J并且K所有字母都1在它们前面。

~(

标记一段代码会产生一些视网膜代码,然后再运行它。

K`123456

将工作字符串设置为 123456

.
?O`$&.¶

将每个字符替换为 ?O`{character}.¶

)`¶$
[blank line]

删除尾随的换行符并完成组以生成代码。该小组将生成代码:

?O`1.
?O`2.
?O`3.
?O`4.
?O`5.
?O`6.

{n}.匹配数字n的所有实例,后跟一个字符。?O对每个实例随机排序,并且对所有字符集执行此操作。

\d
[blank line]

最后,删除所有数字并隐式输出生成的字符串。

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.