Generatore di codici di ticket casuali


18

Una società di lotteria vuole generare un numero di biglietto della lotteria casuale di lunghezza 10 caratteri.

Scrivi un codice in qualsiasi lingua per creare un tale numero in cui ogni cifra arriva una sola volta, ad esempio 9354716208in questo numero tutti i numeri interi da 0 a 9 arrivano solo una volta. Questo numero dovrebbe essere un numero casuale.

  • Il numero generato dovrebbe essere mostrato sullo schermo.
  • Deve essere in grado di generare tutte le permutazioni di tutti i caratteri consentiti.
  • Il codice deve essere il più piccolo possibile (in byte).

3
Perché dovrebbe essere in Java o PhP?
Fabinout,

4
In generale, è una buona idea consentire qualsiasi lingua, secondo la descrizione del code-golf .
Konrad Borowski il

10
Com'è possibile che una delle risposte più lunghe e meno giocate a golf (la risposta SQL), senza nemmeno un conteggio dei caratteri, sia la risposta accettata nel code-golf quando persone come @Howard hanno risposte di 5 o 8 caratteri?
Darren Stone,

1
Sì, @marinus ha una soluzione a 4 byte (la mia è 6 byte)
Timtech

4
-1 La selezione del vincitore non è corretta, dato che si trattava di una sfida con il codice-golf.
DavidC,

Risposte:


41

J (4 byte)

Non ho resistito.

?~10

In J, se Fè diadico, F~ xè lo stesso di x F x.


3
+1 Penso che dovrei provare qualcosa di leggermente più conciso di Python per batterlo.
Joachim Isaksson,

Questo consente una password che inizia con zero? Secondo le regole, il programma "deve essere in grado di generare tutte le permutazioni di tutti i caratteri consentiti"
DavidC

@DavidCarraher: si. Seleziona 10 numeri casuali non ripetitivi dall'intervallo [0..10), in modo che sostanzialmente significhi una permutazione casuale di '0123456789'.
Marin

1
Vedo. Ho sollevato questo perché nella maggior parte delle lingue, il "numero", 0123456789, verrà automaticamente modificato nel modulo 123456789. La stringa, "0123456789", rimane invariata. Quindi la mia domanda è davvero questa: il tuo output è un numero o una stringa?
DavidC,

@DavidCarraher È un array.
Swish

12

J, 5 caratteri e APL, 8 caratteri

J

10?10

J ha l'operatore affare integrato ( ?). Quindi, possiamo prendere 10 su 10 ( 10?10).

APL

1-⍨10?10

APL ha lo stesso operatore che sfortunatamente inizia con uno invece di zero. Ne stiamo quindi sottraendo uno da ciascun numero ( 1-⍨Xsignifica X-1dovuto all'operatore del tragitto giornaliero).


Oh, wow, è carino.
Konrad Borowski il

Se OP avrebbe richiesto specificamente il numero non un array, è necessario convertirlo anche in numero base10, con10#.
swish

Puoi presumere che ⎕IO←0non devi sottrarre uno. Inoltre, sia per J che per APL, è possibile utilizzare il pendolarismo per salvare un byte con ?~10e ?⍨10poiché l'applicazione monadica della funzione derivata usa il suo argomento destro anche come argomento sinistro. NOTA tuttavia, ciò rende il codice J identico a quello di Marinus .
Adám,

9

Python 2.7 ( 64 63 57)

Non è una possibilità qui rispetto alle lingue pesanti dell'operatore ea causa della mancanza di default caricati casualmente :) Questo è il più breve che ho potuto inventare;

from random import*
print''.join(sample("0123456789",10))

Crea un intervallo e ne campiona 10 numeri senza sostituzione.

(Grazie a @xfix per la correzione del formato di importazione più breve e @blkknght per aver sottolineato il mio intervallo di campionamento un po 'complicato)

Python 2.7 (40)

Se lo esegui dal prompt interattivo e riesci a leggere la virgola separata, puoi raderlo a 40, ma sembra un po 'come spezzare lo spirito delle regole;

from random import*
sample(range(10),10)

1
Puoi usare from random import*per salvare un personaggio. Sembra la mia soluzione Perl 6, ma più dettagliata, ma è bello vedere che qualcosa di simile può funzionare in Python, anche se più dettagliato.
Konrad Borowski il

@xfix Sì, purtroppo i moduli in Python sono un po 'dettagliati per essere confrontati :) Aggiornato con la tua correzione di importazione, abbastanza nuovo per la cosa del golf, quindi non fino a "par" sui miei modi di dire.
Joachim Isaksson,

Puoi salvare qualche carattere in più campionando dalla stringa "0123456789"anziché usando rangee mappandoli str.
Blckknght,

@Blckknght Grazie, aggiornato con il tuo suggerimento :)
Joachim Isaksson

8

PHP, 29 caratteri

<?=str_shuffle('0123456789');

Con PHP, il tag di chiusura non è richiesto. Ma se questo è contro le regole, puoi sostituirlo; con?> per 1 aumento netto.


Mi hai battuto per questa soluzione.
Shaun Bebbers,

8

Ruby, 18 anni

Esegui questo in irb:

[*0..9].shuffle*''

Se vuoi che questo sia un programma autonomo, con output in stdout(le regole non sembrano richiederlo ), aggiungi questi 4 caratteri all'inizio:

$><<

Si può accorciare (0..9).to_aa [*0..9].
Howard,

Fatto e fatto, signore. Grazie!
Darren Stone,

Prego. Ma perché non usi [*0..9].shufflein primo luogo?
Howard,

@Howard, perché è tardi e sono stupido. :) Grazie!
Darren Stone,

