Generador de código de ticket aleatorio

18

Una empresa de lotería quiere generar un número de boleto de lotería aleatorio de 10 caracteres de longitud.

Escriba un código en cualquier idioma para crear un número en el que cada dígito aparezca solo una vez, por ejemplo, 9354716208en este número todos los enteros del 0 al 9 solo aparecen una vez. Este número debe ser un número aleatorio.

  • El número generado debe mostrarse en la pantalla.
  • Debe poder generar todas las permutaciones de todos los caracteres permitidos.
  • Se requiere que el código sea lo más pequeño posible (en bytes).
Ankush
fuente
3
¿Por qué debería estar en Java o PhP?
Fabinout
44
En general, es una buena idea permitir cualquier idioma, de acuerdo con la descripción del código de golf .
Konrad Borowski
10
¿Cómo es que una de las respuestas más largas y menos desarrolladas (la respuesta SQL), sin siquiera un conteo de caracteres, es la respuesta aceptada en code-golf cuando personas como @Howard tienen respuestas de 5 u 8 caracteres?
Darren Stone
1
Sí, @marinus tiene una solución de 4 bytes (la mía es de 6 bytes)
Timtech
44
-1 La selección del ganador es incorrecta, dado que este fue un desafío de código de golf.
DavidC

Respuestas:

41

J (4 bytes)

No pude resistirme.

?~10

En J, si Fes diádico, F~ xes lo mismo que x F x.

marinus
fuente
3
+1 Creo que tengo que probar algo un poco más breve que Python para vencer esto.
Joachim Isaksson
¿Esto permite una contraseña que comienza con cero? De acuerdo con las reglas, el programa "debe ser capaz de generar todas las permutaciones de todos los caracteres permitidos"
DavidC
@DavidCarraher: sí. Selecciona 10 números aleatorios no repetidos del intervalo [0..10), por lo que básicamente significa una permutación aleatoria de '0123456789'.
marinus
1
Veo. Lo planteé porque en la mayoría de los idiomas, el "número", 0123456789, se editará automáticamente en el formulario 123456789. La cadena, "0123456789", permanece intacta. Entonces mi pregunta es realmente esta: ¿su salida es un número o una cadena?
DavidC
@DavidCarraher Es una matriz.
swish
12

J, 5 caracteres y APL, 8 caracteres

J

10?10

J tiene el operador de reparto incorporado ( ?). Por lo tanto, podemos tomar 10 de 10 ( 10?10).

APL

1-⍨10?10

APL tiene el mismo operador que desafortunadamente comienza con uno en lugar de cero. Por lo tanto, estamos restando uno de cada número ( 1-⍨Xsignifica X-1debido al operador de viaje).

Howard
fuente
Oh, wow, eso está bien.
Konrad Borowski
Si OP hubiera pedido específicamente el número, no una matriz, también debe convertirlo al número base10, con10#.
swish
Puede suponer eso ⎕IO←0para no tener que restar uno. Además, tanto para J como para APL, puede usar conmutar para guardar un byte con ?~10y ?⍨10dado que la aplicación monádica de la función derivada usa su argumento derecho también como argumento izquierdo. Sin embargo, tenga en cuenta que esto hace que el código J sea idéntico al de Marinus .
Adám
9

Python 2.7 ( 64 63 57)

No es una oportunidad aquí en comparación con los lenguajes pesados ​​del operador y debido a la falta de carga aleatoria predeterminada :) Esto es lo más corto que se me ocurrió;

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

Crea un rango y muestra 10 números de él sin reemplazo.

(Gracias a @xfix por la corrección de formato de importación más corta y a @blkknght por señalar mi rango de muestreo algo complicado)

Python 2.7 (40)

Si lo ejecuta desde el indicador interactivo y puede leer separados por comas, puede reducirlo a 40, pero se siente un poco como romper el espíritu de las reglas;

from random import*
sample(range(10),10)
Joachim Isaksson
fuente
1
Puedes usar from random import*para guardar un personaje. Esto se parece a mi solución Perl 6, pero más detallado, pero es genial ver que algo como esto puede funcionar en Python, incluso si es más detallado.
Konrad Borowski
@xfix Sí, lamentablemente los módulos en Python son un poco detallados para llegar en comparación :) Actualizado con su corrección de importación, bastante nuevo para el golf, así que no está a la altura de mis expresiones idiomáticas.
Joachim Isaksson
Puede guardar algunos caracteres más al tomar muestras de la cadena en "0123456789"lugar de rangeusarlas y asignarlas str.
Blckknght
@Blckknght Gracias, actualizado con su sugerencia :)
Joachim Isaksson
8

