Écrire un programme qui exécute une combinaison de lettres de force brute jusqu'à ce que le mot «mot de passe» soit trouvé

16

Le programme doit imprimer chaque combinaison de lettres (en minuscules ou en majuscules, peu importe) dans l'ordre alphabétique. Il doit commencer par aet la dernière combinaison imprimée doit être password.

La sortie doit être:

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
ST3
la source
2
Les séparateurs doivent-ils être des espaces ou puis-je utiliser des retours à la ligne?
Ilmari Karonen
Oui, c'est juste un changement mineur.
ST3

Réponses:

32

Perl, 19 caractères

say for a..password

Utilise les nouvelles lignes comme délimiteurs, comme indiqué ci-dessus. Exécutez avec perl -M5.010(ou tout simplement perl -E 'say for a..password') pour activer la fonction Perl 5.10+ say. Par méta , cela ne compte pas comme caractères supplémentaires.

(Si vous insistez sur les espaces comme délimiteurs, il $,=$";say a..passwordne reste que deux caractères. Cependant, c'est aussi très lent et gaspillant de la mémoire, au point d'être inutilisable en pratique, car il essaie de construire la liste entière en mémoire avant de l'imprimer.)

Ilmari Karonen
la source
18

Ruby, 33 caractères (version optimale mais plus longue)

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

J'aime le 'a'.upto('password'); il vous indique exactement ce qu'il fait. Ruby est génial et expressif comme ça.:D

Bien sûr, print c,' 'serait également beaucoup plus clair, mais l'utilisation $>est de deux caractères plus courte.

Ruby, 29 25 caractères (version lente)

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

Celui-ci est plus court, mais il imprime tous les jetons en même temps, il faut donc beaucoup de temps pour courir!

Poignée de porte
la source
1
Sympa, surtout le premier.
Cary Swoveland,
Dans la version lente, (?a..'password').to_apeut être raccourci en[*?a..'password']
Paul Prestidge
6

Perl, 33 32 24 caractères

Une solution en 32 caractères:

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

Pas grand chose à dire sur celui-ci. Je pourrais réduire cela à 27 caractères si je pouvais utiliser des sauts de ligne au lieu d'espaces pour séparer les entrées.

Ilmari Karonen souligne que ..les appels internes ++, donc une meilleure solution (25 caractères) serait:

print$_,$"for a..password

En tirant parti des options de ligne de commande de Perl, voici une solution équivalente à 24 caractères:

perl -l40e 'print for a..password'

Les règles de comptage des drapeaux Perl sont là, pour ceux qui ne les connaissent pas.

Bien sûr, la solution à 21 caractères d'Ilmari est encore plus courte, mais elle nécessite une machine qui peut allouer un tableau de 129 052 722 140 chaînes.

boite à pain
la source
Ne serait pas au .$"lieu de ," "sauver un personnage?
M. Llama
Oui, une surveillance totale de ma part. Merci.
boîte à pain le
6

Perl 6, 20 caractères

say "a".../password/

Tu n'as pas besoin d'autre chose

Demayl
la source
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
feersum
la source
4

PHP 38 37 36 caractères

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

Vous devez définir le codage sur ISO 8859-1 et désactiver les avertissements.

lortabac
la source
Je n'ai pas testé ça, mais ça fait vraiment ça ???
ST3
@ ST3 C'est une boucle simple. La variable $west initialement définie sur «a» puis incrémentée jusqu'à ce qu'elle atteigne la première valeur après «mot de passe» (la dernière chaîne n'est pas imprimée).
lortabac
3
@ ST3 C'est une forboucle régulière . Il n'y a rien d'étrange dans ce code, à l'exception des 2 derniers caractères, qui sont des espaces inversés au niveau du bit. Quoi qu'il en soit, oui, je l'ai testé jusqu'à un mot plus court.
lortabac
1
@ ST3 Voici un test de passwoqsà password. Parce que l'encodage du codepad n'est pas ISO 8859-1, j'ai dû le remplacer par un espace blanc.
lortabac
1
Vous pouvez enregistrer un caractère avec $w<passworeau lieu de $w!=passwore.
Decent Dabbler
2

