Scrivi un programma che esegue la combinazione di lettere di forza bruta fino a quando non viene trovata la parola "password"


16

Il programma dovrebbe stampare ogni combinazione di lettere (minuscole o maiuscole, non importa) in ordine alfabetico. Deve iniziare con ae dovrebbe essere l'ultima combinazione stampata password.

L'output dovrebbe essere:

a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ... passwora passworb passworc password

2
I separatori devono essere spazi o posso usare le nuove righe?
Ilmari Karonen,

Sì, puoi, è solo un piccolo cambiamento.
ST3,

Risposte:


32

Perl, 19 caratteri

say for a..password

Utilizza le nuove righe come delimitatori, per chiarimenti sopra. Esegui con perl -M5.010(o solo perl -E 'say for a..password') per abilitare la sayfunzione Perl 5.10+ . Per meta , questo non conta come caratteri extra.

(Se insisti negli spazi come delimitatori, $,=$";say a..passwordsono solo due caratteri più lunghi. Tuttavia, è anche molto lento e dispendioso di memoria, al punto da essere inutilizzabile in pratica, dal momento che tenta di costruire l'intero elenco in memoria prima di stamparlo.)


18

Rubino, 33 caratteri (versione ottimale ma più lunga)

?a.upto('password'){|c|$><<c+' '}

Mi piace il 'a'.upto('password'); ti dice esattamente cosa sta facendo. Ruby è fantastico ed espressivo così.:D

Certo, print c,' 'sarebbe anche molto più chiaro, ma l'uso $>è più breve di due caratteri.

Ruby, 29 25 caratteri (versione lenta)

$><<[*?a..'password']*' '

Questo è più corto, ma stampa tutti i token contemporaneamente, quindi ci vuole molto, molto tempo per correre!


1
Bello, soprattutto il primo.
Cary Swoveland,

Nella versione lenta, (?a..'password').to_apuò essere abbreviato in[*?a..'password']
Paul Prestidge,

6

Perl, 33 32 24 caratteri

Una soluzione in 32 caratteri:

$_=a;print$_++,$"until/passwore/

Non c'è molto da dire su questo. Potrei ridurre questo a 27 caratteri se potessi usare newline invece di spazi per separare le voci.

Ilmari Karonen sottolinea che ..le chiamate interne ++, quindi una soluzione migliore (25 caratteri) sarebbe:

print$_,$"for a..password

Sfruttando le opzioni della riga di comando di Perl, ecco una soluzione equivalente di 24 caratteri:

perl -l40e 'print for a..password'

Le regole per contare le bandiere perl sono qui, per coloro che non hanno familiarità con esse.

Naturalmente, la soluzione di 21 caratteri di Ilmari è ancora più breve, ma richiede una macchina in grado di allocare un array di 129.052.722.140 stringhe.


Non sarebbe .$"invece di ," "salvare un personaggio?
Mr. Llama,

Sì, totale supervisione da parte mia. Grazie.
breadbox

6

Perl 6, 20 caratteri

say "a".../password/

Non hai bisogno di altre cose


5

Python 2, 91

b=lambda n:n*' 'and b(n/26-(n%26<1))+chr(~-n%26+97)
i=0
exec"i+=1;print b(i);"*129052722140

4

PHP 38 37 36 caratteri

<?for($w=a;$w<passwore;)echo$w++,~ß;

Devi impostare la codifica su ISO 8859-1 e disabilitare gli avvisi.


Non l'ho provato, ma lo fa davvero ???
ST3,

@ ST3 È un semplice ciclo. La variabile $wviene inizialmente impostata su 'a' e quindi viene incrementata fino a raggiungere il primo valore dopo 'password' (l'ultima stringa non viene stampata).
Lortabac,

3
@ ST3 È un forciclo regolare . Non c'è nulla di strano in questo codice, tranne gli ultimi 2 caratteri, che sono uno spazio bianco invertito bit per bit. Comunque, sì, l'ho provato fino a una parola più breve.
Lortabac,

1
@ ST3 Ecco un test da passwoqsa password. Poiché la codifica del codepad non è ISO 8859-1, ho dovuto sostituirla con uno spazio bianco.
Lortabac,

1
Puoi salvare un carattere con $w<passworeal posto di $w!=passwore.
Decent Dabbler,

2

Ruby (40 caratteri)

Interpreta una stringa di lettere az come numero nella base 26, con a = 1, b = 2, ..., z = 26.

Quindi "password" può essere considerata come il numero N =

16*(26**7) + 
1*(26**6) + 
19*(26**5) + 
19*(26**4) + 
23*(26**3) + 
15*(26**2) + 
18*(26**1) + 
4*(26**0)

Se lasciamo s = "a"(cioè: 1) e facciamo (N-1) chiamate a s.succ!, s sarà "password"(N). In altre parole, N = 1 + (N-1).

Per un esempio che verrà eseguito più rapidamente, per dimostrare che il calcolo di N è corretto, considerare "pass"come obiettivo, dove N è

16*(26**3) + 
1*(26**2) + 
19*(26**1) + 
19*(26**0)

e

s = "a"
(N-1).times { s.succ! }
puts s #== "pass"

Dal momento che vogliamo stampare "a"anche noi, abbiamo bisogno

s = "`"
N.times { print(s.succ! + " ") }

Quindi torniamo alla "password" completa. N = 129052722140, in partenza:

s=?`;0x1e0c2443dc.times{$><<s.succ!+" "}

Ho cercato una forma più compatta di 129052722140 == 0x1e0c2443dbma non sono riuscito a trovarne una.

(Aggiornato per correggere la mancanza di stampa "a", grazie a Cary.)


1
Adam, quello deve essere stato tu nella mia fusione mentale. Non vuoi che ne inizi uno prima di "a"?
Cary Swoveland,

Penso che quello che stai ottenendo sia che ho usato Ninvece che N-1nelle mie iterazioni! Grazie, modificherò per risolvere. (Anche se 129052722140 è un numero interessante per Google :).)
Adam Prescott

1
0x1e0c2443db è tanti caratteri quanti ne sono 129052722139.
steenslag

Quello che intendevo dire era che se s=?a, s.succ!inizia da 'b'`.
Cary Swoveland,

1
Con s=?ae N-1ottieni 'b c ... password'; con s =<backtick> e Nottieni 'a b ... password'. La SO ha richiesto l'output per cominciare 'a'. È tutto.
Cary Swoveland,

2

Javascript, 73

Ecco una versione di 73 caratteri del codice di @Briguys, che stampa solo combinazioni di lettere

for(i=s=0;1982613533018>i++;s=i.toString(36))/\d/.test(s)||console.log(s)


2

APL (Dyalog), 46 34

{∇{'PASSWORD '≡⍞←⍵:→⋄⍵}¨⎕A∘.,⍵}' '

Teoricamente, verrebbe stampato fino a PASSWORD, ma ho riscontrato un errore completo nello spazio di lavoro dopo ZZZZ: l'array 5-dimensionale è semplicemente fantastico.

EDIT: Deve essere passato troppo tempo dall'ultima volta che ho armeggiato con APL. Come oso perdere il confronto dell'identità ( ) !!!

Spiegazione

{...}: Dichiara una funzione che ...
⎕A∘.,⍵: prende il prodotto esterno sopra la concatenazione (ogni combinazione di un elemento dell'operando di sinistra concatenata con un elemento dell'operando di destra, proprio come il prodotto cartesiano) tra il 26 maiuscolo ( ⎕A) e l'argomento ( )

{...}¨: E per ogni elemento dell'insieme risultante, collegalo a una funzione che ...
⍞←⍵: lo stampa
'PASSWORD '≡e lo confronta con 'PASSWORD '
: Se il confronto restituisce true ( 1), quindi interrompere il programma.
: Altrimenti restituisce solo la stringa stampata.

: Infine, si ricorre alla funzione esterna.

(Quindi stai prendendo il prodotto esterno sopra il concat tra il 26 alfa e il 26 alfa, che fornisce tutte le combinazioni di 2 lettere, e quindi il prodotto esterno sopra il concat tra le combinazioni di 2 lettere e il 26 alfa, ecc ... Fino a quando raggiungere PASSWORD che attiva l'interruzione)

' ': La scintilla!! Che avvia la funzione ricorsiva con il carattere spaziale.


2

Python 2 - 153 152 151 149 byte

from itertools import*;R=range
for l in iter(chain(*[product(*((map(chr,R(65,91)),)*n))for n in R(1,9)]).next,tuple("passwore")):print ''.join(l)

Salvato un byte usando MAIUSCOLO e uno usando newline invece di spazi.


1

Golfscript 41

Per mancanza di 'z'+1 == 'aa'logica, Golfscript non può vincere questo.

168036262484,(;{27base{96+}%' '+.96?0<*}%
  • 168036262484, creare un array da 0 a 168036262483
  • (; rilasciare lo 0
  • { .. }% iterate su array
  • 27base converte l'elemento in un array di base 27
  • {96+}% aggiungere 96 a ogni cifra
  • ' '+ converti in stringa e aggiungi uno spazio alla fine
  • .96?0<* tronca la stringa a zero se contiene char 96

1

In Ruby, 39 40.

a=&`
0x1e0c2443dc.times{$><<a.succ!+' '}

..oppure 129052722140. (Modifica: precedentemente avevo 129052722. Avevo perso alcune cifre tagliando e incollando. Il hex precedente ( 0x7B13032) era per un numero errato.). a=?`Preso in prestito da @Doorknob per salvare un personaggio.


Ho provato a sistemare la a=?` cosa, sembra un po 'strano e ha uno spazio extra alla fine ma almeno funziona: P
Maniglia della porta

Da dove viene il numero 129052722? Secondo il mio calcolo, sembrerebbe darti l'intervallo da "a" a "kwkokg" ... un po 'piccolo.
breadbox

@Breadbox Ho calcolato quel numero con il seguente metodo (scusate la formattazione, ma i commenti hanno dei limiti, eh?): ORD_BASE_ASCII = 'a'.ord-1; def nbr(word); len = word.size; word.split('').inject(0) {|t,c| offset = c.ord - ORD_BASE_ASCII; t + offset*(26**(len -= 1))}; end È facile confermare che questo è corretto semplicemente stampando alcune sequenze.
Cary Swoveland,

@breadbox Avevi ragione. Vedi modifica. Il metodo che ho dato nel commento è OK.
Cary Swoveland,

Errori di Fencepost. Il tuo script sta calcolando usando a = 1..z = 26. È necessario calcolare a = 0..z = 25 per ottenere il conteggio corretto. Rimuovendo il -1 dalla prima riga, otterrai 120699639557, che (aggiungendo uno per la voce zeroth) corrisponde al mio calcolo.
breadbox

1

Javascript: 57 56 caratteri (grazie C5H8NNaO4)

Ecco una soluzione che include numeri come possibili caratteri ("0", "1", "2", .., "passwor9", "passwora", "passworb", "passworc", "password")

for(i=-1;i++<1982613533017;console.log(i.toString(36)));

Ecco un violino per il test (con solo le ultime 100 iterazioni in modo che non blocchi il browser).


3
Questa soluzione è sbagliata, non segue le specifiche.
Maniglia della porta

@Doorknob - Sì, l'ho menzionato nella mia risposta. Stampa ancora tutti i casi dai requisiti originali, ma stampa anche tutti i casi alfanumerici.
Briguy37,

Inoltre, dopo aver riletto la domanda, se avessi impostato i a 9 nel mio codice, avrebbe soddisfatto TUTTI i requisiti della domanda tranne il suo esempio di output, per il quale ha già fornito un'eccezione (e porterebbe il codice a 56 caratteri ).
Briguy37,

@ Briguy37 Le specifiche dicono print every **letter** combinationcomunque, salvare un personaggio:{} -> ;
C5H8NNaO4

@ C5H8NNaO4: quale combinazione di lettere non viene stampata dalla mia soluzione? Grazie per il consiglio!
Briguy37,

1

Haskell, 101

main=putStrLn.concat.takeWhile(/="passwore ").tail.concat.iterate(\k->[x:y|x<-['a'..'z'],y<-k])$[" "]

0

Befunge (72)

<_v#:/*2+67\+++88*99%*2+76:
^ >$>:#,_84*+,1+:0\:" Lr$W~"67++**1+***6+`#@_

Stampa le stringhe da "a" a "password" separate da spazi, quindi esce.

Di seguito è una versione che stampa solo le prime 9 * 9 = 81 parole (da 'a' a 'dd'), per confronto. Il 99*è il numero di iterazioni da eseguire.

<_v#:/*2+67\+++88*99%*2+76:
^ >$>:#,_84*+,1+:0\:99*`#@_

0

JavaScript 80 76

for(i=s=0;s!="password";i++){s=i.toString(36).replace(/[0-9]/,'');console.log(s)}

violino - si ferma a "pa".

tuttavia questo ripete le cose.


È possibile inizializzare il ciclo con i=s=0per salvare altri tre caratteri.
Ry

@minitech fatto.
Chiller matematico,

1
Perché mantenere il var? iera un globale prima; ora sè un globale. Di solito puoi semplicemente tenere entrambi i globi nel code golf.
Ry
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.