Gerador aleatório de código de ticket


18

Uma empresa de loteria deseja gerar um número aleatório de bilhete de loteria com 10 caracteres.

Escreva um código em qualquer idioma para criar um número no qual cada dígito venha apenas uma vez, por exemplo 9354716208, nesse número todos os números inteiros de 0 a 9 vêm apenas uma vez. Este número deve ser um número aleatório.

  • O número gerado deve ser mostrado na tela.
  • Ele deve ser capaz de gerar todas as permutações de todos os caracteres permitidos.
  • É necessário que o código seja o menor possível (em bytes).

3
Por que deveria ser em Java ou PhP?
Fabinout 6/14

4
Geralmente, é uma boa ideia permitir qualquer idioma, de acordo com a descrição do code-golf .
21978 Konrad Borowski

10
Como é que uma das respostas mais longas e menos golfadas (a resposta SQL), sem sequer uma contagem de caracteres, permanece como a resposta aceita no code-golf quando pessoas como @Howard têm respostas de 5 ou 8 caracteres?
Darren Pedra

1
Sim, @marinus tem uma solução de 4 bytes (o meu é 6 bytes)
Timtech

4
-1 A seleção do vencedor é inadequada, pois esse foi um desafio para o código-golfe.
21420

Respostas:


41

J (4 bytes)

Não pude resistir.

?~10

Em J, se Fé diádico, F~ xé o mesmo que x F x.


3
+1 Acho que preciso tentar algo um pouco mais conciso que o Python para superar isso.
Joachim Isaksson

Isso permite uma senha que começa com zero? De acordo com as regras, o programa "deve ser capaz de gerar todas as permutações de todos os caracteres permitidos"
DavidC

@DavidCarraher: sim. Ele seleciona 10 números aleatórios sem repetição no intervalo [0..10), o que significa basicamente uma permutação aleatória de '0123456789'.
marinus

1
Entendo. Eu levantei isso porque, na maioria dos idiomas, o "número" 0123456789 será automaticamente editado para o formulário 123456789. A sequência "0123456789" permanece intocada. Então, minha pergunta é realmente a seguinte: sua saída é um número ou uma string?
DavidC

@DavidCarraher É uma matriz.
swish

12

J, 5 caracteres e APL, 8 caracteres

J

10?10

J tem o operador de negócio interno ( ?). Assim, podemos tirar 10 de 10 ( 10?10).

APL

1-⍨10?10

O APL tem o mesmo operador que infelizmente começa com um em vez de zero. Portanto, subtraímos um de cada número ( 1-⍨Xsignifica X-1devido ao operador de deslocamento).


Uau, isso é legal.
21978 Konrad Borowski

Se o OP tivesse solicitado especificamente o número que não é uma matriz, você também deveria convertê-lo para o número base10, com10#.
swish

Você pode assumir que ⎕IO←0não precisa subtrair um. Além disso, para J e APL, é possível usar comutação para salvar um byte ?~10e, ?⍨10como o aplicativo monádico da função derivada também usa seu argumento à direita como argumento à esquerda. Observe, no entanto, que isso torna o código J idêntico ao de Marinus .
Adám 18/01/19

9

Python 2.7 ( 64 63 57)

Nenhuma chance aqui em comparação com as linguagens pesadas do operador e devido à falta de padrão carregado aleatoriamente :) Este é o menor tempo que pude apresentar;

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

Ele cria um intervalo e obtém amostras de 10 números sem substituição.

(Obrigado ao @xfix pela correção mais curta do formato de importação e ao @blkknght por apontar meu intervalo de amostragem um pouco mais complicado)

Python 2.7 (40)

Se você executá-lo no prompt interativo e pode ler separado por vírgula, pode reduzi-lo a 40, mas parece um pouco como quebrar o espírito das regras;

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

1
Você pode usar from random import*para salvar um caractere. Parece a minha solução Perl 6, mas mais detalhada, mas é ótimo ver que algo assim pode funcionar em Python, mesmo que mais detalhado.
Konrad Borowski

@xfix Sim, infelizmente, os módulos em Python são um pouco detalhados para comparação :) Atualizados com sua correção de importação, são bastante novos na coisa do golfe, por isso não são "par" nos meus idiomas.
Joachim Isaksson

