Escriba un programa que realice una combinación de letras de fuerza bruta hasta que se encuentre la palabra "contraseña"

16

El programa debe imprimir todas las combinaciones de letras (minúsculas o mayúsculas, no importa) en orden alfabético. Debe comenzar con ay la última combinación impresa debe ser password.

La salida debe ser:

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
fuente
2
¿Los separadores tienen que ser espacios o puedo usar líneas nuevas?
Ilmari Karonen
Sí, puedes, es solo un cambio menor.
ST3

Respuestas:

32

Perl, 19 caracteres

say for a..password

Utiliza líneas nuevas como delimitadores, según la aclaración anterior. Ejecute con perl -M5.010(o solo perl -E 'say for a..password') para habilitar Perl 5.10+say . Por meta , esto no cuenta como caracteres adicionales.

(Si insiste en los espacios como delimitadores, $,=$";say a..passwordsolo son dos caracteres más largos. Sin embargo, también es muy lento y desperdicia la memoria, hasta el punto de ser inutilizable en la práctica, ya que intenta construir la lista completa en la memoria antes de imprimirla).

Ilmari Karonen
fuente
18

Ruby, 33 caracteres (versión óptima pero más larga)

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

Me gusta el 'a'.upto('password'); te dice exactamente lo que está haciendo. Ruby es genial y expresivo así.:D

Por supuesto, print c,' 'también sería mucho más claro, pero usar $>es dos caracteres más cortos.

Ruby, 29 25 caracteres (versión lenta)

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

Este es más corto, pero imprime todas las fichas a la vez, por lo que lleva mucho, mucho tiempo ejecutarlo.

Pomo de la puerta
fuente
1
Agradable, especialmente el primero.
Cary Swoveland
En la versión lenta, (?a..'password').to_ase puede acortar a[*?a..'password']
Paul Prestidge
6

Perl, 33 32 24 caracteres

Una solución en 32 caracteres:

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

no hay mucho que decir sobre éste. Podría reducir esto a 27 caracteres si pudiera usar nuevas líneas en lugar de espacios para separar las entradas.

Ilmari Karonen señala que ..internamente llama ++, por lo que una mejor solución (25 caracteres) sería:

print$_,$"for a..password

Al aprovechar las opciones de línea de comandos de Perl, aquí hay una solución equivalente de 24 caracteres:

perl -l40e 'print for a..password'

Las reglas para contar las banderas de Perl están aquí, para aquellos que no están familiarizados con ellas.

Por supuesto, la solución de 21 caracteres de Ilmari es aún más corta, pero requiere una máquina que pueda asignar una matriz de 129,052,722,140 cadenas.

caja de pan
fuente
¿En .$"lugar de ," "salvar a un personaje?
Sr. Llama
Sí, supervisión total de mi parte. Gracias.
breadbox el
6

Perl 6, 20 caracteres

say "a".../password/

No necesitas otras cosas

Demayl
fuente
5

Pitón 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
fuente
4

PHP 38 37 36 caracteres

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

Debe establecer la codificación en ISO 8859-1 y desactivar las advertencias.

lortabac
fuente
No probé eso, pero ¿realmente hace eso?
ST3
@ ST3 Es un bucle simple. La variable $wse establece inicialmente en 'a' y luego se incrementa hasta que alcanza el primer valor después de 'contraseña' (la última cadena no se imprime).
lortabac
3
@ ST3 Es un forciclo regular . No hay nada extraño en este código, excepto los últimos 2 caracteres, que son espacios en blanco invertidos en bits. De todos modos, sí, lo probé con una palabra más corta.
lortabac
1
@ ST3 Aquí hay una prueba de passwoqsa password. Debido a que la codificación del teclado no es ISO 8859-1, tuve que reemplazar con un espacio en blanco.
lortabac
1
Puede guardar un char $w<passworeen lugar de $w!=passwore.
Dabbler decente
2

Ruby (40 caracteres)

Interprete una cadena de letras az como un número en la base 26, con a = 1, b = 2, ..., z = 26.

Entonces "contraseña" puede considerarse como el número 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 dejamos s = "a"(es decir: 1) y hacemos llamadas (N-1) a s.succ!, s será "password"(N). En otras palabras, N = 1 + (N-1).

Para un ejemplo que se ejecutará más rápidamente, para demostrar que el cálculo de N es correcto, considere "pass"como el objetivo, donde N es

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

y

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

Como también queremos imprimir "a", necesitamos

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

Así que de vuelta a la "contraseña" completa. N = 129052722140, dejando:

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

Busqué una forma más compacta de, 129052722140 == 0x1e0c2443dbpero no pude encontrar una.

(Actualizado para corregir la falta de impresión "a", gracias a Cary).

Adam Prescott
fuente
1
Adam, debes haber sido tú en mi fusión mental. ¿No quieres que comience una antes de 'a'?
Cary Swoveland
¡Creo que a lo que te refieres es que lo he usado en Nlugar de N-1en mis iteraciones! Gracias, editaré para arreglar. (Aunque 129052722140 es un número interesante para Google :).)
Adam Prescott
1
0x1e0c2443db tiene tantos caracteres como 129052722139.
steenslag
Lo que quise decir es que si s=?a, s.succ!comienza en 'b' '.
Cary Swoveland
1
Con s=?ay N-1obtienes 'b c ... contraseña'; con s =<backtick> y Nobtienes 'una b ... contraseña'. El SO solicitó la salida para comenzar 'a'. Eso es todo.
Cary Swoveland
2

Javascript, 73

Aquí hay una versión de 73 caracteres del código de @Briguys, que imprime solo combinaciones de letras

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

