Firma loteryjna chce wygenerować losowy los o długości 10 znaków.
Napisz kod w dowolnym języku, aby utworzyć taki numer, w którym każda cyfra występuje tylko raz, na przykład 9354716208
w tym numerze wszystkie liczby całkowite od 0 do 9 występują tylko raz. Ta liczba powinna być liczbą losową.
- Wygenerowany numer powinien zostać wyświetlony na ekranie.
- Musi być w stanie wygenerować wszystkie permutacje wszystkich dozwolonych znaków.
- Kod musi być jak najmniejszy (w bajtach).
Odpowiedzi:
J (4 bajty)
Nie mogłem się oprzeć.
W J, jeśli
F
jest dyadyczny,F~ x
jest taki sam jakx F x
.źródło
[0..10)
, co w zasadzie oznacza losową permutację „0123456789”.J, 5 znaków i APL, 8 znaków
jot
J ma wbudowany operator transakcji (
?
). Zatem możemy wziąć 10 z 10 (10?10
).APL
APL ma tego samego operatora, który niestety zaczyna się od jednego zamiast zera. W związku z tym odejmujemy jeden od każdego numeru (
1-⍨X
oznaczaX-1
to operator dojeżdżania do pracy).źródło
10#.
⎕IO←0
nie musisz odejmować jednego. Ponadto, zarówno dla J, jak i APL, możesz użyć dojazdy do zapisania bajtu z,?~10
a?⍨10
ponieważ monadyczna aplikacja funkcji pochodnej używa swojego prawego argumentu również jako lewego argumentu. Należy jednak pamiętać, że dzięki temu kod J jest identyczny z kodem Marinusa .Python 2.7 (
646357)Tu nie ma szans w porównaniu do ciężkich języków operatora i ze względu na brak domyślnie ładowanego losowego :) To jest najkrótszy jaki mogłem wymyślić;
Tworzy zakres i pobiera z niego 10 liczb bez zamiany.
(Dzięki @xfix za krótszą poprawkę formatu importu i @blkknght za wskazanie mojego nieco über skomplikowanego zakresu próbkowania)
Python 2.7 (40)
Jeśli uruchomisz go z interaktywnego monitu i odczytasz przecinek, możesz go ogolić do 40, ale to trochę przypomina łamanie ducha reguł;
źródło
from random import*
aby uratować jedną postać. Wygląda to na moje rozwiązanie dla Perla 6, ale bardziej szczegółowe, ale wspaniale jest widzieć, że coś takiego może działać w Pythonie, nawet jeśli jest bardziej szczegółowe."0123456789"
a nie używającrange
i mapując jestr
.PHP, 29 znaków
<?=str_shuffle('0123456789');
W PHP tag zamykający nie jest wymagany. Ale jeśli jest to niezgodne z regułami, możesz je wymienić; z?> za 1 wzrost netto.
źródło
Ruby, 18 lat
Uruchom to w
irb
:Jeśli chcesz, aby był to samodzielny program z wyjściem na
stdout
(reguły nie wymagają tego), to dodaj te 4 znaki na początku:źródło
(0..9).to_a
do[*0..9]
.[*0..9].shuffle
w pierwszej kolejności?PHP - 37 znaków
Miałem 18-znakowe rozwiązanie, które teoretycznie powinno działać, ale PHP jest dziwne.
Lub jeśli chcesz odpowiedź xkcd:
EDYCJA: Dzięki xfix, teraz jest o 5 znaków krótszy i kompletny. PONOWNIE EDYCJA: Przykład na żywo .
źródło
echo
nie wymaga nawiasów, a jeśliecho
to pierwsza wypowiedź w programie, można zastąpić<?php echo
z<?=
. Ponadto,join
jest aliasemimplode
.<?=
i?>
. Bez nich jest to poprawny kod PHP.echo
ma tę samą długość<?=
i jest?>
połączona, a bez nich nie działa w Codepad. W każdym razie dzięki. : PPerl 6 (
1816 znaków)Generuje tablicę zawierającą wszystkie losowe elementy (
pick *
) od0
do9
i wyświetla wynik (print
).Przykładowe dane wyjściowe:
źródło
pick
.[~]
(który jest parsowany jako listop, zgodnie z gramatyką Perla 6) wymaga po nim spacji (lub paren), jeśli zawiera jakiekolwiek argumenty. W przeciwnym razie kompilator Perla 6 narzeka na „dwa warunki z rzędu”. Nie był potrzebny w starszych wersjach Perla 6, ale to już przeszłość. Nad Perlem 6 wciąż trwają prace.print
zamiastsay [~]
i zapisz 2 znaki :)GolfScript, 12 znaków
Po prostu generuje listę cyfr (
10,
) i sortuje ją{...}$
według losowych kluczy - co daje losową kolejność cyfr.Przykłady (spróbuj online ):
źródło
9rand
z99rand
byłoby (w większości) naprawić;9.?rand
byłoby praktycznie idealne .R (23 znaki)
Przykładowe dane wyjściowe:
źródło
TI-BASIC, 5 bajtów
źródło
randIntNoRep(0,9:.1sum(Ans10^(cumSum(1 or Ans
.Oktawa (14)
randperm
niestety tworzy selekcję od 1..n, więc odejmij 1 na końcu, aby uzyskać 0-9.źródło
Na serwerze sql
Zobacz demo
LUB coś podobnego (dzięki uprzejmości @manatwork) przy użyciu rekurencji i xml.
źródło
select i+0from(select 0i union select 1union select 2union select 3union select 4union select 5union select 6union select 7union select 8union select 9)f order by newid()for xml path('')
. (BTW, świetna sztuczkanewid()
.)with c as(select 0i union all select i+1from c where i<9)select i+0from c order by newid()for xml path('')
.(VALUES (1),(2),...)
JavaScript (
797868 znaków)Zamiast tworzyć tablicę z liczbami 0–9 i sortować ją, postanowiłem wygenerować liczby losowe. Kiedy pojawił się numer, który nie był jeszcze w tablicy, dodał go. Powtarza się to dziesięć razy, a następnie powiadamia o wynikach.
for(a="";!a[9];){~a.indexOf(b=~~(Math.random()*10))||(a+=b)}alert(a)
źródło
||
analizy zwarć zamiastif
:for(a="";!a[9];){b=Math.floor(Math.random()*10);~a.indexOf(b)||(a+=b)}alert(a)
for(a="";!a[9];){~a.indexOf(b=Math.floor(Math.random()*10))||(a+=b)}alert(a)
for(a="";!a[9];){~a.indexOf(b=~~(Math.random()*10))||(a+=b)}alert(a)
Mathematica, 27
źródło
Shell / Coreutils, 23
źródło
shuf -i0-9|tr -d \\n
shuf -zi0-9
JavaScript, 82 znaki
EDYCJA: Dzięki Rob W długość kodu jest zmniejszona do 90 znaków.
EDYCJA: Dzięki George'owi Reithowi długość kodu jest zmniejszona do 82 znaków (przy użyciu pętli).
Całkiem prosty sposób: wybierz losowy element
[0,1,2,3,4,5,6,7,8,9]
tablicy i dołącz go do wyniku, a następnie zmniejsz tablicę i odtwórz ponownie.Stara wersja (106 znaków):
Wersja do odczytu:
Lepsza wersja (90 znaków):
Ostatnia wersja (82 znaków):
JSFiddle: http://jsfiddle.net/gthacoder/qH3t9/ .
źródło
a='0123456789'.split(t=''),l=10;while(l--)t+=a[r=0|Math.random()*l],a.splice(r,1);alert(t)
. Wielcy oszczędzający:Math.random(x)
===0|x
. Zastąp nawiasy klamrowe i średniki przecinkami. Bezpośrednio użyj wyniku przypisania jako wartości, zamiast używać zmiennej pośredniej. Na koniec zainicjuj tablicę początkową za pomocą.split(r='')
. Jest to krótsze niż tworzenie tablicy za pomocą literałów tablicowych i przypisywanie wartości ciągu w osobnym wyrażeniu.Math.floor(x) === 0|x
.l=11
i zmienić warunek pętli while nawhile(--l)
a="0123456789".split(t='');for(l=11;--l;t+=a.splice(0|Math.random()*l,1));alert(t)
- Twój kod idealnie pasuje do argumentów inicjalizacji pętli for, warunku i wyrażenia.r
Zmienna jest zbędny.C #, 145 bajtów
Bez golfa
Grał w golfa
źródło
Enumerable.Range(0,10)
i nie potrzebujesz nawiasów klamrowych wforeach
pętli.JavaScript (80 znaków)
JS-Fiddle: http://jsfiddle.net/IQAndreas/3rmza/
źródło
alert("0123456789".split("").sort(n=>.5-Math.random()).join(""))
return
i.5
K / Kona (6)
Podobnie jak w przypadku J,
?
operator transakcji; gdy-
siły te wartości, aby nie powtarzać.źródło
Mathematica 40
Liczba jest tworzona jako ciąg znaków, aby w razie potrzeby wyświetlać zero jako pierwszy znak.
Przykłady wyników
Wyjaśnienie
"0"~CharacterRange~"9"
to notacja infix dla „CharacterRange [„ 0 ”,„ 9 ”]”. Każda z tych zwraca listę, {„0”, „1”, „2”, „3”, „4”, „5”, „ 6 ”,„ 7 ”,„ 8 ”,„ 9 ”}.RandomSample[list]
domyślnie zwraca permutację listy. (Może być również użyty do innych rodzajów próbkowania, gdy uwzględnione są parametry. Np. Zwróci losowąRandomSample[list, 4]
próbkę 4 znaków, bez powtórzeń.źródło
Scala, 37
źródło
Czwarty, 72
Może jeszcze pole do gry w golfa, ale Forth utrudnił mu grę. Myślę.
źródło
Prolog, 177/302 znaków
Jestem początkującym w Prologu, więc prawdopodobnie nie jest to najbardziej skondensowany kod.
Zwroty:
Jeśli chcesz, aby zwracał liczbę całkowitą:
Zwroty:
Zamiast tego użyj:
Podaje liczby w odwrotnej kolejności:
W przeciwieństwie do niektórych innych kodów, zwraca wszystkie możliwości (bez powtórzeń).
źródło
q / kdb [6 znaków]
wygeneruje 10 unikalnych liczb losowych.
źródło
√ å ı ¥ ® Ï Ø ¿ , 4 bajty
źródło
Clojure, 42
źródło
JavaScript, 83 znaki
Podczas pracy, aż tablica ma 10 elementów.
Generując losową liczbę od 0 do 9, sprawdź, czy tablica! Zawiera ten numer i dodaj go do tablicy.
źródło
To niewiele mniej niż odpowiedź JMK, ale oto nieco mniejsze rozwiązanie C # (135):
Zagęszczony (134):
Alternatywna wersja (135):
Zagęszczony:
Są równej długości, ale tak naprawdę zależy to tylko od tego, czy chcesz użyć funkcji ForEach Linqa, czy funkcji Dołączenia ciągu. Byłem w stanie usunąć 10 znaków, przeliterując zakres „0123456789” w ciągu zamiast używać Enumerable.Range (0, 10).
źródło
LOGO , 64 znaki
wybierz zwraca losowy element z dostarczonej listy. butmember zwraca listę z usuniętymi wszystkimi wystąpieniami określonego elementu. Uwaga: Nie wszystkie
butmember
polecenia obsługujące implementacje logo .źródło
Rakieta
4543źródło