Você pode salvar mais alguns caracteres amostrando a partir da string em "0123456789"vez de usá range-los e mapear str.
Blckknght

Graças @Blckknght, atualizado com a sua sugestão :)
Joachim Isaksson

8

PHP, 29 caracteres

<?=str_shuffle('0123456789');

Com o PHP, a tag de fechamento não é necessária. Mas se isso for contra as regras, você poderá substituir; com?> para 1 aumento líquido.


Você me venceu nesta solução.
Shaun Bebbers

8

Ruby, 18

Execute isso em irb:

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

Se você deseja que este seja um programa independente, com saída para stdout(as regras parecem não exigir isso), adicione estes 4 caracteres no início:

$><<

Você pode encurtar (0..9).to_apara [*0..9].
Howard

Feito e pronto, senhor. Obrigado!
Darren Pedra

Seja bem-vindo. Mas por que você não usa [*0..9].shuffleem primeiro lugar?
Howard

@ Howard, porque é tarde e eu sou burra. :) Obrigado!
Darren Pedra

esta matriz de retorno com número não número

8

PHP - 37 caracteres

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

Eu tinha uma solução de 18 caracteres que deveria teoricamente funcionar, mas o PHP é estranho.

Ou, se você quiser uma resposta xkcd:

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

EDIT: Obrigado xfix, agora é 5 caracteres mais curtos e completos. Editar novamente: exemplo ao vivo .


Escreva um programa completo, em vez de apenas partes completas. Além disso, echonão precisa de parênteses, e se echoé a primeira instrução do programa, você pode substituir <?php echopor <?=. Além disso, joiné um alias para implode.
precisa saber é o seguinte

@xfix Obrigado, eu vou consertar. :)
cjfaure

Você nem precisa do <?=e ?>. É um código PHP válido sem esses.
Jeremy

@ Jeremy O golfe exige que o número seja exibido; além disso, echo tem o mesmo comprimento que <?=e ?>combinado e, sem esses, não funciona no Codepad. Obrigado embora. : P
cjfaure

1
@ Jeremy Ah, PHP, onde implementações não incorporadas além de um terminal são escassas. : P
cjfaure

8

Perl 6 (18 16 caracteres)

print pick *,^10

Isto gera matriz que contém todos os elementos aleatórios ( pick *) a partir 0de 9e envia o resultado ( print).

Saída de amostra:

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

+1 Acho que você não precisa do espaço em branco antes pick.
Howard

1
@ Howard: Eu realmente preciso disso. [~](que é analisado como um listop, de acordo com a gramática Perl 6) requer um espaço em branco (ou paren) depois se houver algum argumento. Caso contrário, o compilador Perl 6 reclama sobre "dois termos em linha". Não era necessário em versões mais antigas do Perl 6, mas este é o passado. O Perl 6 ainda está sendo trabalhado.
Konrad Borowski

1
@xfix: usar print, em vez de say [~]e salvar 2 caracteres :)
Ayiko

@ Ayiko: Obrigado por uma melhoria :).
precisa saber é o seguinte

7

GolfScript, 12 caracteres

10,{;9rand}$

Simplesmente gera a lista de dígitos ( 10,) e a classifica de {...}$acordo com algumas teclas aleatórias - o que gera uma ordem aleatória dos dígitos.

Exemplos (tente online ):

4860972315

0137462985

Eu estava prestes a postar isso: P
Maçaneta da porta

No entanto, é uma espécie de baralhamento porcaria: por exemplo, o primeiro dígito tem cerca de três vezes mais chances de ser 0 que 1. Substituir 9randpor 99rand(principalmente) corrige isso; 9.?randseria praticamente perfeito .
Ilmari Karonen

1
@IlmariKaronen eu sei, mas a pergunta não disse nada sobre distribuição uniforme.
Howard

6

R (23 caracteres)

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

Saída de amostra:

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

6

TI-BASIC, 5 bytes

