Czy znasz swoje KVZ?

23

Pojęcie

W jaki sposób możesz wymieszać alfabet angielski, aby można go było śpiewać do melodii Twinkle Twinkle Little Star bez rujnowania melodii?

Zasady

Zamiana

Załóżmy po prostu, że litery zawarte w każdym z poniższych zestawów można domyślnie dowolnie zamieniać bez rujnowania melodii:

  • {A, J, K}
  • {B, C, D, E, G, P, T, V, Z}
  • {I, Y}
  • {Q, U}
  • {S, X, F}
  • {M, N}
  • Dlatego H, L, O, R i W są zablokowane na miejscu

Wydajność

Program musi wypisać pojedynczy ciąg RANDOM (lub listę znaków) zawierający pełny alfabet angielski w dowolnej kolejności, pod warunkiem, że kolejność spełnia powyższe warunki. Nie powinno być możliwości przewidzenia, który ciąg zostanie wygenerowany przez program (jeśli zignorujemy inicjowanie), co oznacza, że ​​nie można go po prostu zakodować na stałe.

Twój program musi mieć pewne pozytywne prawdopodobieństwo (niekoniecznie jednakowe) wygenerowania każdego z wyników.9!3)!3)!2)!2)!2)!=104509440

Nie ma żadnych szczególnych ograniczeń formatowania dotyczących odstępów, separatorów lub wielkości liter, po prostu zachowaj spójność.

Cel

Wygrywa najmniej bajtów!

Przykłady:

  • 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, mi
  • KVTDCFBHIJALNMOPURSZQGWXYE
  • jcdebxthikalnmogursvq pwfyz
  • ABCDEFGHIJKLMNOPQRSTU VWXYZ

Brak przykładu:

  • HLWROABCDEFZXYGIJKMNPQTSVU

Dowód koncepcji: (Python3, 529 bajtów)

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])
władca chleba
źródło
5
Nie powinno Zbyć „zablokowane na miejscu”, nie rymuje się z innymi?
Kudłaty
3
Zależy, skąd jesteś. Jeśli powiesz „zed”, warto go wyjąć, ale w przeciwnym razie, jeśli powiesz „zee”, zostaw to w sobie. Ostatecznie to zależy od ciebie, podobnie jak reszta zestawów. Mają być wytycznymi i punktami wyjścia, a nie ścisłymi zasadami :)
władca
3
Równomiernie losowe czy każda możliwość o niezerowym prawdopodobieństwie, czy coś innego?
jimmy23013
8
@PeterTaylor Myślę, że intencją jest, aby członków grup można było łatwo zamienić w środku utworu, zachowując melodię i rytm oryginału - więc podczas rymowania W ma 3 sylaby, a U tylko 1, co zmieniłoby rytm piosenki.
Sok
2
Dla tych, którzy (jak ja) nie mieli pojęcia, o czym mówi pytanie: en.wikipedia.org/wiki/Alphabet_song
anatolyg

Odpowiedzi:

6

05AB1E , 28 bajtów

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

Wyprowadza jako pojedynczy ciąg małych liter.

Wypróbuj online lub sprawdź losowych wyników narazn .

Wyjaśnienie:

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)

Zobacz moją wskazówkę 05AB1E (sekcja Jak kompresować ciągi znaków nie będące częścią słownika? ), Aby zrozumieć, dlaczego tak .•¬=©ƶÓÄûkTVã”ØζÞ•jest "ajk bcdegptvz iy qu sxf mn".

Kevin Cruijssen
źródło
7

Python 3 , 140 133 124 123 bajtów

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

Wypróbuj online!

-1 bajt, dzięki Jo King


Python 2 , 174 170 158 bajtów

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

Wypróbuj online!

TFeld
źródło
4

Rubin , 102 bajty

