Lembre-se daqueles programas de força bruta para quebrar a senha que mostram todas as combinações que estão tentando? Mais precisamente, em um ponto, os n primeiros caracteres são corrigidos (foram adivinhados com sucesso) e todos os caracteres possíveis para os demais estão sendo testados. Você provavelmente já viu alguns filmes ou softwares escritos por pessoas que gostam de interfaces sofisticadas.
Desculpe desapontar, mas não escreveremos um programa para quebrar a senha, apenas um para reproduzir a boa saída.
Desafio
Dada uma sequência contendo caracteres ascii imprimíveis, mas sem novas linhas (código ascii 32 a 126 ou correspondendo ao regex ^[ -~]{2,}$
), imprima uma saída seguindo estas regras:
- No momento
t=n seconds
, osn
primeiros caracteres impressos são osn
primeiros caracteres da sequência de entrada. - Após os
n
caracteres fixos, você deve anexar um caractere aleatório formado por sequência (escolhido uniformemente pseudo-aleatoriamente do intervalo unicodepara
~
(código 32 a 126)) para formar uma sequência com o comprimento do inicial. - Você deve produzir pelo menos (mais sobre isso mais tarde) 20 linhas a cada segundo: cada uma delas terá os mesmos
n
primeiros caracteres, mas com um final aleatório diferente.
Provavelmente ainda não está muito claro o que você deve fazer, então vamos dar um exemplo:
Exemplo
Imprimo apenas 5 linhas diferentes a cada segundo, em vez dos 20 mínimos, apenas para torná-lo mais legível.
Considere a entrada abcde
.
Durante o primeiro segundo, uma saída válida pode ser algo como (completamente aleatório):
dGuT4
S!jkN
"gQ>[
TU3!
*fAjV
Então, t=1
o primeiro caractere de cada sequência a seguir será a
(o primeiro caractere da entrada):
a);jD
aHv^p
aqw5*
a|.?:
a{gbK
Agora, t=2
os dois primeiros caracteres serão ab
:
abTJ"
ab\ e
ab3T#
abYWS
ab"#<
Agora, t=3
os três primeiros caracteres serão abc
:
abcvW
abc3G
abc(g
abc{@
abc@4
Agora, t=4
os quatro primeiros caracteres serão abcd
:
abcdD
abcdv
abcdj
abcd$
abcd6
Por fim, t=5
imprimimos a entrada (apenas uma vez):
abcde
Algumas precisões
- Você não deve se preocupar muito com a precisão do seu idioma em segundos (ou seja, se o seu algoritmo estiver correto, mas o seu sistema / idioma não tiver precisão, tudo bem).
- O primeiro segundo pode ter menos de um segundo (ou seja, se você iniciar o programa durante um segundo, o primeiro segundo poderá ser apenas o tempo restante até o final do segundo atual). Em outras palavras, você não precisa esperar o início de um novo segundo para começar a imprimir as saídas.
- Pelo menos 20 linhas por segundo : a maneira mais natural seria um loop infinito com um comportamento especial a cada segundo (ou um tempo limite ou o que for), de modo que resultará provavelmente em alguns milhares de linhas por segundo (e isso é perfeitamente bom! ) Mas se você tiver outra ideia, fique à vontade para usá-la, desde que imprima pelo menos 20 linhas por segundo.
- A entrada sempre terá mais de 2 caracteres.
- Você pode considerar que a entrada não terá mais de 30 caracteres, se ajudar. (Mas se funcionar para os mais longos, é o melhor)
- O formato de entrada deve ser a representação mais natural de uma string no seu idioma.
- Você tem permissão para imprimir uma nova linha à direita.
Exemplo de código
Se você ainda não entender exatamente o que precisa fazer, execute o seguinte código em um terminal linux para ver:
perl -F -aplE 'map{$t=time;print$s,map{chr 32+rand 94}@F until$t-time;$s.=shift@F}@F' <<< "Cracking in progress\!"
Critério de vitória
Isso é código-golfe , então o código mais curto em bytes ganha!
Agradecemos a Laikoni e Flp.Tkc por suas sugestões e melhorias na sandbox.
\r
(fazendo com que todas se substituam na tela como na animação) ou é\n
aceitável?\n
é perfeitamente aceitável. A versão com\r
está aqui apenas porque parece melhor, mas você não precisa disso\r
.Respostas:
Pitão -
2724 bytesIsso realmente parece muito legal: D
Experimente on-line aqui (obviamente não em tempo real, mas se você rolar para baixo com uma mão firme).
fonte
HTML / JavaScript,
170168167 bytesEditar: salvou 2 bytes graças a @ETHproductions. Guardou 1 byte graças a @jrich.
fonte
setInterval
que aceitará uma string a ser avaliada, o que poderia salvar um byte?setInterval('o.textContent...',d=50)
salva o_=>
e acrescenta um par de aspasNó,
145142 bytesParece um pouco longo, e provavelmente há um pouco de espaço para jogar golfe. Observe que o ponto e vírgula no final é necessário; sem ele, o programa lança um erro de sintaxe porque a
for
instrução não tem corpo.Produz muito mais de 20 linhas por segundo; um passarinho me disse que são aproximadamente 12 mil. Veja como fica no emulador de terminal ConEmu no meu computador (gravado a 30 fps):
fonte
05AB1E , 26 bytes
Coloco isso como uma resposta diferente em relação à outra resposta 05AB1E, pois a abordagem é diferente
Experimente online!
fonte
η
vez de.p
;õš
(ondeš
é precedido como lista) em vez deõ¸ì
(onde¸ì
está agrupado na lista e precedido);₂
(onde₂
é 26 se nenhuma segunda entrada for fornecida) em vez deT·
(que é pressionar 10 e dobrar);]
em vez de}}
(onde]
fecha todos os loops, if-else declarações, etc., ao mesmo tempo)BASH,
99 93 92 9188 bytescom
tr
+head
+urandom
(thx. a @manatwork)
fonte
[ "$n" = ${#1} ]
→((n==${#1}))
;${1:0:$n}
→${1::n}
<
não é necessário.((n==${#1}))
->((${#1}-n))
${1::n=SECONDS}
parece funcionar agora.05AB1E, 30 bytes
Usa a codificação CP-1252 . Experimente online!
Por favor, me ajude a resolver isso.
fonte
C,
182176128126125 bytesGolfe:
Ungolfed:
Ouvi dizer que é possível descartar algunsEu sou apenas um idiota, funciona bem sem eles.#include
s padrão , mas não consegui fazê-lo funcionar no compilador MingW GCC que acabei de baixar. Também não conseguia descobrir como#define b #include
usar sem usar mais espaço do que valia a pena.fonte
a,b,c,d;
pois todas as variáveis globais declaradas como int e init por 0 também, como você não está retornando nada, deve escrevê-lo em main ()while(i++<x)
vez defor (...)
i
precisa ser zero sempre que o loop for for executado novamente.for
substituiri <x
comi++<x
e removeri++
Java 7,
271265207 bytes-58 bytes salvos graças ao @ OliverGrégoire . ( Não esqueça de votar em sua resposta Java 8 ainda mais curta. )
Ungolfed:
Entrada:
abcde
Saída:
fonte
x
:r+=(char)(33+Math.random()*94)
. TambémThread.sleep(9)
para salvar um byte.r=s.substring(0,i/20)
vez do loop ativadoj
.r.substring(0,i/20)
(muito estúpido da minha parte) e o(char)(33+Math.random()*94)
(belo truque de você).WinDbg,
400391 bytes-9 bytes, simplificando um pouco de matemática
Definitivamente, isso não parece ser o tipo de coisa que o WinDbg pretende fazer. ;)
A entrada é obtida inserindo uma string ascii em um local de memória e configurando esse endereço para o pseudo-registro
$t0
. Por exemplo:O prng que estou usando é qualquer que seja o conteúdo da memória, alguns bytes após a string de entrada. Chrome.exe parece preencher o espaço de memória depois
0x2000000
com bytes com aparência aleatória, então usei um despejo de chrome.exe. Desconhecido se isso é uniforme, mas parece aleatório o suficiente para mim.Como funciona:
Nota: Alguns bytes podem ser transferidos para o golfe usando-os em
j
vez dos.if
, mas isso faz com que ele seja executado muito lentamente na minha máquina, para que não produza pelo menos 20 linhas por segundo, para não salvar esses bytes.Saída de amostra: http://pastebin.com/H4H74sAx
fonte
R, 138 bytes
Lê a entrada de stdin.
Contou aproximadamente 61 linhas na minha máquina entre cada letra adicional na "senha".
fonte
Bash,
247245212207 bytesMuito obrigado Bash por ser tão sensível a espaços em branco ...
De qualquer forma, a saída é fornecida em tempo real em linhas separadas. Salve como um
.sh
script e chame com:bash <File Name>.sh <Input>
Por exemplo,
bash Cracking_In_Progress.sh okayerty
resulta na seguinte saída, registrada em 30 quadros por segundo:fonte
Haskell (GHC), 202 bytes
-5 bytes sem ação de retorno de carro sofisticado
fonte
>
fazendo no final da saída?MATL , 26 bytes
Experimente online!
Abaixo está a saída em tempo real do compilador offline. Observe que o GIF animado foi gravado a 20 qps para manter seu tamanho pequeno, mas a velocidade real é muito maior.
Como funciona
fonte
Python3,
149141139 bytesEntrada de stdin.
Versão Eyes (157 bytes):
fonte
t=time.clock
, mas você só usa t uma vez no código. Substituí-lo por apenastime.clock
economizará 3 bytes. A mesma coisa para impressão.for _ in range(l-x)
pode serfor _ in"a"*(l-x)
de 2 bytes.print(i[:x]+''.join(map(chr,random.sample(range(32,127),l-x))))
vez deprint(i[:x]+"".join(chr(random.randint(32,126))for _ in"a"*(l-x)))
Node.js, 134 bytes
Semelhante ao @ETHproductions (emprestou algumas de suas otimizações), mas, por outro lado, adota uma abordagem diferente. Usa Nó
Buffer
para lidar com a geração de caracteres em vez de demoradaString.fromCharCode
, o que tem o benefício de nos deixar usarmap
sem muita sobrecarga de conversão de string-> array-> string.fonte
Buffer
. Só para você saber, reatribuirDate
aD
não salva nenhum bytes; Eu tentei isso sozinho.Python 3,
167166 bytesLê a entrada de stdin. Uma versão de 171 bytes é executada no Python 2 (substituído
input
porraw_input
):Ungolfed:
fonte
Dyalog APL ,
5958 bytesSolução
Requer
⎕IO←0
qual é o padrão em muitos sistemas.Exibição
Ao ajustar a janela para duas linhas, obtemos a ilusão de uma transformação no local:
Explicação
Este é um trem de funções anônimas que usa a senha como argumento correto.
⊢⊣
retornar a senha e descartar o resultado de≢{
...}¨
a função abaixo, com o comprimento da senha como argumento à esquerda, aplicada a cada um dos2⊃⎕AI
atual up-time (lit. terceiro elemento de A ccount I nformação)1E3+
adicione um segundot←
atribuir isso a t⊣
descartar que⍵{
...}⍣{t≤2⊃⎕AI}⍺
aplique a seguinte função (com sub-string como ⍺ e comprimento da senha como ⍵ ) repetidamente até que o tempo de atividade atinja t⍵⍴95
95 repetido quantas vezes houver caracteres na senha?
número inteiro aleatório 0 ... 9432+
adicionar 32 (produzindo assim ⍵ inteiros aleatórios no intervalo de 32 ... 126)⎕UCS
converter para caractere Unicode⍺,
preceder a sub-cadeia atualmente processada⍵↑
use apenas quantos caracteres houver na senha⎕←
saída que em uma linha separada≢
retorna o comprimento da string gerada (= o comprimento da senha)⍳∘≢
0 ... comprimento-1↑¨
cada um tirando caracteres de⊂
a senhafonte
Java, 159 bytes
Mesmo algoritmo que a resposta de Kevin Cruijssen , totalmente otimizado para Java 8.
Ungolfed:
fonte
C #,
203197195190 bytesGolfe:
Ungolfed:
l
armazena o comprimento da entrada.StopWatch
ePath.GetRandomFileName()
fazem parte do .NET framework.EDIT1:
Stopwatch
declaração implícita .EDIT2:
l
inicialização mesclada com declaração.EDIT3: Obrigado, Chris.
fonte
t++
pode ser inserido em algum lugarif ()
if (w.Elapsed.Seconds > t++)
e removat++;
Scala,
259254248233232231227225 bytesUngolfed:
fonte
ForceLang ,
322309 bytesfonte
C ++ (gcc) ,
280278 bytesExperimente online!
Ele apenas imprime 20 seqüências aleatórias esperando 50
std::chrono::milliseconds
entre si (produzindo exatamente 20 linhas por segundo) e depois prossegue para a próxima etapa de "quebra".fonte
Go , 244 bytes
Experimente online! (trunca o resultado para não mostrar todas as instâncias)
Esta é a minha primeira resposta Golang \ o /
(Filmado a 30fps)
Como:
fonte
PHP, 222 bytes
Ungolfed
(eu sei que o vídeo é uma porcaria)
fonte
$c=range(32,127)
e depois$r=chr($c[rand(0,94)])
, por que não apenas$r=chr(rand(0,94)+32)
?<?$l=strlen($a=$argv[1]);$e=$l+$s=time();while(time()<=$e&&$o!=$a){$o=substr($a,0,time()-$s);while(strlen($o)<$l)$o.=chr(rand(0,94)+32);echo "$o\n";}
é de 149 bytes, e tenho certeza que ele pode ser golfed aindaTcl , 295 bytes
Primeiro golfe para mim em Tcl. Não é uma linguagem muito fácil de jogar, já que tudo é tratado como seqüências de caracteres aqui, então espaço em branco é geralmente uma obrigação ...
Ungolfed:
fonte
-nonewline
oputs
parâmetro?expr
no final; um é suficiente, e você também pode evitar os espaços ao redor>
expr
no final, eu não consigo vê-lo.[set k [expr $k-1]]
pode ser[incr k -1]
. E todo `<` pode ser<
, sem espaços necessários.Kotlin, 188 bytes
Golfe
Ungolfed
Mudar o nome
System.currentTimeMillis
salvou alguns bytes!fonte
QBIC ,
9288 bytesEu quebrei!
Isso depende da função SLEEP do QBasic usando o literal de código
$sleep 1|
e daLEFT$
função do QBasic porque eu ainda não implementei essa função no QBIC ...Dirigido para raspar alguns bytes substituindo todo o
20
's parat
e configuração que a 20. Além disso, simplificada uma chamada para aleatório e um loop for.Explicação:
Saída (uma parte da seção do meio em 'helloworld')
fonte