PHP, 29 caracteres

<?=str_shuffle('0123456789');

Con PHP, no se requiere la etiqueta de cierre. Pero si eso va en contra de las reglas, entonces puedes reemplazarlo; con?> para 1 aumento neto.

James S
fuente
Me ganaste a esta solución.
Shaun Bebbers
8

Rubí, 18

Ejecute esto en irb:

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

Si desea que este sea un programa independiente, con salida para stdout(las reglas no parecen requerir esto), agregue estos 4 caracteres al comienzo:

$><<
Piedra de Darren
fuente
Puede acortar (0..9).to_aa [*0..9].
Howard
Hecho y hecho, señor. ¡Gracias!
Darren Stone
De nada. Pero, ¿por qué no lo usas [*0..9].shuffleen primer lugar?
Howard
@Howard, porque es tarde y soy tonto. :) ¡Gracias!
Darren Stone
esta matriz de retorno con número no número
8

PHP - 37 caracteres

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

Tenía una solución de 18 caracteres que, en teoría, debería funcionar, pero PHP es extraño.

O, si quieres una respuesta xkcd:

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

EDITAR: Gracias xfix, ahora es 5 caracteres más corto y completo. EDITAR DE NUEVO: Ejemplo en vivo .

cjfaure
fuente
Escriba un programa completo, en lugar de solo partes completas. Además, echono necesita parens, y si echoes la primera declaración en el programa, puede reemplazar <?php echocon <?=. Además, joines un alias para implode.
Konrad Borowski
@xfix Gracias, lo arreglaré. :)
cjfaure
Ni siquiera necesitas el <?=y ?>. Es un código PHP válido sin esos.
jeremy
@Jeremy El golf requiere que se muestre el número; además, echo tiene la misma longitud <?=y ?>combinadas, y sin ellas, no funciona en Codepad. Gracias sin embargo. : P
cjfaure
1
@Jeremy Ah, PHP, donde las implementaciones no integradas además de un terminal son escasas. : P
cjfaure
8

Perl 6 (18 años 16 caracteres)

print pick *,^10

Esto genera una matriz que contiene todos los elementos aleatorios (pick * ) de 0a 9y envía el resultado ( print).

Salida de muestra:

$ perl6 -e 'print pick *,^10'
4801537269
$ perl6 -e 'print pick *,^10'
1970384265
$ perl6 -e 'print pick *,^10'
3571684902
Konrad Borowski
fuente
+1 Creo que no necesitas el espacio en blanco antes pick.
Howard
1
@Howard: en realidad lo necesito. [~](que se analiza como un listop, de acuerdo con la gramática de Perl 6) requiere un espacio en blanco (o paren) después si contiene algún argumento. De lo contrario, el compilador Perl 6 se queja de "dos términos seguidos". No era necesario en versiones anteriores de Perl 6, pero este es el pasado. El Perl 6 todavía se está trabajando.
Konrad Borowski el
1
@xfix: usar en printlugar de say [~]y guardar 2 caracteres :)
Ayiko
@ Ayiko: Gracias por una mejora :).
Konrad Borowski
7

GolfScript, 12 caracteres

10,{;9rand}$

Simplemente genera la lista de dígitos (10, ) y la ordena de {...}$acuerdo con algunas teclas aleatorias, lo que produce un orden aleatorio de los dígitos.

Ejemplos (prueba en línea ):

4860972315

0137462985
Howard
fuente
Estaba a punto de publicar esto: P
Pomo de la puerta
Sin embargo, es una especie de juego de basura: por ejemplo, el primer dígito es aproximadamente tres veces más probable que sea 0 que 1. Reemplazar 9randcon 99rand(en su mayoría) solucionaría eso; 9.?randSería prácticamente perfecto .
Ilmari Karonen
1
@IlmariKaronen Lo sé, pero la pregunta no decía nada sobre la distribución uniforme.
Howard
6

R (23 caracteres)

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

Salida de muestra:

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

TI-BASIC, 5 bytes

