Qual é a maneira mais curta de gerar uma sequência aleatória com um determinado comprimento e apenas caracteres alfanuméricos permitidos?
- exemplo de uma sequência aleatória: com N = 9 a saída seria
aZua7I0Lk
- pode-se supor que o comprimento especificado N seja sempre maior que 0
- se necessário, você pode assumir 256 como um valor máximo para N, mas são preferidas soluções com limites mais altos para N e ainda com um tempo de computação rápido
- caracteres permitidos: 0-9, az e AZ
- um caractere pode ocorrer mais de uma vez na sequência de saída
- cada sequência possível deve ser igualmente provável (com a precisão do gerador de números aleatórios do seu idioma)
Respostas:
Gelatina , 4 bytes
Experimente online!
Explicação
O poder cartesiano basicamente gera toda a lista de um determinado comprimento que pode ser formado a partir de um determinado conjunto de elementos; é exatamente disso que precisamos aqui.
fonte
Táxi , 2577 bytes
Experimente online!
O táxi não é super feito para isso, mas você pode fazê-lo! Vou tentar explicar o que está acontecendo abaixo da versão sem golfe.
Iniciar: Obter stdin
Escolha o valor stdin como texto, converta-o em um número e cole-o em algum lugar para aguardar.
Planeje A Parte 1: Obtenha um número inteiro aleatório 1-62
Obtenha um número inteiro aleatório e depois obtenha
62
um número. Duplique o número inteiro aleatório e o62
porque precisaremos deles mais tarde. Você pode transportar apenas 3 passageiros de uma só vez, então acabamos comrand
,rand
e62
. (O outro62
vai esperar até voltarmos.) Go divisãorand
por62
e truncar o resultado para obter um inteiro. Volte para obter a outra cópia62
e multiplique-a pelo número inteiro truncado da divisão. Por fim, subtraia o produto da primeira cópia derand
. Isso nos dá um número de 0 a 61. Agora temos que voltar ao captador a1
e adicioná-lo ao resultado para obter o número 1-62. Sim, todas essas muitas linhas de texto são justasmod(rand(),62)+1
.Planeje uma parte 2: crie uma matriz de caracteres para escolher
Coletar uma sequência com todos os caracteres válidos e também uma no final que não queremos (mais sobre isso mais tarde). O
63
que escolhemos anteriormente corresponde a esse comprimento de string. Leve-o até Chop Suey para quebrá-lo em passageiros individuais.Plano B: Mova a matriz para que possamos selecionar um caractere.
Um por um, mova todos os caracteres para o Narrow Path Park. É a única pilha disponível e a única maneira de não ter sobras de passageiros no caminho. Tudo o resto em Townsburg é FIFO, então eu teria que voltar e limpar todos os passageiros a cada iteração do circuito geral. Dessa forma, eu posso simplesmente deixá-los no parque e eles serão empurrados para fora do caminho pelos 63 novos personagens todas as vezes.
A
É provável que o primeiro nunca escape .Plano C: Prepare-se para selecionar um personagem. Na
verdade, são apenas algumas paradas que não precisavam estar no Plano D. Reposicione o táxi em preparação.
Plano D: Consiga todos os personagens que não queremos.
Começando com o primeiro caractere no "array" invertido (este é o 63º caractere que não queremos), continue escolhendo e concatenando caracteres à medida que fazemos a contagem regressiva do resultado da
mod
função no plano A. Depois de atingir zero, o próximo personagem é o que você deseja.Plano E: Afogue os que você não quer e devolva o escolhido.
"Os assaltantes [P] deixados na ponte Riverview parecem sempre cair do lado e entrar no rio ..." Bem, isso se livra dessa cadeia concatenada de perdedores. Vá pegar o próximo personagem e envie para stdout. Por fim, vamos verificar quantos caracteres foram impressos até o momento. De volta ao Sunny Skies para pegar o valor stdin que deixamos há tanto tempo. Subtraia um e, se o resultado for maior que zero, envie-o novamente para aguardar e reinicie no Plano A.
fonte
code-bowling
e foi revisada. Acode-golf
resposta mais longa que pude encontrar é a submissão original do Brain-Flak sobre o desafio básico do quine. Ele vem em 9,5 * 10 ^ 580 bytes. A resposta atual mais longa que encontrei foi um testador principal no Unary : 1,65 * 10 ^ 56 bytes.C (gcc) ,
575552 bytesGraças a 2501 pelos ponteiros ...
Experimente online!
fonte
rand()%74
deveria serrand()%75
&&putchar(i)
vez do operador ternário.Gelatina , 5 bytes
Faltou um truque - veja 4 byter de ais523
Experimente online!
Quão?
fonte
Shell + pwgen , 13 bytes
Saída de amostra
fonte
Java 8,
1831499788 bytesExperimente online.
-9 bytes, portando a resposta C de @ 2501 , certifique-se de votar também nele!
Resposta antiga, 97 bytes
Experimente online.
Explicação:
fonte
C, 60 bytes
Veja como funciona aqui .
Veja a distribuição aqui .
É uniformemente distribuído, assumindo que
rand() % 62
produz uma distribuição uniforme. Como 62 geralmente não divide uniformemente RAND_MAX, há um viés muito pequeno.fonte
Boneco de neve , 58 bytes
Experimente online!
Esta é uma sub-rotina que recebe um número inteiro como entrada e retorna a sequência aleatória.
fonte
((}#`""*:48vn58nR|65vn91nR,aC|97vn123nR,aCAsH1AaL#aC*;bR))
.PowerShell,
5854 Bytes-4 thanks to Andrei Odegov - casting to a char array instead of looping to create a char array.
generates a range
1..2+4..5 = 1,2,4,5
of all the acceptable charachter codes, then selects$args
number of elements randomly usingrandom -Count
- the resulting elementsare looped throughare cast to an array of chars using|%{}
and turned into[char]
s,[char[]]
- then the whole thing is encapsulated in brackets and-join
ed together.Does not work for an input of 0 as
Get-Random
only accepts numbers above 1 for the-Count
parameter.fonte
-join[char[]](65..90+97..122+48..57|random -C "$args")
PHP, 56 Bytes
Online Version
ctype_alnum
fonte
05AB1E, 6 bytes
Try it online!
Explanation
fonte
Perl 5, 41 bytes
40 bytes of code +
-p
flag.Try it online!
(a..z,A..Z,0..9)
creates an array containing all letters and numbers,[rand 62]
returns an random element of this array, which is append (.=
) to$\
, which is implicitly printed at the end thanks to-p
flag with}{
.Or, for the same bytecount, but using the parameters rather than the standart input:
Try it online!
fonte
R, 51 bytes
Same length as the other R answer, but a different approach.
letters
andLETTERS
both are built-in variables containing all lower and uppercase letters respectively. Adding0:9
to that and we have the entire set of alphanumeric characters.fonte
R,
54525149 bytesExplanation:
scan()
c(65:90,97:122,48:57)
sample(c(65:90,97:122,48:57),scan(),T)
intToUtf8
fonte
JavaScript (ES6),
6154395264 bytesThis is almost like reverse-golf! Took a big hit on the byte count ensuring that the full range of characters from all three groups would be used.
Try it
fonte
[0-5w-z]
exclusively.btoa(String.fromCharCode(Math.random()*248))[0]
to cover the whole range uniformly.toString
and then encode) in order to guarantee a full range of characters from all 3 groups can be returned.014589ABEFIJMNQRUVYZcdghklopstwx
(and not uniform).Alice, 24 bytes
Try it online!
This layout is already a lot better than what I originally had (32 bytes), but I'm sure it's not optimal yet...
Explanation
fonte
Python + exrex, 81 bytes
fonte
Python 2,
798379 bytes+4 bytes (didn't account for repetition)
-4 bytes (Thanks to @Rod for the suggestion for using
printable[:62]
)fonte
(s.letters+s.digits)*x
insteads.letters+s.digits
`r.sample(...)`[2::5]
instead''.join(r.sample(...))
to save a byte (python 2 only) and(s.letters+s.digits)*x
can be switched tos.printable[:62]*x
to save 4 bytesprintable
, couldn't get the[2::5]
to work (maybe I was doing it wrong?)r.sample()
with backticks``
some info about itBrachylog, 14 bytes
Try it online!
Explanation
fonte
MATL, 8 bytes
Try it online!
fonte
Batch, 175 bytes
s
performs double duty here as it contains both the alphanumeric list and the randomly selected characters. After printing the result the code falls through to the subroutine whose result is ignored.fonte
Pyke, 4 bytes
Try it online!
fonte
MemoryError
Pyth,
711 bytesTry it online
Explanation
fonte
C# - 121 bytes
fonte
APL (Dyalog) with AGL, 17 bytes
Try it online!
(
…)[
…]
index into⎕A,∆a,⎕D
uppercase alphabet followed by lowercase alphabet followed by digitsusing
62
(the number of possible symbols⍴
reshaped by⎕
evaluated input (n)?
change each 62 into a random number in the range 1…62APL (APLX), 17 bytes
fonte
Bash, 43 bytes
Try it online!
fonte
Pip, 13 bytes
Try it online!
Explanation
fonte
Sinclair ZX81/Timex TS1000/1500 BASIC, ~63 tokenized BASIC bytes
There are no lower-case characters in ZX81 without using assembly or having some sort of UDG ROM or something, and for the time being, it only outputs
A-Z
. If zero is entered then the program halts and returns to direct mode.fonte
Japt,
128 bytesTry it
fonte
Stacked, 33 bytes
Try it online! Takes input from the top of the stack and leaves output on the top of the stack.
fonte