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.
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])
Z
być „zablokowane na miejscu”, nie rymuje się z innymi?Odpowiedzi:
05AB1E , 28 bajtów
Wyprowadza jako pojedynczy ciąg małych liter.
Wypróbuj online lub sprawdź losowych wyników narazn .
Wyjaśnienie:
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"
.źródło
Python 3 ,
140133124123 bajtówWypróbuj online!
-1 bajt, dzięki Jo King
Python 2 ,
174170158 bajtówWypróbuj online!
źródło
Rubin , 102 bajty
Wypróbuj online!
źródło
Pyth ,
595756 bajtówWypróbuj online!
Dane wyjściowe to tablica małych liter.
źródło
R ,
9391 bajtówWypróbuj online!
źródło
Perl 6 , 76 bajtów
Wypróbuj online!
Anonimowy blok kodu nie przyjmuje argumentów i zwraca listę znaków.
Wyjaśnienie:
źródło
JavaScript -
421344328320306280277276... 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:
lub wypróbuj online !
źródło
'BCDEGPTVZ'.split``
zamiast.split('')
-2.y=q=>q.split``
na górze kodu i wykonać wszystkie ciągi tablic, które przekazujeszy()
- np.a=['A','J','K']
a=y("AJK")
'BCDEGPTVZ'.split('')
zy('BCDEGPTVZ')
'abcdef'.includes(s)?r(eval(s)):l[i]
Runiczne Zaklęcia , 210 bajtów
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:
Reszta kodu rozwija się w ten sposób:
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
B
polecenia 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 sekwencjayyyy
została przekonwertowana na,̤
ponieważ̤
iyyyy
mają taką samą ilość opóźnienia, ale 2 bajty tańsze. Wyjście z pętli zostało również połączone zHLORW
głównym segmentem programu, aby zaoszczędzić na bajtach odległości (12 bajtów).źródło
Perl 5 ,
103 9185 bajtówWypró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.źródło
keys
jest zdecydowanie dobrym podejściem, ale możeszsort rand 2,...
zamiast tego zaoszczędzić 6 bajtów :( Wypróbuj online!Galaretka , 34 bajty
Wypróbuj online!
źródło
Python 3 , 149 bajtów
Wypróbuj online!
Randomizacja za pomocą pop () dla zestawu liter
źródło
APL (Dyalog Extended) , 55 bajtów
Pełny program Drukuje wielkie litery ze spacją wiodącą i końcową, ale bez spacji pośrednich.
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źródło
Węgiel drzewny , 43 bajty
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:
Pętlę nad każdą literą alfabetu.
Podziel ciąg znaków
AJK BCDEGPTVZ IY QU SXF MN H L O R W
na spacje i zapętl nad podciągami.Zapętlaj liczbę razy, gdy bieżąca litera pojawia się w podłańcuchu. (Używam pętli, ponieważ warunek wymagałby
else
caluse. Alternatywnie mógłbym przefiltrować podciąg zawierający bieżącą literę dla tej samej liczby bajtów.)Wydrukuj losowy znak, ale wyklucz te, które już zostały wydrukowane.
źródło
Siatkówka , 80 bajtów
Wypróbuj online!
Prawdopodobnie nie jest to najbardziej golfowa metoda, ale i tak ją przedstawię.
Wyjaśnienie:
Ustaw ciąg roboczy na
1A2B2C2D2E5F2GH3I1J1KL6M6NO2P4QR5S2T4U2VW5X3Y2Z
. Istnieje szereg przed każdą literę w grupie, na przykładA
,J
iK
wszyscy mają1
przed nimi.Zaznacz sekcję kodu, która wygeneruje kod siatkówki, a następnie uruchom go później.
Ustaw ciąg roboczy na
123456
Zamień każdy znak na
?O`{character}.¶
Usuń końcowy znak nowej linii i zakończ grupę, aby wygenerować kod. Grupa wygeneruje kod:
{n}.
dopasowuje wszystkie wystąpienia liczby n, po której następuje znak.?O
sortuje każdą instancję losowo i odbywa się to dla wszystkich zestawów znaków.Na koniec usuń wszystkie liczby i domyślnie wyślij wygenerowany ciąg.
źródło