Números fáceis de lembrar, mas teoricamente não são fáceis
Seu desafio é criar um programa / função em qualquer idioma que gere números aleatoriamente uniformes que atendam a esses critérios:
O comprimento é de 5 dígitos
Existem dois pares de dígitos repetidos separados
Um conjunto de dígitos repetidos está no início ou no final e os dígitos estão próximos um do outro
O número ímpar é cercado pelo outro par de dígitos
Os pares de dois dígitos e o outro número devem ser únicos
Seu programa pode suportar números com zeros à esquerda ou não, a seu critério. Se os zeros iniciais forem suportados, eles deverão ser incluídos na saída: 06088, não 6088. Se os zeros iniciais não forem suportados, números como 06088 não deverão ser gerados.
Casos de teste
Saídas aceitas:
55373 55494 67611 61633 09033 99757 95944 22808 65622 22161
Saídas não aceitas:
55555 77787 85855 12345 99233 12131 abcde 5033
Casos de teste mais aceitáveis podem ser encontrados neste link pastebin .
Estes foram feitos com este programa python:
importação aleatória para i na faixa (100): if random.randint (0,100)> = 50: #Put pair tocando no início se true temp = [] # matriz de trabalho temp.append (random.randint (0,9)) #append digit random temp.append (temp [0]) # acrescente o mesmo dígito novamente x = random.randint (0,9) enquanto x == temp [0]: x = random.randint (0,9) temp.append (x) #append outro dígito exclusivo y = random.randint (0,9) enquanto y == temp [0] ou y == temp [2]: y = random.randint (0,9) temp.append (y) # anexa outro dígito exclusivo e o dígito exclusivo anterior temp.append (x) else: #Coloque o par no final temp = [] # matriz de trabalho temp.append (random.randint (0,9)) #append digit random # Embora não seja exclusivo, tente novamente x = random.randint (0,9) enquanto x == temp [0]: x = random.randint (0,9) temp.append (x) #append outro dígito exclusivo temp.append (temp [0]) # adicione novamente o mesmo 0º dígito y = random.randint (0,9) enquanto y == temp [0] ou y == temp [1]: y = random.randint (0,9) temp.append (y) # anexa outro dígito exclusivo duas vezes temp.append (y) tempstr = "" para i em temp: tempstr + = str (i) imprimir tempstr
Isso é código-golfe , então a resposta mais curta em bytes vence!
random
não significa de maneira uniforme por issoRespostas:
05AB1E , 11 bytes
Experimente online!
Explicação
fonte
CJam (16 bytes)
Demonstração online
Nota: Eu assumi que por OP "único" realmente significa "distinto".
Também para 16 bytes:
Dissecação
As outras variantes geram usando
[1 0 1 2 2]
e, em seguida, selecione o resultado ou seu inverso.fonte
Perl 5 ,
816356 bytesCorte 7 bytes com inspiração em @DomHastings
Construindo o número a partir do padrão apropriado.
Experimente online!
Perl 5 , 89 bytes
Seleciona números aleatórios de 5 dígitos até encontrar um que atenda aos critérios.
Experimente online!
fonte
time%2
suficientemente aleatório, pois está, de certo modo, sob o controle do usuário.Python 2 , 80 bytes
Experimente online!
Produz uma lista de dígitos.
Python 2 , 83 bytes
Experimente online!
Saída é um número.
fonte
APL (Dyalog Unicode) ,
22 21 20 1817 bytesExperimente online!
Se for aceitável gerar os números sempre no mesmo formato, isso pode ser reduzido para 12 bytes,
1⌽1↓,∘⌽⍨3?10
ou3⌽1↓,∘⌽⍨3?10
.Salve um byte removendo o desnecessário
∘
.Salvou um byte graças a H.PWiz e mais 2 bytes devido à dica.
Guardou um byte graças a ngn.
A função assume
⎕IO←0
( I NDEX O Rigin).Quão?
fonte
Input
é usado para chamar a funçãog
. Além disso, o númerog←
não é contado na contagem de bytes, porque não é necessário, está sendo usado apenas para chamar a função.g
é chamado na seção de entrada é apenas um truque de como a APL está definido para ser executado em TIO(4∨?2)
salva um byte em #1 4[?2]
f
e usando um trem. Eu vou deixar isso para você:) #Java 8,
145136125119 bytes-9 bytes graças a @ OlivierGrégoire.
-11 bytes graças a @RickHitchcock .
-6 bytes graças a @Nevay .
Explicação:
Experimente online.
fonte
v->{String r="";for(;!r.matches("(.)\\1(.).\\2|(.).\\3(.)\\4")|r.chars().distinct().count()!=3;r=(int)(Math.random()*1e5)+"");return r;}
(.).*\\1(.).*\\2
, economizando 11 bytes.v->{String r;for(;!(r=(int)(Math.random()*1e5)+"").matches("((.).?\\2){2}")|r.chars().distinct().count()<3;);return r;}
Gelatina , 23 bytes
Experimente online!
fonte
Geléia ,
1211 bytesExperimente online!
Explicação
(*) O argumento correto de
ṃ
é que a lista['0','1','2',...,'9']
, aleatoriamente aleatória, possui 10 elementos. Portanto, o número13122
será convertido na base bijetiva 10 ([1,3,1,2,2]
) e indexado na lista (portanto, se a lista forl
, o valor de retorno do átomo é[l[1],l[3],l[1],l[2],l[2]]
onde Jelly usa a indexação baseada em 1)fonte
JavaScript (ES6), 79 bytes
Experimente online!
Quão?
Math.random()
dá uma flutuação aleatória em [0..1) . Usamos+f
para forçar a coerção a uma corda. Nós ignoramos o zero eo ponto decimal fazendo[,,
( desestruturação atribuição dos dois primeiros caracteres para nada) e recolher os 4 primeiros dígitos decimais em d , a , b , e c .Se um , b e c são números inteiros 3 distintas, nós construímos o produto final em qualquer AABCB ou BCBAA formato (utilizando a paridade de d a decidir). Caso contrário, tentamos novamente até que estejam.
No evento altamente improvável de
Math.random()
retornar um valor sem casas decimais suficientes, pelo menos c será definido como um caractere não dígito, forçando o teste a falhar e a chamada recursiva a ocorrer. Se a , b e c são inteiros válidos, em seguida, d é garantido para ser um inteiro válido, bem como, assim que este não precisa ser testado.fonte
&&
podem ser&
. Além disso, como[,,a,b,c,d]
funciona? Eu nunca vi uma entrada como[,,
antes.a=4, b=2, c=1
porque4-2&4-1&2-1 == 2&3&1 == 0
. Adicionei uma breve explicação sobre a atribuição de variáveis.&&
a&
em TIO e deu saídas correctas, então eu assumi que era possível. Não sabia que, em&
vez de&&
, filtraria saídas válidas. E obrigado pela explicação adicional sobre a tarefa de desestruturação, nunca vista antes.Perl 6 , 42 bytes
Experimente online!
fonte
Sujo , 33 bytes
Usa o
--numeric-output
sinalizador para que seja legível; caso contrário, ele produziria uma sequência de caracteres de controle com pontos de código correspondentes aos dígitos.Experimente online!
Explicado:
fonte
Carvão , 34 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
fonte
Retina , 40 bytes
Experimente online!
Pode imprimir strings com zeros à esquerda.
Explicação
Inicialize a sequência para 10 sublinhados.
Transliterar ciclicamente os caracteres das palavras em dígitos. Isso é um pouco estranho. The
w
ed
são abreviações para as seguintes seqüências, respectivamente:Transliteração cíclica significa que primeiro, ambas as cadeias são repetidas para o comprimento do seu LCM:
Como os comprimentos de sequência 53 e 10 são coprime, cada cópia de
_
é emparelhada com um dígito diferente. E agora transliteração cíclica irá substituir o i th cópia do_
com o i th emparelhamento nessa lista expandida. Então, acabamos com a seguinte string:Tudo isso para salvar um único byte sobre a string literal
0369258147
, então sim, eu acho? : DDe qualquer forma, temos uma sequência de todos os 10 dígitos agora.
Isso embaralha os dígitos. Portanto, os três primeiros dígitos serão uma seleção uniformemente aleatória de três dígitos distintos.
Nós combinamos a corda
...ABC
e a transformamosBABCC
. A maneira como fazemos isso é meio louca e, novamente, economiza apenas um byte em comparação com uma abordagem mais direta. Primeiro, combinamos todos os pares de caracteres sobrepostos (v
), capturando o segundo (.(.)
). Então nós reter apenas o 8º jogo (7
, baseado em zero), que éAB
no...ABC
. Em seguida, substituímos ($
) por:B
($1
),ABC
($<'
que é o sufixo do separador de correspondências à esquerda da correspondência),C
($'
que é o sufixo da própria correspondência).Finalmente, combinamos 3 ou 2 caracteres e embaralhamos as partidas, dando-nos
BABCC
ouCCBAB
aleatoriamente.fonte
R , 78 bytes
Experimente online!
sample
pega 3 de valores aleatórios0:9
, que são colocados em um vector da seguinte forma:a b a c c
. Agora temos 50/50 de chance de reverter esse vetor e concatenar e imprimir.fonte
rt
, mas por alguma razão eu pensei que era mais ....(
quanto não-op é um bom encontrar :)PHP,
737266 bytesEdit: 66 bytes graças à sugestão de @David.
Experimente online!
fonte
<?=strtr(rand()%2?AABCB:BCBAA,ABC,rand(0,9).rand(0,9).rand(0,9));
rand(0,3).rand(4,6).rand(7,9)
, mas, novamente, não é "uniformemente aleatória". Btw. Eu não estava familiarizadorand()%2
, então seu comentário me ajudou a melhorar levemente minha solução.<?=strtr(rand()%2?AABCB:BCBAA,ABC,join(array_rand(range(0,9),3)));
. Você pode testar se oarray_rand
segundo parâmetro do somente retorna resultados exclusivos aqui (testado em 10000 iterações).Vermelho ,
147, 146125 bytesExperimente online!
Ungolfed:
fonte
Wolfram Language (Mathematica) , 59 bytes
Experimente online!
fonte
Ruby ,
6059 bytesExperimente online!
Retorna uma lista de dígitos.
fonte
Python 3 + numpy, 69 bytes
Explicação
fonte
C (gcc) ,
126119 bytes-6 bytes de @ceilingcat
Experimente online!
fonte
J , 35 bytes
Experimente online!
Tenho certeza de que pode ser jogado muito mais longe.
Explicação:
fonte