Liczby, które są łatwe do zapamiętania, ale teoretycznie niełatwe do wykonania
Twoim wyzwaniem jest stworzenie programu / funkcji w dowolnym języku, który generuje jednolicie losowe liczby spełniające te kryteria:
Długość to 5 cyfr
Istnieją dwie oddzielne pary powtarzających się cyfr
Jeden zestaw powtarzających się cyfr znajduje się na początku lub na końcu, a cyfry są obok siebie
Liczba nieparzysta jest otoczona drugą parą cyfr
Dwie pary cyfr i druga liczba powinny być niepowtarzalne
Twój program może obsługiwać liczby z wiodącymi zerami lub nie, według własnego uznania. Jeśli obsługiwane są zera wiodące, muszą być uwzględnione w danych wyjściowych: 06088, a nie 6088. Jeśli zera wiodące nie są obsługiwane, wówczas liczby takie jak 06088 nie powinny być generowane w ogóle.
Przypadki testowe
Zaakceptowane wyniki:
55373 55494 67611 61633 09033 99757 95944 22808 65622 22161
Nieakceptowane wyniki:
55555 77787 85855 12345 99233 12131 abcde 5033
Więcej akceptowalnych przypadków testowych można znaleźć pod tym linkiem .
Zostały one wykonane za pomocą tego programu python:
importuj losowo dla i w zakresie (100): if random.randint (0,100)> = 50: # Ustaw parę dotykającą na początku, jeśli jest prawdą temp = [] #working array temp. append (random.randint (0,9)) #append losowa cyfra temp.append (temp [0]) # ponownie dodaj tę samą cyfrę x = random.randint (0,9) podczas gdy x == temp [0]: x = random.randint (0,9) temp.append (x) #append inną unikalną cyfrę y = losowy. losowy (0,9) podczas gdy y == temp [0] lub y == temp [2]: y = losowy. losowy (0,9) temp.append (y) #append inną unikalną cyfrę i poprzednią unikalną cyfrę temp. append (x) else: #Umieść parę dotykającą na końcu temp = [] #working array temp. append (random.randint (0,9)) #append losowa cyfra # Chociaż nie jest wyjątkowy, spróbuj ponownie x = random.randint (0,9) podczas gdy x == temp [0]: x = random.randint (0,9) temp.append (x) #append inną unikalną cyfrę temp.append (temp [0]) # dodaj ponownie tę samą cyfrę 0 y = losowy. losowy (0,9) podczas gdy y == temp [0] lub y == temp [1]: y = losowy. losowy (0,9) temp. append (y) #app dwukrotnie kolejną unikalną cyfrę temp. dopisywanie (y) tempstr = "" dla i w temp: tempstr + = str (i) temp. wydruku
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach!
random
nie oznacza to jednakowoOdpowiedzi:
05AB1E , 11 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
CJam (16 bajtów)
Demo online
Uwaga: Założyłem, że „unikalny” OP naprawdę oznacza „odrębny”.
Również dla 16 bajtów:
Sekcja
Pozostałe warianty generują za pomocą,
[1 0 1 2 2]
a następnie wybierają wynik lub jego odwrotność.źródło
Perl 5 ,
816356 bajtówWytnij 7 bajtów z inspiracją @DomHastings
Konstruowanie liczby z odpowiedniego wzorca.
Wypróbuj online!
Perl 5 , 89 bajtów
Wybiera losowe liczby 5-cyfrowe, aż znajdzie taką, która spełnia kryteria.
Wypróbuj online!
źródło
time%2
jest wystarczająco losowy, ponieważ w pewnym sensie znajduje się pod kontrolą użytkownika.Python 2 , 80 bajtów
Wypróbuj online!
Wyświetla listę cyfr.
Python 2 , 83 bajty
Wypróbuj online!
Dane wyjściowe to liczba.
źródło
APL (Dyalog Unicode) ,
22 21 20 1817 bajtówWypróbuj online!
Jeśli jest to dopuszczalne na mocy numery zawsze w tym samym formacie, może zostać skrócony do 12 bajtów, albo
1⌽1↓,∘⌽⍨3?10
albo3⌽1↓,∘⌽⍨3?10
.Zapisano bajt, usuwając niepotrzebne
∘
.Zapisano bajt dzięki H.PWiz, a następnie 2 kolejne bajty ze względu na ich wskazówkę.
Zapisano bajt dzięki ngn.
Funkcja zakłada
⎕IO←0
( I ndex O rigin).W jaki sposób?
źródło
Input
służy do wywołania funkcjig
. Ponadto liczbag←
nie jest liczona w liczbie bajtów, ponieważ nie jest to konieczne, służy jedynie do wywołania funkcji.g
jest wywoływane w sekcji wprowadzania, to tylko dziwactwo tego, jak APL ma działać na TIO(4∨?2)
zapisuje bajt ponad1 4[?2]
f
i nie pociągając . Ale zostawię to tobie :)Java 8,
145136125119 bajtów-9 bajtów dzięki @ OlivierGrégoire.
-11 bajtów dzięki @RickHitchcock .
-6 bajtów dzięki @Nevay .
Wyjaśnienie:
Wypróbuj online.
źródło
v->{String r="";for(;!r.matches("(.)\\1(.).\\2|(.).\\3(.)\\4")|r.chars().distinct().count()!=3;r=(int)(Math.random()*1e5)+"");return r;}
(.).*\\1(.).*\\2
, oszczędzając 11 bajtów.v->{String r;for(;!(r=(int)(Math.random()*1e5)+"").matches("((.).?\\2){2}")|r.chars().distinct().count()<3;);return r;}
Galaretka , 23 bajty
Wypróbuj online!
źródło
Galaretka ,
1211 bajtówWypróbuj online!
Wyjaśnienie
(*) Właściwym argumentem
ṃ
jest lista['0','1','2',...,'9']
losowo losowana, zawierająca 10 elementów. Tak więc liczba13122
zostanie przekonwertowana na bazę bijective 10 ([1,3,1,2,2]
) i zindeksowana do listy (więc jeśli lista jestl
, zwracana jest wartość atomu[l[1],l[3],l[1],l[2],l[2]]
, w którym Jelly używa indeksowania 1)źródło
JavaScript (ES6), 79 bajtów
Wypróbuj online!
W jaki sposób?
Math.random()
daje losową liczbę zmiennoprzecinkową w [0..1) . Używamy,+f
aby wymusić przymus na łańcuch. Ignorujemy wiodące zero i kropkę dziesiętną, wykonując[,,
( destrukcyjne przypisanie pierwszych dwóch znaków do zera ) i zbieramy pierwsze 4 cyfry dziesiętne na d , a , b i c .Jeśli , b i c to 3 różne liczby całkowite, budować ostateczną wyjścia w obydwu AABCB lub BCBAA formacie (przy parzystości o d zdecydować). W przeciwnym razie próbujemy ponownie, aż będą.
W bardzo nieprawdopodobnym przypadku
Math.random()
zwrócenia wartości bez wystarczającej liczby miejsc dziesiętnych, co najmniej c zostanie ustawione na znak niezerowy, zmuszając test do niepowodzenia i wywołanie rekurencyjne. Jeśli a , b i c są poprawnymi liczbami całkowitymi, to gwarantuje się, że d jest również poprawną liczbą całkowitą, więc nie trzeba tego testować.źródło
&&
mogą być&
. Jak[,,a,b,c,d]
działa? Nigdy nie widziałem takiego wkładu jak[,,
wcześniej.a=4, b=2, c=1
ponieważ4-2&4-1&2-1 == 2&3&1 == 0
. Dodałem krótkie wyjaśnienie dotyczące przypisania zmiennej.&&
się&
w TIO i dała odpowiednie wyjścia, więc zakłada się, że to możliwe. Nie zdawałem sobie sprawy, że&
zamiast tego&&
odfiltrowałbym prawidłowe dane wyjściowe. I dziękuję za dodatkowe wyjaśnienie dotyczące zadania restrukturyzacji, którego nigdy wcześniej nie widziałem.Perl 6 , 42 bajtów
Wypróbuj online!
źródło
Brudny , 33 bajty
Używa
--numeric-output
flagi, aby była czytelna, w przeciwnym razie wyświetlałby ciąg znaków kontrolnych z punktami kodowymi odpowiadającymi cyfrom.Wypróbuj online!
Wyjaśniono:
źródło
Węgiel drzewny , 34 bajty
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
źródło
Siatkówka , 40 bajtów
Wypróbuj online!
Może drukować ciągi z wiodącymi zerami.
Wyjaśnienie
Zainicjuj ciąg do 10 znaków podkreślenia.
Cyklicznie transliteruj znaki słowne na cyfry. To trochę dziwne. Skróty
w
id
oznaczają odpowiednio następujące ciągi:Cykliczna transliteracja oznacza, że najpierw oba ciągi są powtarzane do długości ich LCM:
Ponieważ ciągi znaków o długości 53 i 10 są chronione prawem autorskim, każda kopia
_
jest sparowana z inną cyfrą. A teraz cykliczny transliteracji zastąpi I th kopia_
z I th parowanie w tej rozszerzonej listy. W rezultacie otrzymujemy następujący ciąg:Wszystko po to, by zaoszczędzić jeden bajt na dosłownym ciągu
0369258147
, więc chyba tak? :REW każdym razie mamy teraz ciąg wszystkich 10 cyfr.
To przetasowuje cyfry. Pierwsze trzy cyfry będą jednakowo losowym wyborem trzech różnych cyfr.
Dopasowujemy ciąg
...ABC
i przekształcamy go wBABCC
. Sposób, w jaki to robimy, jest trochę szalony i znów oszczędza tylko jeden bajt w porównaniu do prostszego podejścia. Najpierw dopasowujemy wszystkie nakładające się (v
) pary znaków, przechwytując drugą (.(.)
). Następnie zachowujemy tylko 8. dopasowanie (od7
zera), które jestAB
w...ABC
. Następnie zamieniamy ($
) na:B
($1
),ABC
($<'
który jest sufiksem separatora dopasowania po lewej stronie dopasowania),C
($'
który jest sufiksem samego dopasowania).Na koniec dopasowujemy 3 lub 2 znaki i tasujemy mecze, dając nam jeden
BABCC
lubCCBAB
losowo.źródło
R , 78 bajtów
Wypróbuj online!
sample
3 losowo wybiera wartości z0:9
, które umieszcza się w wektorze w taki sposób:a b a c c
. Teraz mamy szansę 50/50, aby odwrócić ten wektor, a następnie połączyć i wydrukować.źródło
rt
, ale z jakiegoś powodu myślałem, że to już dłużej ...(
no-op to dobre znalezisko :)PHP,
737266 bajtówEdycja: 66 bajtów dzięki sugestii @David.
Wypróbuj online!
źródło
<?=strtr(rand()%2?AABCB:BCBAA,ABC,rand(0,9).rand(0,9).rand(0,9));
rand(0,3).rand(4,6).rand(7,9)
, ale z drugiej strony nie jest „jednolicie losowe”. Btw. Nie byłem zaznajomionyrand()%2
, więc twój komentarz i tak pomógł mi nieco ulepszyć moje rozwiązanie.<?=strtr(rand()%2?AABCB:BCBAA,ABC,join(array_rand(range(0,9),3)));
. Możesz przetestować, żearray_rand
drugi parametr zwraca tutaj tylko unikalne wyniki (przetestowane w ponad 10000 iteracjach).Czerwony ,
147, 146125 bajtówWypróbuj online!
Nie golfowany:
źródło
Wolfram Language (Mathematica) , 59 bajtów
Wypróbuj online!
źródło
Rubin ,
6059 bajtówWypróbuj online!
Zwraca listę cyfr.
źródło
Python 3 + numpy, 69 bajtów
Wyjaśnienie
źródło
C (gcc) ,
126119 bajtów-6 bajtów od @ceilingcat
Wypróbuj online!
źródło
J , 35 bajtów
Wypróbuj online!
Jestem pewien, że można grać w golfa znacznie dalej.
Wyjaśnienie:
źródło