Ruby (40 caractères)

Interpréter une chaîne de lettres az comme un nombre en base 26, avec a = 1, b = 2, ..., z = 26.

Le "mot de passe" peut donc être considéré comme le nombre 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)

Si nous laissons s = "a"(c'est-à-dire: 1) et faisons (N-1) des appels à s.succ!, s sera "password"(N). En d'autres termes, N = 1 + (N-1).

Pour un exemple qui s'exécutera plus rapidement, pour prouver que le calcul de N est correct, considérez "pass"comme la cible, où N est

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

et

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

Puisque nous voulons "a"aussi imprimer , nous avons besoin

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

Revenons donc au "mot de passe" complet. N = 129052722140, en quittant:

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

J'ai cherché une forme plus compacte 129052722140 == 0x1e0c2443dbmais je n'en ai pas trouvé.

(Mis à jour pour corriger le manque d'impression "a", grâce à Cary.)

Adam Prescott
la source
1
Adam, ça devait être toi dans mon esprit. Tu ne veux pas que s en commence un avant «a»?
Cary Swoveland du
Je pense que vous voulez dire que j'ai utilisé Nau lieu de N-1dans mes itérations! Merci, je vais modifier pour corriger. (Bien que 129052722140 soit un nombre intéressant pour Google :).)
Adam Prescott
1
0x1e0c2443db est autant de caractères que 129052722139.
steenslag
Ce que je voulais dire, c'est que si s=?a, s.succ!commence par «b».
Cary Swoveland,
1
Avec s=?aet N-1vous obtenez «b c ... mot de passe»; avec s =<backtick> et Nvous obtenez 'un b ... mot de passe'. L'ER a demandé la sortie pour commencer 'a'. C'est tout.
Cary Swoveland du
2

Javascript, 73

Voici une version à 73 caractères du code de @Briguys, qui imprime uniquement les combinaisons de lettres

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

C5H8NNaO4
la source
2

APL (Dyalog), 46 34

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

Théoriquement, il s'imprimerait jusqu'à MOT DE PASSE, mais j'ai rencontré une erreur complète d'espace de travail après ZZZZ: le tableau à 5 dimensions est tout simplement trop génial.

EDIT: Cela a dû être trop long depuis la dernière fois que j'ai joué avec APL. Comment j'ai osé manquer la comparaison d'identité ( ) !!!

Explication

{...}: Déclare une fonction qui ...
⎕A∘.,⍵: Prend le produit externe sur la concaténation (Chaque combinaison d'un élément de l'opérande gauche concaténé avec un élément de l'opérande droit, tout comme le produit cartésien) entre les 26 alpha ( ⎕A) majuscules ( ) et l'argument ( )

{...}¨: Et pour chaque élément de l'ensemble résultant, branchez-le dans une fonction qui ...
⍞←⍵: l'imprime
'PASSWORD '≡et le compare avec 'PASSWORD '
: Si la comparaison renvoie true ( 1), alors abandonnez le programme.
: Sinon, renvoyez simplement la chaîne imprimée.

: Enfin, la fonction extérieure se recuit.

(Ensuite, vous prenez le produit extérieur sur le concaténat entre le 26 alpha et le 26 alpha, qui donne toutes les combinaisons de 2 lettres, puis le produit extérieur sur le concaténat entre les combinaisons de 2 lettres et le 26 alpha, etc ... Jusqu'à ce que vous atteindre MOT DE PASSE qui déclenche l'abandon)

' ': L'étincelle!! Cela lance la fonction récursive avec le caractère espace.

TwiNight
la source
2

Python 2 - 153 152 151 151 149 octets

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)

Un octet enregistré en utilisant UPPERCASE et un en utilisant des sauts de ligne au lieu d'espaces.

pppery
la source
1

Golfscript 41

Par manque de 'z'+1 == 'aa'logique, Golfscript ne peut pas gagner celui-ci.

168036262484,(;{27base{96+}%' '+.96?0<*}%
  • 168036262484, créer un tableau de 0 à 168036262483
  • (; laissez tomber le 0
  • {.. }%itérer sur le tableau
  • 27base convertir l'élément en tableau de base 27
  • {96+}% ajouter 96 à chaque chiffre
  • ' '+ convertir en chaîne et ajouter un espace à la fin
  • .96?0<* tronquer la chaîne à zéro si elle contient le caractère 96
aaaaaaaaaaaa
la source
1

En rubis, 39 40.

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

..ou 129052722140. (Edit: anciennement je l'avais fait 129052722. J'avais perdu des chiffres à couper et coller. L'hex précédent ( 0x7B13032) était pour un nombre incorrect.). Emprunté a=?`à @Doorknob pour enregistrer un personnage.

Cary Swoveland
la source
J'ai essayé de réparer le a=?` truc, ça a l'air un peu bizarre et a un espace supplémentaire à la fin mais au moins ça marche: P
Poignée de porte
D'où vient le numéro 129052722? D'après mes calculs, cela semble vous donner la plage "a" à "kwkokg" ... un peu petite.
boîte à pain le
@Breadbox J'ai calculé ce nombre avec la méthode suivante (désolé pour la mise en forme, mais les commentaires ont des limites, hein?): 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 Il est facile de confirmer que c'est correct en imprimant simplement certaines séquences.
Cary Swoveland du
@breadbox Vous aviez raison. Voir modifier. La méthode que j'ai donnée en commentaire est OK.
Cary Swoveland
Erreurs de clôture. Votre script calcule en utilisant a = 1..z = 26. Vous devez calculer a = 0..z = 25 pour obtenir le bon nombre. En supprimant le -1 de la première ligne, vous obtiendrez 120699639557, qui (en ajoutant un pour l'entrée zéro) correspond à mon calcul.
boîte à pain le
1

Javascript: 57 56 caractères (merci C5H8NNaO4)

Voici une solution qui inclut des nombres comme caractères possibles ("0", "1", "2", .., "passwor9", "passwora", "passworb", "passworc", "password")

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

Voici un violon pour les tests (avec seulement les 100 dernières itérations pour ne pas verrouiller votre navigateur).

Briguy37
la source
3
Cette solution est erronée, elle ne suit pas les spécifications.
Poignée de porte
@ Doorknob - Oui, je l'ai mentionné dans ma réponse. Il imprime toujours tous les cas à partir des exigences d'origine, mais imprime également tous les cas alphanumériques.
Briguy37
De plus, après avoir relu la question, si je mettais i à 9 dans mon code, cela répondrait à TOUTES les exigences de la question à l'exception de son exemple de sortie, pour lequel il a déjà donné une exception (et cela porterait le code à 56 caractères ).
Briguy37
@ Briguy37 La spécification dit print every **letter** combinationQuoi qu'il en soit, enregistrez un personnage:{} -> ;
C5H8NNaO4
@ C5H8NNaO4: Quelle combinaison de lettres ma solution n'imprime-t-elle pas? Merci pour le conseil!
Briguy37
1

Haskell, 101

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

Befunge (72)

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

Imprime les chaînes «a» à «mot de passe» séparées par des espaces, puis quitte.

Ci-dessous, une version qui n'imprime que les 9 * 9 = 81 premiers mots ('a' à 'dd'), pour comparaison. Le 99*est le nombre d'itérations à effectuer.

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

JavaScript 80 76

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

violon - s'arrête à "pa".

cependant, cela répète les choses.

Refroidisseur de mathématiques
la source
Vous pouvez initialiser la boucle avec i=s=0pour enregistrer trois autres caractères.
Ry-
@minitech done.
Math chiller
1
Pourquoi garder le var? iétait un monde avant; sest maintenant un mondial. Vous pouvez simplement garder les deux mondiaux dans le golf de code, généralement.
Ry-