randIntNoRep(1,10
Timtech
fuente
Muestra una lista en lugar de un número. Usted está buscando randIntNoRep(0,9:.1sum(Ans10^(cumSum(1 or Ans.
lirtosiast
2
No creo que este desafío requiera un tipo entero, solo que "El número generado debe mostrarse en la pantalla" que es.
Timtech
Hmm, pensé que la pregunta era pedir un número (al igual que otros, pero parece que la intención del autor del desafío nunca se aclaró. Algunas otras soluciones salen como una lista (J y APL) en cualquier caso.
lirtosiast
Bueno, no supondría eso a menos que estuviera seguro, porque este método es más corto.
Timtech
5

Octava (14)

randperm(10)-1

randperm desafortunadamente crea una selección de 1..n, por lo que debe restar 1 al final para obtener 0-9.

Joachim Isaksson
fuente
5

En el servidor 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))

Ver demo

O algo similar (cortesía de @manatwork) usando recursividad y 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('')
vhadalgi
fuente
1
Hombre, te encantan los CTE ... Pero como se trata de un desafío de código de golf , mejor acortarlo tanto como sea posible. Mi mejor es de 186 caracteres: 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(''). (Por cierto, gran truco eso newid().)
manatwork
1
Ok, tienes razon. Es más corto con CTE. 106 caracteres: with c as(select 0i union all select i+1from c where i<9)select i+0from c order by newid()for xml path('').
manatwork
Puede simplificar el cte con(VALUES (1),(2),...)
ypercubeᵀᴹ
5

Javascript ( 79 78 68 caracteres)

En lugar de crear una matriz con los números 0-9 y ordenarlos, decidí generar números aleatorios. Cuando apareció un número que aún no estaba en la matriz, lo agregó. Esto se repite diez veces y luego alerta la salida.

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

scribblemaniac
fuente
Puede guardar 1 byte utilizando la ||evaluación de cortocircuito en lugar de if: for(a="";!a[9];){b=Math.floor(Math.random()*10);~a.indexOf(b)||(a+=b)}alert(a)
Steven Palinkas
1
@StevenPalinkas Gracias, ¡gran idea! He actualizado la publicación en consecuencia.
scribblemaniac
También podríamos guardar 2 bytes con un poco de reordenamiento en el código:for(a="";!a[9];){~a.indexOf(b=Math.floor(Math.random()*10))||(a+=b)}alert(a)
Steven Palinkas
Podemos guardar 8 bytes adicionales usando la "taquigrafía" para Math.floor como:for(a="";!a[9];){~a.indexOf(b=~~(Math.random()*10))||(a+=b)}alert(a)
Steven Palinkas
4

Mathematica, 27

Row@RandomSample@Range[0,9]

ingrese la descripción de la imagen aquí

Ajasja
fuente
Buena manera de evitar cadenas!
DavidC
4

Shell / Coreutils, 23

shuf -i0-9|paste -sd ''
Hasturkun
fuente
Si no necesitamos una nueva línea final, puede reducir esto a 20 conshuf -i0-9|tr -d \\n
joeytwiddle
¿Qué pasashuf -zi0-9
Marcosm
@marcosm: Eso te da líneas terminadas con ceros, lo cual es un poco extraño.
Hasturkun
4

JavaScript, 82 caracteres

EDITAR: Gracias a Rob W , la longitud del código se reduce a 90 caracteres.

EDITAR: Gracias a George Reith , la longitud del código se reduce a 82 caracteres (usando for loop).

Forma bastante directa: elija un elemento aleatorio de la [0,1,2,3,4,5,6,7,8,9]matriz y añádalo a la salida, luego reduzca la matriz y vuelva a reproducir.

Versión anterior (106 caracteres):

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)

Versión legible:

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);

Mejor versión (90 caracteres):

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

Última versión (82 caracteres):

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

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

gthacoder
fuente
1
Me Jugamos al golf abajo de su método a 90 caracteres: a='0123456789'.split(t=''),l=10;while(l--)t+=a[r=0|Math.random()*l],a.splice(r,1);alert(t). Grandes ahorradores: Math.random(x)=== 0|x. Reemplace las llaves y los puntos y comas con comas. Use directamente el resultado de una asignación como valor, en lugar de usar una variable intermedia. Finalmente, inicialice la matriz inicial usando .split(r=''). Esto es más corto que crear una matriz usando literales de matriz y asignar el valor de cadena en una expresión separada.
Rob W
@RobW Gracias por los consejos. Actualicé mi respuesta. PD: supongo que te refieres Math.floor(x) === 0|x.
gthacoder
1
Esto siempre tiene 9 al final. Para arreglar, inicializar l=11y cambiar su condición de bucle while awhile(--l)
Greg
@ Greg Buen punto. Gracias. Actualicé la respuesta.
gthacoder
1
82 caracteres: a="0123456789".split(t='');for(l=11;--l;t+=a.splice(0|Math.random()*l,1));alert(t)- Su código encaja perfectamente en los argumentos de inicialización, condición y expresión de bucles for. La rvariable es redundante.
George Reith
4

C #, 145 bytes

Sin golf

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);}}
JMK
fuente
1
Puede usar Enumerable.Range(0,10), y no necesita los corchetes en el foreachbucle.
Rik
3

JavaScript (80 caracteres)

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

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