C5H8NNaO4
fuente
2

APL (Dyalog), 46 34

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

Teóricamente, se imprimiría hasta CONTRASEÑA, pero encontré un error de espacio de trabajo completo después de ZZZZ: la matriz de 5 dimensiones es demasiado impresionante.

EDITAR: Debe haber pasado demasiado tiempo desde la última vez que jugueteé con APL. ¡Cómo me atreví a perder la comparación de identidad ( )!

Explicación

{...}: Declara una función que ...
⎕A∘.,⍵: toma el producto externo sobre la concatenación (cada combinación de un elemento del operando izquierdo concatenado con un elemento del operando derecho, al igual que el producto cartesiano) entre las 26 mayúsculas alfa ( ⎕A) y el argumento ( )

{...}¨: Y para cada elemento del conjunto resultante, conéctelo a una función que ...
⍞←⍵: lo imprima
'PASSWORD '≡y compárelo con 'PASSWORD '
: Si la comparación devuelve verdadero ( 1), entonces cancele el programa.
: De lo contrario, solo devuelve la cadena impresa.

: Finalmente, la función externa se repite.

(Luego está tomando el producto externo sobre el concat entre el 26 alfa y el 26 alpha, que da todas las combinaciones de 2 letras, y luego el producto externo sobre el concat entre las combinaciones de 2 letras y el 26 alpha, etc. ... hasta que alcanzar CONTRASEÑA que desencadena el aborto)

' ': ¡¡La chispa!! Eso inicia la función recursiva con el carácter de espacio.

TwiNight
fuente
2

Python 2 - 153 152 151 149 bytes

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)

Se guardó un byte usando MAYÚSCULAS y otro usando nuevas líneas en lugar de espacios.

pppery
fuente
1

Golfscript 41

Por falta de 'z'+1 == 'aa'lógica, Golfscript no puede ganar este.

168036262484,(;{27base{96+}%' '+.96?0<*}%
  • 168036262484, crear matriz de 0 a 168036262483
  • (; soltar el 0
  • {.. }%iterar sobre la matriz
  • 27base convertir elemento a base 27 matriz
  • {96+}% agregue 96 a cada dígito
  • ' '+ convertir a cadena y agregar un espacio al final
  • .96?0<* truncar cadena a cero si contiene char 96
aaaaaaaaaaaa
fuente
1

En Ruby, 39 40.

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

..o 129052722140. (Editar: anteriormente lo había hecho 129052722. Había perdido algunos dígitos cortando y pegando. El hexadecimal anterior ( 0x7B13032) era por un número incorrecto). Prestado a=?`de @Doorknob para guardar un personaje.

Cary Swoveland
fuente
Traté de arreglarlo a=?` , se ve un poco extraño y tiene un espacio extra al final, pero al menos funciona: P
Pomo de la puerta
Entonces, ¿de dónde viene el número 129052722? Según mis cálculos, eso parecería darle el rango "a" a "kwkokg" ... un poco pequeño.
breadbox
@Breadbox Calculé ese número con el siguiente método (perdón por el formato, pero los comentarios tienen limitaciones, ¿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 Es fácil confirmar que esto es correcto simplemente imprimiendo algunas secuencias.
Cary Swoveland
@breadbox Tenías razón. Ver editar. El método que di en el comentario está bien.
Cary Swoveland
Errores de poste de cerca. Su script está calculando usando a = 1..z = 26. Necesita calcular a = 0..z = 25 para obtener el recuento correcto. Al eliminar el -1 de la primera línea, obtendrá 120699639557, que (agregando uno para la entrada cero) coincide con mi cálculo.
breadbox
1

Javascript: 57 56 caracteres (gracias C5H8NNaO4)

Aquí hay una solución que incluye números como posibles caracteres ("0", "1", "2", .., "passwor9", "passwora", "passworb", "passworc", "contraseña")

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

Aquí hay un violín para probar (con solo las últimas 100 iteraciones para que no bloquee su navegador).

Briguy37
fuente
3
Esta solución es incorrecta, no sigue las especificaciones.
Pomo de la puerta
@Doorknob: Sí, lo mencioné en mi respuesta. Todavía imprime todos los casos de los requisitos originales, pero también imprime todos los casos alfanuméricos.
Briguy37
Además, después de volver a leer la pregunta, si configuro i en 9 en mi código, cumpliría TODOS los requisitos de la pregunta, excepto su salida de ejemplo, para la cual ya ha dado una excepción (y elevaría el código a 56 caracteres) )
Briguy37
@ Briguy37 La especificación dice print every **letter** combinationDe todos modos, guarde un personaje:{} -> ;
C5H8NNaO4
@ C5H8NNaO4: ¿Qué combinación de letras no imprime mi solución? ¡Gracias por el consejo!
Briguy37
1

Haskell, 101

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

Befunge (72)

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

Imprime las cadenas 'a' a 'contraseña' separadas por espacios, luego sale.

A continuación se muestra una versión que imprime solo los primeros 9 * 9 = 81 palabras ('a' a 'dd'), para comparar. El 99*es el número de iteraciones a realizar.

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

JavaScript 80 76

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

violín - se detiene en "pa".

Sin embargo, esto sí repite las cosas.

Enfriador de matemáticas
fuente
Puede inicializar el ciclo con i=s=0para guardar tres caracteres más.
Ry-
@minitech hecho.
Enfriador matemático
1
¿Por qué quedarse con el var? ifue un antes global; ahora ses un global. Por lo general, puede mantener ambos globos globales en el código de golf.
Ry-