Чи знаєте ви своїх "КВЗ"?


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
  • А Б В Г Г Д Е Є Ж З И І Ї Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ ЬЮ Я

Недоклад:

  • 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
Я думаю, залежить від того, звідки ви. Якщо ви кажете "Зед", тоді було б сенс вийняти його, але в іншому випадку, якщо ви скажете "ну", тоді залиште його. Зрештою, це залежить від вас, як і решта наборів. Вони повинні бути вказівками та відправними точками, протилежними суворим правилам :)
пані

3
Однорідна випадкова або кожна можливість, що має ненульову ймовірність, чи щось інше?
jimmy23013

8
@PeterTaylor Я думаю, що наміри полягають у тому, що члени груп можуть легко міняти місцями в середині пісні, зберігаючи мелодію та ритм оригіналу - тому, поки вони виконують риму, W тривалість 3 складів, а U - лише 1, що змінило б ритм пісні.
Сок

2
Для тих, хто (як я) не мав уявлення, про що йдеться у запитанні: en.wikipedia.org/wiki/Alphabet_song
anatolyg

Відповіді:


6

05AB1E , 28 байт

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

Виводиться у вигляді рядкового рядка

Спробуйте в Інтернеті або перевірити відразу випадкових результатівн .

Пояснення:

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 байт, завдяки Джо Кінгу


Пітон 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

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


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
Ви можете принаймні замінити ['B', 'C', 'D', 'E', 'G', 'P', 'T', 'V', 'Z'] на "BCDEGPTVZ'.split`` щоб зберегти кілька байт
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-адреси можуть одночасно використовувати цикл функцій без зіткнення, а потім знову повертати їх у фазу.

Для гольфу спочатку було оброблено будь-який простір, який можна було вилучити у всіх рядках, потім кожне два пробіли було перетворено на a 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 виведення хеш-ключів зовсім не випадковий. Це повністю детерміновано, просто під впливом самих ключів таким чином, що важко передбачити. Ось чому цей код дає однаковий вихід на кожному запуску. Данно, чи дискваліфікує це підхід чи ні.
Джон Боллінгер

@JohnBollinger Це справедливо лише під час виконання програми. Протягом одного запуску хеш-порядок буде однаковим, якщо хеш не буде змінено. Протягом двох циклів або з модифікацією є випадкове насіння, що створюється під час кожного виклику perl. Довідка
Xcali

Гаразд, @Xcali, я виправлений. Однак мене хоча б частково ввели в оману вашим "Спробуйте в Інтернеті!" посилання, яке неодноразово генерує той самий вихід для мене. Це повинно бути кешування, або щось таке.
Джон Боллінгер

Використання keys, безумовно, хороший підхід, але ви можете зберегти 6 байт, використовуючи sort rand 2,...замість цього :( Спробуйте в Інтернеті!
Дом Гастінгс



1

APL (Dyalog Extended) , 55 байт

Повна програма. Друкує великі регістри з провідним та заднім простором, але без проміжних пробілів.

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

Спробуйте в Інтернеті!

⎕A прописний алфавіт

'AjkBcdegptvzIyQuSxfMn'() Застосувати таку анонімну функцію мовчання з цим як аргумент правого і вказаний рядок як аргумент зліва:

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

 розділіть його, починаючи новий сегмент де

 ліві символи аргументів є членами правого аргументу (тобто у великих літерах)

,⍨ додавати

 Вкладіть (розглядати його як окремий елемент)
 з
 правим аргументом

 великі регістри все

{}/ Зменшити на наступну анонімну лямбда, подаючи… "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]

Нарешті, видаліть усі числа та неявно виведіть створений рядок.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.