IQAndreas
fuente
3
Tenga en cuenta que esto puede desarrollarse aún más utilizando una función de flecha (que actualmente solo funciona en FF, pero que pronto llegará a los intérpretes de todas partes):alert("0123456789".split("").sort(n=>.5-Math.random()).join(""))
apsillers
1
No necesita el espacio entre returny.5
Tibos
1
@Greg Shhhh! ¿Tienes idea de cuántos caracteres toma una función de barajado real ? ;)
IQAndreas
1
@Greg Es una distribución aleatoria (suponiendo que Math.random es suficientemente aleatoria), simplemente no es uniforme.
SuperJedi224
1
La publicación original del blog desapareció, agregando el archivo de internet para la posteridad: web.archive.org/web/20150212083701/http://sroucheray.org/blog/…
Greg
3

K / Kona (6)

-10?10

Al igual que con J, ?es el operador del acuerdo; las -fuerzas de los valores que se repiten.

Kyle Kanos
fuente
3

Mathematica 40

El número se crea como una cadena para permitir que se muestre cero como primer carácter, cuando sea necesario.

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

Ejemplos de salida

"0568497231"
"6813029574"

Explicación

"0"~CharacterRange~"9" es la notación infija para `CharacterRange [" 0 "," 9 "]". Cualquiera de estos devuelve la lista, {"0", "1", "2", "3", "4", "5", " 6 "," 7 "," 8 "," 9 "}.

RandomSample[list]por defecto devuelve una permutación de la lista. (También se puede usar para otros tipos de muestreo, cuando se incluyen parámetros. Por ejemplo RandomSample[list, 4], devolverá una muestra aleatoria de 4 caracteres, sin repeticiones.

DavidC
fuente
Pero, ¿por qué mostrar 0 como primer carácter?
Ankush
Según el OP, el programa "debe poder generar todas las permutaciones de todos los caracteres permitidos".
DavidC
@Ankush Esa es la notación infija, por lo que "0" no siempre es el primer carácter.
Ajasja
Ajasja está en lo correcto. El programa puede generar cualquier permutación. Agregué algunos comentarios anteriores para aclarar esto.
DavidC
3

Scala, 37

util.Random.shuffle(0 to 9).mkString
soldado.moth
fuente
2

Adelante, 72

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

Todavía hay espacio para el golf, tal vez, pero Forth lo hizo difícil. Yo creo que.

Piedra de Darren
fuente
2

Prolog, 177/302 caracteres

Soy un principiante en Prolog, por lo que probablemente este no sea el código más condensado.

:- 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).

Devoluciones:

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

Si desea que devuelva un entero:

:- 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.

Devoluciones:

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

Usando en su lugar:

labeling([down],N)

Da los números en el orden opuesto:

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

A diferencia de otros códigos publicados, esto devuelve todas las posibilidades (sin repeticiones).

Edu
fuente
2

q / kdb [6 caracteres]

-10?10

generará 10 números aleatorios únicos.

nyi
fuente
2

√ å ı ¥ ® Ï Ø ¿ , 4 bytes

XrśO

X    › Push 10 to the stack
 r   › Push the range from [1...10]
  ś  › Shuffle the stack
   O › Output the whole stack separated by spaces
caird coinheringaahing
fuente
2

Clojure, 42

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

6209847315

claj
fuente
El número generado debe mostrarse en la pantalla, no sus partes.
Sylwester
2

Javascript, 83 caracteres

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

Mientras se ejecuta hasta que la matriz tenga 10 elementos.

Generando un número aleatorio de 0 a 9, luego verifique si la matriz incluye este número y agréguelo a la matriz.

david
fuente
1
Bienvenido al sitio! :)
DJMcMayhem
1

Esto no es mucho más pequeño que la respuesta de JMK, pero aquí hay una solución C # un poco más pequeña (135):

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

Compactado (134):

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

Versión alternativa (135):

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

Comprimido:

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

Tienen la misma longitud, pero en realidad solo depende de si desea utilizar la función ForEach de Linq o la función Join de String. Pude eliminar 10 caracteres de longitud al deletrear el rango "0123456789" en una cadena en lugar de usar Enumerable.Range (0, 10).

Cameron Tinker
fuente
1

LOGOTIPO , 64 caracteres

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

pick devuelve un elemento aleatorio de la lista suministrada. butmember devuelve la lista con todas las apariciones del elemento especificado eliminado. Nota: No todas las implementaciones de Logo admiten butmembercomandos.

Sandman4
fuente
1

Raqueta 45 43

(map print(shuffle'(0 1 2 3 4 5 6 7 8 9)))
Sylwester
fuente