questo array di ritorno con numero non numero

8

PHP - 37 personaggi

<?=join('',array_rand(range(0,9),10))

Avevo una soluzione di 18 caratteri che teoricamente dovrebbe funzionare, ma PHP è strano.

Oppure, se vuoi una risposta xkcd:

<?="5398421706" // Chosen by program above; guaranteed to be random ?>

EDIT: grazie a xfix, ora è 5 caratteri più breve e completo. MODIFICA ANCORA: esempio live .


Scrivi un programma completo, anziché solo parti complete. Inoltre, echonon ha bisogno di parentesi e se echoè la prima istruzione nel programma, puoi sostituirla <?php echocon <?=. Inoltre, joinè un alias per implode.
Konrad Borowski il

@xfix Grazie, risolverò. :)
cjfaure,

Non hai nemmeno bisogno del <?=e ?>. È un codice PHP valido senza quelli.
Jeremy,

@Jeremy Il golf richiede che il numero sia visualizzato; inoltre, echo è della stessa lunghezza <?=e ?>combinato, e senza quelli, non funziona in Codepad. Grazie comunque. : P
cjfaure,

1
@Jeremy Ah, PHP, dove le implementazioni non integrate oltre a un terminale sono scarse. : P
cjfaure,

8

Perl 6 (18 16 caratteri)

print pick *,^10

Questo genera un array contenente tutti gli elementi casuali ( pick *) da 0a 9e genera il risultato ( print).

Uscita campione:

$ perl6 -e 'print pick *,^10'
4801537269
$ perl6 -e 'print pick *,^10'
1970384265
$ perl6 -e 'print pick *,^10'
3571684902

+1 Penso che non ti serva prima lo spazio bianco pick.
Howard,

1
@Howard: ne ho davvero bisogno. [~](che viene analizzato come listop, secondo la grammatica Perl 6) richiede uno spazio bianco (o parentesi) dopo di esso se contiene argomenti. Altrimenti, il compilatore Perl 6 si lamenta di "due termini di fila". Non era necessario nelle versioni precedenti di Perl 6, ma questo è il passato. Il Perl 6 è ancora in fase di elaborazione.
Konrad Borowski il

1
@xfix: usa printinvece di say [~]e salva 2 caratteri :)
Ayiko

@Ayiko: grazie per un miglioramento :).
Konrad Borowski il

7

GolfScript, 12 caratteri

10,{;9rand}$

Genera semplicemente l'elenco di cifre ( 10,) e lo ordina in {...}$base ad alcune chiavi casuali, il che produce un ordine casuale delle cifre.

Esempi (prova online ):

4860972315

0137462985

Stavo per postare questo: P
Maniglia

È una specie di schifezza, però: per esempio, la prima cifra ha una probabilità circa tre volte maggiore di 0 di 1. Sostituire 9randcon 99rand(per lo più) risolverebbe ciò; 9.?randsarebbe praticamente perfetto .
Ilmari Karonen,

1
@IlmariKaronen Lo so, ma la domanda non ha detto nulla sulla distribuzione uniforme.
Howard,

6

R (23 caratteri)

cat(sample(0:9),sep="")

Uscita campione:

> cat(sample(0:9),sep="")
3570984216
> cat(sample(0:9),sep="")
3820791654
> cat(sample(0:9),sep="")
0548697132

6

TI-BASIC, 5 byte

