Вы знаете свои KVZ?

23

концепция

Каким образом вы можете зашифровать английский алфавит, чтобы его можно было петь под мелодию Twinkle Twinkle Little Star, не разрушая мелодию?

правила

Перестановка

Давайте просто предположим, что буквы, содержащиеся в каждом из следующих наборов, могут свободно заменяться по умолчанию, не разрушая мелодию:

  • {A, J, K}
  • {B, C, D, E, G, P, T, V, Z}
  • {Я, Y}
  • {Q, U}
  • {S, X, F}
  • {M, N}
  • Поэтому H, L, O, R и W заблокированы на месте

Выход

Программа должна вывести единственную СЛУЧАЙНУЮ строку (или список символов), содержащую полный английский алфавит в любом порядке, при условии, что этот порядок удовлетворяет вышеуказанным условиям. У вас не должно быть возможности предсказать, какая строка будет выводиться вашей программой (если мы игнорируем заполнение), то есть вы не можете просто жестко ее кодировать.

Ваша программа должна иметь некоторую положительную вероятность (не обязательно равномерную) генерации каждого из выходов.9!3!3!2!2!2!знак равно104509440

Не существует особых ограничений форматирования, касающихся пробелов, разделителей или регистра, просто будьте последовательными.

Цель

Побеждает несколько байтов!

Примеры:

  • KCDBPSVHIAJLMNOZQRXGUEWFYT
  • А, G, Z, V, Р, X, C, H, Y, K, J, L, N, М, О, Т, U, R, S, D, Q, B, W, F, I, Е
  • KVTDCFBHIJALNMOPURSZQGWXYE
  • jcdebxthikalnmogursvq pwfyz
  • АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ

Nonexample:

  • 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])
breadlord
источник
5
Не должно Zбыть «заперто на месте», оно не рифмуется с остальными?
Мохнатый
3
Зависит от того, откуда ты, я полагаю. Если вы говорите «zed», то было бы разумно убрать его, но в противном случае, если вы скажете «zee», оставьте его. В конечном счете, вам решать, как и остальным сетам. Они должны быть ориентирами и отправными точками, противоположными строгим правилам :)
Хозяин хлеба
3
Равномерно случайный или любая возможность, имеющая ненулевую вероятность, или что-то еще?
jimmy23013
8
@PeterTaylor Я думаю, что намерение состоит в том, чтобы членов групп можно было легко поменять местами в середине песни, сохранив при этом мелодию и ритм оригинала - поэтому, пока они рифмуются, W - это 3 слога, а U - только 1, что изменило бы ритм песни.
Сок
2
Для тех, кто (как и я) понятия не имел, о чем идет речь: en.wikipedia.org/wiki/Alphabet_song
anatolyg

Ответы:

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".

Кевин Круйссен
источник
3

Pyth , 59 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
Sok
источник
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 байт

Golfed:

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),""))

или попробуйте онлайн !

pixma140
источник
1
Вы можете по крайней мере заменить ['B', 'C', 'D', 'E', 'G', 'P', 'T', 'V', 'Z'] на 'BCDEGPTVZ'.split`` сэкономить несколько байтов
Tsh
1
Попробуйте 'BCDEGPTVZ'.split``вместо .split('')-2.
Геза Кереценый
1
Кроме того, вы можете определить y=q=>q.split``в верхней части своего кода, и сделать все строки массивов, в которые вы передаете y()- например, a=['A','J','K']становитсяa=y("AJK")
Geza Kerecsenyi
1
И заменить 'BCDEGPTVZ'.split('')наy('BCDEGPTVZ')
Геза Кереценый
1
'abcdef'.includes(s)?r(eval(s)):l[i]
Геза Кереценый
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͍

Попробуйте онлайн!

Рандомизация не является равномерной, так как в Рунической системе нет хорошего способа сделать это. Вместо этого он случайным образом поворачивает каждую коллекцию букв (например [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-адреса могут использовать цикл функций одновременно, не сталкиваясь, а затем снова возвращать их в фазу.

Для игры в гольф сначала было обрезано любое пространство, которое можно было удалить по всем строкам, затем каждые два пространства были преобразованы в a y, и каждая последовательность yyyyбыла преобразована в ̤потому что ̤и yyyyимеют одинаковую величину задержки, но дешевле на 2 байта. Выход цикла также был объединен с HLORWосновным сегментом программы, чтобы сэкономить на байтах интервала (12 байтов).

Draco18s
источник
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) всех модифицируемых букв на один из их возможных аналогов. Во время вывода предполагается, что любая несуществующая клавиша остается неизменной.

Xcali
источник
За исключением того, что Perl выводит хеш-ключи совсем не случайно. Он полностью детерминирован, просто под влиянием самих ключей таким образом, что его сложно предсказать. Вот почему этот код выдает один и тот же вывод при каждом запуске. Не знаю, дисквалифицирует ли это подход или нет.
Джон Боллинджер
@JohnBollinger Это верно только при запуске программы. В пределах одного прогона порядок хеширования будет таким же, если хеш не изменен. На протяжении двух прогонов или с модификацией, при каждом вызове perl создается случайное начальное число. Ссылка
Xcali
Хорошо, @Xcali, я исправлен. Я был по крайней мере частично введен в заблуждение, однако, вашим "Попробуй онлайн!" ссылка, которая неоднократно генерирует один и тот же вывод для меня. Это должно быть кэширование или что-то в этом роде.
Джон Боллинджер
Использование 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 () для набора букв

Jitse
источник
1

APL (Dyalog Extended) , 55 байт

Полная программа. Печатает заглавные буквы с начальным и конечным пробелом, но без промежуточных пробелов.

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

Попробуйте онлайн!

⎕A прописные буквы алфавита

'AjkBcdegptvzIyQuSxfMn'() Применить следующую анонимную молчаливую функцию с этим в качестве правого аргумента и указанной строкой в ​​качестве левого аргумента:

 для левого аргумента,

 разбить его, начиная новый сегмент, где

 символы левых аргументов являются членами правого аргумента (то есть заглавными буквами)

,⍨ Append

 Вложите (рассматривать его как отдельный элемент)
 с
 правым аргументом

 прописные буквы все

{... }/ уменьшить на следующую анонимную лямбду, давая ... "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]

Наконец, удалите все числа и неявно выведите сгенерированную строку.

lolad
источник