randIntNoRep(1,10

Exibe uma lista em vez de um número. Você está procurando randIntNoRep(0,9:.1sum(Ans10^(cumSum(1 or Ans.
precisa saber é o seguinte

2
Eu não acho que esse desafio exija um tipo inteiro, apenas que "O número gerado deve ser mostrado na tela".
Timtech 15/02

Hmm, achei que a pergunta estava pedindo um número (assim como outros, mas parece que a intenção do autor do desafio nunca foi esclarecida. Algumas outras soluções
saem

Bem, eu não assumiria isso a menos que tivesse certeza, porque esse método é mais curto.
Timtech 16/02

5

Oitava (14)

randperm(10)-1

randperm infelizmente, cria uma seleção de 1..n, então é necessário subtrair 1 no final para obter 0-9.


5

No 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 demonstração

OU algo semelhante (cortesia de @manatwork) usando recursão 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
Cara, você ama CTEs ... Mas, como esse é um desafio do código-golfe , reduza-o o máximo possível. Meu melhor é 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(''). (BTW, grande truque que newid().)
manatwork

1
Ok, você está certo. É mais curto com 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

Você pode simplificar o cte com(VALUES (1),(2),...)
ypercubeᵀᴹ

5

Javascript ( 79 78 68 caracteres)

Em vez de criar uma matriz com os números de 0 a 9 e classificá-la, decidi gerar números aleatórios. Quando surgiu um número que ainda não estava na matriz, ele foi adicionado. Isso se repete dez vezes e depois alerta a saída.

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


Você pode salvar 1 byte usando ||a avaliação de curto-circuito em vez de ifcomo: for(a="";!a[9];){b=Math.floor(Math.random()*10);~a.indexOf(b)||(a+=b)}alert(a)
Steven Palinkas

1
@StevenPalinkas Obrigado, ótima idéia! Eu atualizei a postagem de acordo.
Scribblemaniac #

Nós também poderia salvar 2 bytes com um pouco de rearranjo no código:for(a="";!a[9];){~a.indexOf(b=Math.floor(Math.random()*10))||(a+=b)}alert(a)
Steven Palinkas

Podemos salvar 8 bytes adicionais usando a "abreviação" 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]

insira a descrição da imagem aqui


Ótima maneira de evitar seqüências de caracteres!
21477

4

Shell / Coreutils, 23

shuf -i0-9|paste -sd ''

Se nós não precisamos de uma nova linha de fuga, você pode raspar isso para 20 comshuf -i0-9|tr -d \\n
joeytwiddle

o que dizershuf -zi0-9
marcosm

@marcosm: Isso fornece linhas terminadas com zeros, o que é um pouco estranho.
Hasturkun

4

JavaScript, 82 caracteres

EDIT: Graças a Rob W , o comprimento do código é reduzido para 90 caracteres.

EDIT: Graças a George Reith , o comprimento do código é reduzido para 82 caracteres (usando o loop for).

Maneira bem direta: escolha um elemento aleatório de [0,1,2,3,4,5,6,7,8,9] array e anexe-o à saída, depois reduza o array e repita.

Versão antiga (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)

Versão legível:

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

Versão melhorada (90 caracteres):

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

Última versão (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/ .


1
I golfed o seu método para 90 caracteres: a='0123456789'.split(t=''),l=10;while(l--)t+=a[r=0|Math.random()*l],a.splice(r,1);alert(t). Grandes poupadores: Math.random(x)=== 0|x. Substitua chaves e ponto e vírgula por vírgulas. Use diretamente o resultado de uma atribuição como um valor, em vez de usar uma variável intermediária. Por fim, inicialize a matriz inicial usando .split(r=''). Isso é mais curto do que criar uma matriz usando literais de matriz e atribuir o valor da sequência em uma expressão separada.
22614 Robert W

@ RobW Obrigado pelas dicas. Eu atualizei minha resposta. PS Eu acho que você quis dizer Math.floor(x) === 0|x.
Gthacoder

1
Isso sempre tem 9 no final. Para corrigir, inicializar l=11e alternar sua condição de loop while parawhile(--l)
Greg

@Greg Bom ponto. Obrigado. Eu atualizei a resposta.
Gthacoder 6/01/14

1
82 caracteres: a="0123456789".split(t='');for(l=11;--l;t+=a.splice(0|Math.random()*l,1));alert(t)- Seu código se encaixa perfeitamente nos argumentos de inicialização, condição e expressão de loops for. A rvariável é redundante.
George Reith

4

C #, 145 bytes

Ungolfed

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

Golfe

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

1
Você pode usar Enumerable.Range(0,10)e não precisa dos colchetes no foreachloop.
Rik

3

JavaScript (80 caracteres)

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

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


3
Observe que isso pode ser aprimorado usando uma função de seta (que atualmente só funciona no FF, mas está disponível em breve para intérpretes em todos os lugares):alert("0123456789".split("").sort(n=>.5-Math.random()).join(""))
apsillers

1
Você não precisa do espaço entre returne.5
Tibos

1
@Greg Shhhh! Você tem alguma ideia de quantos caracteres a verdadeira função de embaralhamento leva? ;)
IQAndreas

1
@ Greg É uma distribuição aleatória (supondo que Math.random seja suficientemente aleatório), mas não é uniforme.
precisa saber é o seguinte

1
A postagem original do blog se foi, adicionando o arquivo da Internet para a posteridade: web.archive.org/web/20150212083701/http://sroucheray.org/blog/…
Greg

3

K / Kona (6)

-10?10

Assim como J, ?é o operador da transação; as -forças os valores para não repetir.


3

Mathematica 40

O número é criado como uma sequência para permitir que zero seja exibido como o primeiro caractere, quando necessário.

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

Exemplos de saída

"0568497231"
"6813029574"

Explicação

"0"~CharacterRange~"9" é uma notação de infixo para `CharacterRange [" 0 "," 9 "]". Qualquer um desses retorna a lista, {"0", "1", "2", "3", "4", "5", " 6 "," 7 "," 8 "," 9 "}.

RandomSample[list]por padrão, retorna uma permutação da lista. (Também pode ser usado para outros tipos de amostragem, quando os parâmetros são incluídos. Por exemplo RandomSample[list, 4], retornará uma amostra aleatória de 4 caracteres, sem repetições.


Mas por que exibir 0 como o primeiro caractere?
Ankush #

De acordo com o OP, o programa "deve ser capaz de gerar todas as permutações de todos os caracteres permitidos".
21414

@ Ankush Isso é notação infix, então "0" nem sempre é o primeiro caractere.
precisa saber é o seguinte

Ajasja está correto. O programa pode gerar qualquer permutação. Eu adicionei algumas observações acima para esclarecer isso.
DavidC


2

Quarto, 72

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

Talvez ainda houvesse espaço para jogar golfe, mas Forth dificultava esse. Eu acho que.


2

Prolog, 177/302 caracteres

Eu sou iniciante no Prolog, então provavelmente este não é o código mais 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).

Devoluções:

| ?- 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 você deseja retornar um número inteiro:

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

Devoluções:

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

Usando em vez disso:

labeling([down],N)

Dá os números na ordem oposta:

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

Ao contrário de outros códigos publicados, isso retorna todas as possibilidades (sem repetições).


2

q / kdb [6 caracteres]

-10?10

irá gerar 10 números aleatórios únicos.



2

Clojure, 42

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

6209847315


O número gerado deve ser mostrado na tela, não são partes.
21414 Sylwester

2

Javascript, 83 caracteres

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

Durante a execução até a matriz ter 10 elementos.

Gerando um número aleatório de 0 a 9, verifique se o array! Inclui esse número e adicione-o ao array.


1
Bem vindo ao site! :)
DJMcMayhem

1

Isso não é muito menor que a resposta de JMK, mas aqui está uma solução C # um pouco menor (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())));}}

Versão alternativa (135):

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

Compactado:

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

Eles são iguais em comprimento, mas realmente depende apenas se você deseja usar a função ForEach do Linq ou a função Join da String. Consegui remover 10 caracteres de comprimento digitando o intervalo "0123456789" em uma seqüência de caracteres em vez de usar Enumerable.Range (0, 10).


1

LOGO , 64 caracteres

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

pick retorna o item aleatório da lista fornecida. butmember retorna a lista com todas as ocorrências do item especificado removidas. Nota: Nem todas as implementações de logotipo suportam butmembercomando.


1

Raquete 45 43

(map print(shuffle'(0 1 2 3 4 5 6 7 8 9)))
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.