s=[*?A..?Z]*''
%w(AJK BCDEGPTVZ IY QU SXF MN).map{|e|a=e.chars.shuffle;s.gsub!(/[#{e}]/){a.pop}}
$><<s

Wypróbuj online!

Wartość tuszu
źródło
3

Pyth , 59 57 56 bajtów

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

Wypróbuj online!

Dane wyjściowe to tablica małych liter.

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
źródło
3

R , 93 91 bajtów

`^`=strsplit
L=LETTERS
for(s in el('AJK7BCDEGPTVZ7IY7QU7FSX7MN'^7)^'')L[L%in%s]=sample(s)
L

Wypróbuj online!

digEmAll
źródło
3

Perl 6 , 76 bajtów

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

Wypróbuj online!

Anonimowy blok kodu nie przyjmuje argumentów i zwraca listę znaków.

Wyjaśnienie:

{                                                                          } # 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
Jo King
źródło
3

JavaScript - 421 344 328 320 306 280 277 276 ... 176 bajtów

-77 Bajtów - na własną rękę

-18 Bajtów - dzięki @tsh i @Geza Kerecsenyi, którzy kazali mi zobaczyć, co @tsh początkowo zwrócił uwagę

-8 Bajtów - dzięki @Geza Kerecsenyi

-14 Bajtów - z pomocą @Geza Kerecsenyi

- 28 bajtów - na własną rękę -

3 bajty - znowu z pomocą @Geza Kerecsenyi

-1 bajtów - jak to się mogło stać ...

...

-100 bajtów - @Kaiido zabił je i kilkoma krokami zanim to wszystko się zepsuło do 176 bajtów

Gra w golfa:

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

lub wypróbuj online !

pixma140
źródło
1
Możesz przynajmniej zastąpić [„B”, „C”, „D”, „E”, „G”, „P”, „T”, „V”, „Z”] przez „BCDEGPTVZ” .split`` zaoszczędzić trochę bajtów
tsh
1
Spróbuj 'BCDEGPTVZ'.split``zamiast .split('')-2.
Geza Kerecsenyi
1
Możesz także zdefiniować y=q=>q.split``na górze kodu i wykonać wszystkie ciągi tablic, które przekazujesz y()- np. a=['A','J','K']a=y("AJK")
Stają
1
I wymienić 'BCDEGPTVZ'.split('')zy('BCDEGPTVZ')
Geza Kerecsenyi
1
'abcdef'.includes(s)?r(eval(s)):l[i]
Geza Kerecsenyi
2

Runiczne Zaklęcia , 210 bajtów

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

Wypróbuj online!

Losowanie nie jest jednolite, ponieważ nie ma dobrego sposobu na zrobienie tego w Runicznej. Zamiast tego losowo obraca każdą kolekcję liter (np. [BCDEGPTVZ]Jedną grupę) o pewną ilość (np. Obracając powyższy zestaw o 4, gdzie górna część stosu jest po prawej stronie, wynikiem będzie [BCDEGZPTV]), a następnie losowo decyduje, czy odwróć stos. Wykonuje te operacje 15 razy. W rezultacie wszystkie możliwe zamówienia są możliwe, ale nie w równym stopniu prawdopodobne. (W przypadku, gdy to nie wystarczy, zwiększenie to kosztuje dodatkowo zero bajtów , do 15000 losowych pętli).

To jest sekcja kodu, która obsługuje tasowanie:

  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

Reszta kodu rozwija się w ten sposób:

                     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

Jeśli litery pozostaną niezmienione (ale raz odwrócone) przez zmianę dwóch bajtów, alfabet zostanie wydrukowany normalnie , co można wykorzystać do sprawdzenia, czy wszystkie grupy liter są drukowane w odpowiednich miejscach. Biała spacja przesuwająca Bpolecenia poza fazę jest taka, że ​​wszystkie adresy IP mogą jednocześnie korzystać z pętli funkcyjnej bez kolizji, a następnie przywracać je z powrotem do fazy.

Aby zagrać w golfa, najpierw każde miejsce, które można usunąć na wszystkich liniach, zostało przycięte, a następnie każde dwa pola zostały przekonwertowane na a y, a każda sekwencja yyyyzostała przekonwertowana na, ̤ponieważ ̤i yyyymają taką samą ilość opóźnienia, ale 2 bajty tańsze. Wyjście z pętli zostało również połączone z HLORWgłównym segmentem programu, aby zaoszczędzić na bajtach odległości (12 bajtów).

Draco18s
źródło
2

Perl 5 , 103 91 85 bajtów

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

Wypróbuj online!

Ten kod (ab) wykorzystuje fakt, że dane wyjściowe kluczy skrótu ( %l) Perla są losowe, aby utworzyć odwzorowanie ( %k) wszystkich modyfikowalnych liter na jeden z ich możliwych odpowiedników. W momencie wyjścia zakłada się, że każdy klucz, który nie istnieje, pozostaje niezmieniony.

Xcali
źródło
Tyle że wyjście kluczy skrótu Perla nie jest wcale przypadkowe. Jest całkowicie deterministyczny, po prostu pod wpływem samych kluczy w sposób, który utrudnia przewidywanie. Dlatego ten kod generuje to samo wyjście przy każdym uruchomieniu. Nie wiem, czy to dyskwalifikuje to podejście, czy nie.
John Bollinger
@JohnBollinger Jest to prawdą tylko w ramach jednego programu. W ramach jednego uruchomienia kolejność mieszania będzie taka sama, jeśli skrót nie zostanie zmodyfikowany. W dwóch biegach lub z modyfikacją istnieje losowe ziarno tworzone przy każdym wywołaniu perla. Odniesienie
Xcali
Ok, @Xcali, poprawiam się. Zostałem jednak co najmniej częściowo wprowadzony w błąd przez „Wypróbuj online!” link, który wielokrotnie generuje dla mnie to samo wyjście. To musi być buforowanie lub coś w tym rodzaju.
John Bollinger
Korzystanie keysjest zdecydowanie dobrym podejściem, ale możesz sort rand 2,...zamiast tego zaoszczędzić 6 bajtów :( Wypróbuj online!
Dom Hastings
2

Galaretka , 34 bajty

ØA“wẸXWỵḲ⁻ȦƙṄṇ’œ?µ“ĠQ’ḃ3ÄœṖ⁸Ẋ€Ẏị@Ụ

Wypróbuj online!

Erik the Outgolfer
źródło
1

Python 3 , 149 bajtów

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

Wypróbuj online!

Randomizacja za pomocą pop () dla zestawu liter

Jitse
źródło
1

APL (Dyalog Extended) , 55 bajtów

Pełny program Drukuje wielkie litery ze spacją wiodącą i końcową, ale bez spacji pośrednich.

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

Wypróbuj online!

⎕A wielkie litery alfabetu

'AjkBcdegptvzIyQuSxfMn'() Zastosuj następującą anonimową funkcję ukrytą z tym jako prawym argumentem i wskazanym ciągiem jako lewym argumentem:

 za lewy argument

 podziel go, rozpoczynając nowy segment gdzie

 znaki lewego argumentu są członkami prawego argumentu (tj. na wielkich literach)

,⍨ dodać

 załączyć (aby traktować go jako pojedynczy element)
 w
 prawym argumencie

 wielkie litery wszystko

{}/ Zmniejsz o następującą anonimową lambdę, dając… "QU"λ("SXF"λ("MN"λ"A-Z")):

⊢⍵ na prawym argumencie (alfabet w toku)

()@(∊∘⍺) Zastosuj następującą anonimową funkcję ukrytą do podzbioru, który jest członkiem lewego argumentu (grupa wierszyków)

   w tym podzbiorze

   zmienić jego kolejność

  ?⍨ losowa permutacja  liczenia
   długości
  liter w podzbiorze

Adám
źródło
1

Węgiel drzewny , 43 bajty

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

Wypróbuj online! Link jest do pełnej wersji kodu. Węgiel nie ma operatorów tasowania, ale wymyśliłem metodę pobierania próbek bez wymiany. Wyjaśnienie:

Fα

Pętlę nad każdą literą alfabetu.

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

Podziel ciąg znaków AJK BCDEGPTVZ IY QU SXF MN H L O R Wna spacje i zapętl nad podciągami.

F№κι

Zapętlaj liczbę razy, gdy bieżąca litera pojawia się w podłańcuchu. (Używam pętli, ponieważ warunek wymagałby elsecaluse. Alternatywnie mógłbym przefiltrować podciąg zawierający bieżącą literę dla tej samej liczby bajtów.)

‽Φκ¬№KAμ

Wydrukuj losowy znak, ale wyklucz te, które już zostały wydrukowane.

Neil
źródło
0

Siatkówka , 80 bajtów

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

Wypróbuj online!

Prawdopodobnie nie jest to najbardziej golfowa metoda, ale i tak ją przedstawię.

Wyjaśnienie:

K`1A2B2C2D2E5F2GH3I1J1KL6M6NO2P4QR5S2T4U2VW5X3Y2Z

Ustaw ciąg roboczy na 1A2B2C2D2E5F2GH3I1J1KL6M6NO2P4QR5S2T4U2VW5X3Y2Z. Istnieje szereg przed każdą literę w grupie, na przykład A, Ji Kwszyscy mają 1przed nimi.

~(

Zaznacz sekcję kodu, która wygeneruje kod siatkówki, a następnie uruchom go później.

K`123456

Ustaw ciąg roboczy na 123456

.
?O`$&.¶

Zamień każdy znak na ?O`{character}.¶

)`¶$
[blank line]

Usuń końcowy znak nowej linii i zakończ grupę, aby wygenerować kod. Grupa wygeneruje kod:

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

{n}.dopasowuje wszystkie wystąpienia liczby n, po której następuje znak. ?Osortuje każdą instancję losowo i odbywa się to dla wszystkich zestawów znaków.

\d
[blank line]

Na koniec usuń wszystkie liczby i domyślnie wyślij wygenerowany ciąg.

lolad
źródło