randIntNoRep(1,10

Visualizza un elenco anziché un numero. Stai cercando randIntNoRep(0,9:.1sum(Ans10^(cumSum(1 or Ans.
lirtosiast,

2
Non credo che questa sfida richieda un tipo intero, solo che "Il numero generato dovrebbe essere mostrato sullo schermo" che è.
Timtech,

Hmm, ho pensato che la domanda richiedesse un numero (come hanno fatto altri, ma sembra che l'intento dell'autore della sfida non sia mai stato chiarito. Alcune altre soluzioni
escono

Beh, non lo presumo a meno che non ne fossi sicuro, perché questo metodo è più breve.
Timtech,

5

Ottava (14)

randperm(10)-1

randperm purtroppo crea una selezione da 1..n, quindi è necessario sottrarre 1 alla fine per ottenere 0-9.


5

Nel server sql

DECLARE @RandomNo varchar(10)
SET @RandomNo = ''

;WITH num as (
SELECT 0 AS [number]
Union 
select 1
Union 
select 2
Union 
select 3
Union 
select 4
Union 
select 5
Union 
select 6
Union 
select 7
Union 
select 8
Union 
select 9
)
SELECT Top 9 @RandomNo = COALESCE(@RandomNo + '', '') + cast(n.number AS varchar(1))
FROM numbers n
ORDER BY NEWID()

SELECT cast(@RandomNo AS numeric(10,0))

Vedi la demo

O qualcosa di simile (per gentile concessione di @manatwork) usando ricorsione e xml.

with c as(select 0i union all select i+1from c where i<9)select i+0from c order by newid()for xml path('')

1
Amico, ami i CTE ... Ma dato che si tratta di una sfida di code-golf , abbreviala meglio il più possibile. Il mio migliore è 186 caratteri: 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(''). (A proposito, ottimo trucco newid().)
Manatwork

1
Ok hai ragione. È più breve con CTE. 106 caratteri: with c as(select 0i union all select i+1from c where i<9)select i+0from c order by newid()for xml path('').
arte

Puoi semplificare il cte con(VALUES (1),(2),...)
ypercubeᵀᴹ

5

Javascript ( 79 78 68 caratteri)

Invece di creare un array con i numeri 0-9 e ordinarlo, ho deciso di generare numeri casuali. Quando è arrivato un numero che non era già nell'array, lo ha aggiunto. Ciò si ripete dieci volte e quindi avvisa l'output.

for(a="";!a[9];){~a.indexOf(b=~~(Math.random()*10))||(a+=b)}alert(a)


Puoi salvare 1 byte usando la ||valutazione del cortocircuito invece di ifcome: for(a="";!a[9];){b=Math.floor(Math.random()*10);~a.indexOf(b)||(a+=b)}alert(a)
Steven Palinkas,

1
@StevenPalinkas Grazie, ottima idea! Ho aggiornato il post di conseguenza.
scribblemaniac,

Potremmo anche salvare 2 byte con un po 'di riarrangiamento nel codice:for(a="";!a[9];){~a.indexOf(b=Math.floor(Math.random()*10))||(a+=b)}alert(a)
Steven Palinkas,

Possiamo salvare altri 8 byte usando la "scorciatoia" per Math.floor come:for(a="";!a[9];){~a.indexOf(b=~~(Math.random()*10))||(a+=b)}alert(a)
Steven Palinkas


4

Shell / Coreutils, 23

shuf -i0-9|paste -sd ''

Se non abbiamo bisogno di una nuova riga finale, puoi radere questo a 20 conshuf -i0-9|tr -d \\n
joeytwiddle

che direshuf -zi0-9
marcosm,

@marcosm: Questo ti dà linee terminate con zeri, il che è leggermente strano.
Hasturkun,

4

JavaScript, 82 caratteri

EDIT: grazie a Rob W , la lunghezza del codice è ridotta a 90 caratteri.

EDIT: grazie a George Reith , la lunghezza del codice è ridotta a 82 caratteri (usando per il ciclo).

Modo piuttosto semplice: scegli un elemento casuale [0,1,2,3,4,5,6,7,8,9]dell'array e aggiungilo all'output, quindi riduci l'array e il replay.

Vecchia versione (106 caratteri):

a=[0,1,2,3,4,5,6,7,8,9],l=11,t="";while(--l){r=Math.floor(Math.random()*l);t+=a[r];a.splice(r,1);}alert(t)

Versione leggibile:

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], l = 10,t = "";
while(l--) {
  r = Math.floor(Math.random() * l);
  t += a[r];
  a.splice(r, 1);
}
alert(t);

Versione migliore (90 caratteri):

a="0123456789".split(t=""),l=11;while(--l)t+=a[r=0|Math.random()*l],a.splice(r,1);alert(t)

Ultima versione (82 caratteri):

a="0123456789".split(t='');for(l=11;--l;t+=a.splice(0|Math.random()*l,1));alert(t)

JSFiddle: http://jsfiddle.net/gthacoder/qH3t9/ .


1
Ho giocato a golf il vostro metodo per 90 caratteri: a='0123456789'.split(t=''),l=10;while(l--)t+=a[r=0|Math.random()*l],a.splice(r,1);alert(t). Grandi risparmiatori: Math.random(x)=== 0|x. Sostituisci parentesi graffe e punti e virgola con virgole. Utilizza direttamente il risultato di un'assegnazione come valore, anziché utilizzare una variabile intermedia. Infine, inizializza l'array iniziale usando .split(r=''). È più breve della creazione di un array usando valori letterali di array e assegnando il valore di stringa in un'espressione separata.
Rob W,

@RobW Grazie per i suggerimenti. Ho aggiornato la mia risposta. PS Immagino volessi dire Math.floor(x) === 0|x.
gthacoder,

1
Questo ha sempre 9 alla fine. Per correggere, inizializzare l=11e cambiare la condizione del ciclo while suwhile(--l)
Greg

@Greg Un buon punto. Grazie. Ho aggiornato la risposta.
gthacoder,

1
82 Caratteri: a="0123456789".split(t='');for(l=11;--l;t+=a.splice(0|Math.random()*l,1));alert(t)- Il codice si adatta perfettamente agli argomenti di inizializzazione, condizione ed espressione dei loop. La rvariabile è ridondante.
George Reith,

4

C #, 145 byte

Ungolfed

using System;
using System.Linq;
class P
{
    static void Main()
    {
        Enumerable.Range(0,10).OrderBy(g => Guid.NewGuid()).ToList().ForEach(Console.Write);
    }
}

golfed

using System;using System.Linq;class P{static void Main(){Enumerable.Range(0,10).OrderBy(g => Guid.NewGuid()).ToList().ForEach(Console.Write);}}

1
Puoi usare Enumerable.Range(0,10)e non hai bisogno delle parentesi graffe nel foreachloop.
Rik,

3

JavaScript (80 caratteri)

alert("0123456789".split("").sort(function(){return .5-Math.random()}).join(""))

JS-Fiddle: http://jsfiddle.net/IQAndreas/3rmza/


3
Nota che questo può essere ulteriormente migliorato usando una funzione freccia (che attualmente funziona solo in FF, ma arriverà presto agli interpreti ovunque):alert("0123456789".split("").sort(n=>.5-Math.random()).join(""))
apsillers

1
Non è necessario lo spazio tra returne.5
Tibos,

1
@Greg Shhhh ! Hai idea di quanti personaggi abbia una vera funzione di mescolamento? ;)
IQAndreas

1
@Greg È una distribuzione casuale (supponendo che Math.random sia sufficientemente casuale), non è uniforme.
SuperJedi224

1
Il post originale del blog è sparito, aggiungendo l'archivio Internet per i posteri: web.archive.org/web/20150212083701/http://sroucheray.org/blog/…
Greg

3

K / Kona (6)

-10?10

Come per J, ?è l'operatore commerciale; le -forze i valori da non ripetere.


3

Mathematica 40

Il numero viene creato come una stringa in modo da consentire a zero di essere visualizzato come primo carattere, quando necessario.

""<>RandomSample["0"~CharacterRange~"9"]

Esempi di output

"0568497231"
"6813029574"

Spiegazione

"0"~CharacterRange~"9" è notazione infissa per `CharacterRange [" 0 "," 9 "]". Ognuno di questi restituisce l'elenco, {"0", "1", "2", "3", "4", "5", " 6" , "7", "8", "9"}.

RandomSample[list]per impostazione predefinita restituisce una permutazione dell'elenco. (Può essere utilizzato anche per altri tipi di campionamento, quando sono inclusi parametri. Ad esempio RandomSample[list, 4]restituirà un campione casuale di 4 caratteri, senza ripetizioni.


Ma perché visualizzare 0 come primo carattere?
Ankush,

Secondo l'OP, il programma "deve essere in grado di generare tutte le permutazioni di tutti i caratteri consentiti".
DavidC,

@Ankush Questa è la notazione infix, quindi "0" non è sempre il primo carattere.
Ajasja,

Ajasja è corretta. Il programma può generare qualsiasi permutazione. Ho aggiunto alcune osservazioni sopra per chiarire questo.
DavidC,


2

Avanti, 72

needs random.fs : r ': '0 do i loop 9 for i 1+ random roll emit next ; r

Forse c'è ancora spazio per giocare a golf, ma Forth lo ha reso difficile. Penso.


2

Prolog, 177/302 caratteri

Sono un principiante su Prolog, quindi probabilmente questo non è il codice più condensato.

:- use_module(library(clpfd)).
sort(N) :-
    N = [N0,N1,N2,N3,N4,N5,N6,N7,N8,N9],
    domain([N0],1,9),
    domain([N1,N2,N3,N4,N5,N6,N7,N8,N9],0,9),
    all_different(N),
    labeling([],N).

Ritorna:

| ?- sort2(N).                                         
N = [1,0,2,3,4,5,6,7,8,9] ? ;
N = [1,0,2,3,4,5,6,7,9,8] ? ;
N = [1,0,2,3,4,5,6,8,7,9] ? ;
N = [1,0,2,3,4,5,6,8,9,7] ? ;
N = [1,0,2,3,4,5,6,9,7,8] ? 
yes

Se vuoi che restituisca un numero intero:

:- use_module(library(clpfd)).
sort(M) :-
    N = [N0,N1,N2,N3,N4,N5,N6,N7,N8,N9],
    domain([N0],1,9),
    domain([N1,N2,N3,N4,N5,N6,N7,N8,N9],0,9),
    all_different(N),
    labeling([],N),
    M is (N0*1000000000)+(N1*100000000)+(N2*10000000)+(N3*1000000)+
         (N4*100000)+(N5*10000)+(N6*1000)+(N7*100)+(N8*10)+N9.

Ritorna:

| ?- sort(N).
N = 1023456789 ? ;
N = 1023456798 ? ;
N = 1023456879 ? ;
N = 1023456897 ? ;
N = 1023456978 ? 
yes

Utilizzando invece:

labeling([down],N)

Fornisce i numeri nell'ordine opposto:

| ?- sort(N).                                        
N = 9876543210 ? n
N = 9876543201 ? n
N = 9876543120 ? n
N = 9876543102 ? n
N = 9876543021 ? 
yes

A differenza di altri codici pubblicati, questo restituisce tutte le possibilità (senza ripetizioni).




2

Clojure, 42

(println (apply str (shuffle (range 10))))

6209847315


Il numero generato dovrebbe essere mostrato sullo schermo, non è parti.
Sylwester,

2

Javascript, 83 caratteri

a=[];while(!a[9]){b=Math.floor(Math.random()*10);!a.includes(b)&&a.push(b)}alert(a)

Durante l'esecuzione fino a quando l'array ha 10 elementi.

Generando un numero casuale da 0 a 9, controlla se l'array include questo numero e aggiungilo all'array.


1
Benvenuti nel sito! :)
DJMcMayhem

1

Questo non è molto più piccolo della risposta di JMK, ma ecco una soluzione C # leggermente più piccola (135):

using System;
using System.Linq;
class P { 
    static void Main() 
    { 
        Console.Write(string.Join("", "0123456789".OrderBy(g => Guid.NewGuid()))); 
    } 
}

Compattato (134):

using System;using System.Linq;class P{static void Main(){Console.Write(string.Join("", "0123456789".OrderBy(g => Guid.NewGuid())));}}

Versione alternativa (135):

using System;
using System.Linq;
class P { 
    static void Main() 
    { 
        "0123456789".OrderBy(g => Guid.NewGuid()).ToList().ForEach(Console.Write); 
    } 
}

Compatto:

using System;using System.Linq;class P{static void Main(){"0123456789".OrderBy(g => Guid.NewGuid()).ToList().ForEach(Console.Write);}}

Sono uguali in lunghezza, ma dipende solo se si desidera utilizzare la funzione ForEach di Linq o la funzione Join di String. Sono stato in grado di rimuovere 10 caratteri di lunghezza spiegando l'intervallo "0123456789" in una stringa anziché utilizzare Enumerable.Range (0, 10).


1

LOGO , 64 caratteri

make "d 1234567890
repeat 10 [
    make "n pick d
    show n
    make "d butmember n d
]

pick restituisce un elemento casuale dell'elenco fornito. butmember restituisce l'elenco con tutte le occorrenze dell'elemento specificato rimosse. Nota: non tutte le implementazioni del logo supportano il butmembercomando.


1

Racchetta 45 43

(map print(shuffle'(0 1 2 3 4 5 6 7 8 9)))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.