Esto no es un desafío sino una pregunta, pensé que estaba en el tema debido a
Las preguntas que no son de desafío relacionadas con la resolución de acertijos de programación o un tipo particular de desafío también están en el tema.
Ahora a la pregunta:
¿Es posible escribir algún código JavaScript con solo 5 letras? JSFuck ya hace esto con 6 símbolos, !+[]()
pero me pregunto si !
se necesita el personaje.
JSFuck funciona con una combinación de conversión a cadena (agregando una matriz vacía), conversión a número (escribiendo un + al frente) y conversión a booleano al negar. Por ejemplo:
[] \\ Empty array
+[] \\ Cast to number -> 0
!+[] \\ Negate -> true
!+[]+[] \\ Cast to string -> "true"
De esta cadena podemos extraer todas sus letras usando corchetes con un número dentro, y cualquier número se puede hacer sumando tantas veces como sea verdadero.
De esta manera, se pueden encontrar muchas letras y se pueden concatenar en cadenas. La cadena más importante para poder crear es "constructor"
porque se puede usar para obtener Function
de cualquier función, y este objeto se puede usar para ejecutar cadenas como JavaScript:
[]["find"] \\ the function Array.prototype.find
[]["find"]["constructor"] \\ the Function object
[]["find"]["constructor"](string)() \\ same as eval(string)
Como puedes ver, !
tiene 2 usos aquí:
- Crear números para seleccionar letras de cadenas.
- Fundición a booleana para obtener
"true"
y"false"
.
El primero de estos 2 también se puede hacer usando el ++
incrementador, no directamente 0
, pero se puede usar en elementos dentro de una matriz:
+[] \\ 0
[+[]] \\ [0]
[+[]][+[]] \\ [0][0] -> 0
++[+[]][+[]] \\ ++[0][0]-> 1
++[[]][+[]] \\ also works because ++ casts to number
Por lo tanto, todos los números se pueden crear sin !
.
El segundo es más difícil. La importancia de "true"
y "false"
en las letras "r"
y "s"
, que aparecen en ambos "constructor"
. Ya he encontrado todas las otras letras de "constructor"
a través de "undefined"
, "Infinity"
, "NaN"
y por funciones de conversión de cadenas.
Entonces, la última pregunta: (¿Cómo) puede crear booleanos, o las letras "r"
y "s"
en JavaScript con solo usar +[]()
?
La carta "l"
también podría ayudar. Se puede obtener de forma null
pero no he podido obtener ese valor con esos 5 símbolos. Por ejemplo, se puede usar para obtener booleanos si ya tenemos "s"
:
[]["includes"]() \\ false
[+[]]["includes"](+[]) \\ true
La carta "l"
y "k"
juntos darían acceso a "r"
:
([]+[])["link"]() \\ "<a href="undefined"></a>"
¡Cualquier forma de obtener un booleano, null
o cualquiera de las letras r s l k
sería muy útil!
Una biblioteca de lo que tenemos:
Array.prototype.find: [] [(([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + ( ++ [[]] [+ []])]) + (([] [[]] + []) [++ [[]] [+ []]]) + (([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] Infinito: + ((++ [[]] [+ []] + []) + (([] [[]] + []) [(++ [[]] [+ []]) + (+ + [[]] [+ []]) + (++ [[]] [+ []])]) + (++ [[]] [+ []] + []) + (+ []) + (+ []) + (+ [])) NaN: + [] [[]] indefinido: [] [[]] 0: + [] 1: ++ [[]] [+ []] 2: (++ [[]] [+ []]) + (++ [[]] [+ []]) 3: (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) 4: (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] ] [+ []]) 5: (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] ] [+ []]) + (++ [[]] [+ []]) 6: (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] ] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) 7: (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] ] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) 8: (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] ] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) 9: (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] ] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) a: (+ [] [[]] + []) [++ [[]] [+ []]] c: ([] [(([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [[]] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []])]) + (([] [[]] + []) [++ [[]] [+ []]]) + (([] [[]] + [] ) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])] d: ([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []])] e: ([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [ + []])] f: ([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [ + []]) + (++ [[]] [+ []])] i: ([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [ + []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])] n: ([] [[]] + []) [++ [[]] [+ []]] o: ([] [(([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [[]] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []])]) + (([] [[]] + []) [++ [[]] [+ []]]) + (([] [[]] + [] ) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])] t: (+ ((++ [[]] [+ []] + []) + (([] [[]] + []) [(++ [[]] [+ []]) + ( ++ [[]] [+ []]) + (++ [[]] [+ []])]) + (++ [[]] [+ []] + []) + (+ [] ) + (+ []) + (+ [])) + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ [] ])] u: ([] [[]] + []) [+ []] v: ([] [(([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [[]] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []])]) + (([] [[]] + []) [++ [[]] [+ []]]) + (([] [[]] + [] ) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + [] + ((++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]))] y: (+ ((++ [[]] [+ []] + []) + (([] [[]] + []) [(++ [[]] [+ []]) + ( ++ [[]] [+ []]) + (++ [[]] [+ []])]) + (++ [[]] [+ []] + []) + (+ [] ) + (+ []) + (+ [])) + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ [] ]) + (++ [[]] [+ []])] I: (+ ((++ [[]] [+ []] + []) + (([] [[]] + []) [(++ [[]] [+ []]) + ( ++ [[]] [+ []]) + (++ [[]] [+ []])]) + (++ [[]] [+ []] + []) + (+ [] ) + (+ []) + (+ [])) + []) [+ []] N: (+ [] [[]] + []) [+ []] "": ([] [(([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (+ + [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [[]] + []) [++ [[]] [+ []]]) + (([] [[]] + [ ]) [(++ [[]] [+ []]) + (++ [[]] [+ []])] + +]] [+ (++ [[]] [+ [] ] + [] + ((++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (+ + [[]] [+ []]) + (++ [[]] [+ []])))] (: ([] [(([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [[]] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []])]) + (([] [[]] + []) [++ [[]] [+ []]]) + (([] [[]] + [] ) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [+ (++ [[]] [+ []] + [] + ((++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])))] ): ([] [(([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [[]] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []])]) + (([] [[]] + []) [++ [[]] [+ []]]) + (([] [[]] + [] ) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [+ (++ [[]] [+ []] + [] + ((++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])))] {: ([] [(([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [[]] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []])]) + (([] [[]] + []) [++ [[]] [+ []]]) + (([] [[]] + [] ) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [+ (++ [[]] [+ []] + [] + ((++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])))] }: ([] [(([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [[]] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []])]) + (([] [[]] + []) [++ [[]] [+ []]]) + (([] [[]] + [] ) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [+ ((++ [[]] [+ [] ]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + [] + ((++ [[]] [+ []]) + ( ++ [[]] [+ []])))] .: (+ (++ [[]] [+ []] + [] + (++ [[]] [+ []]) + ([] [[]] + []) [(++ [ []] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])] + (++ [[]] [+ [] ] + [] + (+ []) + (+ []))) + []) [++ [[]] [+ []]] ,:[[]] [([] [(([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + ( ++ [[]] [+ []])]) + (([] [[]] + []) [++ [[]] [+ []]]) + (([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []])] + ([] [(([] [[]] + []) [ (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [ + []])]) + (([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + ( ++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [[]] ] + []) [++ [[]] [+ []]]) + (([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []] )] + ([] [[]] + []) [++ [[]] [+ []]] + ([] [(([] [[]] + []) [(++ [[ ]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) ]) + (([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] ] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [[]] + []) [++ [[]] [+ []]]) + (([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [ + []])])] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])] + (+ [] [[]] + []) [++ [[]] [+ []]] + (+ ((++ [[]] [+ []] + []) + (([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + ( ++ [[]] [+ []] + []) + (+ []) + (+ []) + (+ [])) + []) [(++ [[]] [+ [] ]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[ ]] [+ []]) + (++ [[]] [+ []])]] ([[]]) + []
fuente
eval
2453 caracteres conwindow
permitido.Respuestas:
Después de una lluvia de ideas , el resultado parece ser que, al menos en los navegadores modernos, no hay forma de hacerlo.
Trataré de resumir todo el proceso, agregando algunos razonamientos sobre por qué hemos agotado nuestras opciones en cualquier dominio antes de continuar. Luego, salvo algún tipo de información nueva y sorprendente (como un caso de esquina de la sintaxis de JavaScript que todos están olvidando) quedará bastante claro que no hay forma de obtener las letras restantes.
Literales
Las única inmediatos literales que puede hacer con
+()[]
son las matrices vacías anidados[]
,[[]]
,[[[]]]
, etc. A partir de ahí, podemos empezar valores mediante fundición+
:+[]
obtiene cero, que el truco de Jens expande a enteros positivos arbitrarios usando++
.[]+[]
es""
. De hecho,[]+x
nos da una representación de cadena dex
en general.[]
El siguiente uso es la indexación. Indexar un objeto fuera de los límites ([][[]]
) te atrapaundefined
. Lanzar eso a una cadena e indexar el resultado te da las letrasd e f i n u
; lanzarlo a un número entero primero usando+
te obtieneNaN
, de dondea N
siguen las letras .El uso del
++
truco en cualquier valor no entero alcanzado hasta ahora daNaN
o se produce un error. Además, ninguno de los objetos que podemos crear son invocables (todavía), por lo()
que no ayuda (excepto la agrupación).Los trucos restantes bajo nuestra manga son el casting y la indexación. Entonces la pregunta es: qué cadenas podemos crear usando los caracteres
0123456789adefinuN
queNúmeros literales
Como un ejemplo de la segunda opción, podemos hacer la cadena
"1e1000"
, y luegoInfinity
desde+"1e1000"
y fundición que volver a cadena no nos lleva a las letrasy
yI
.Además, podemos hacer
"11e100"
, lanzar al número y volver a la cadena, para obtener"1.1e+101"
, de donde extraemos.
y+
.Usando eso
.
, a su vez, podemos hacer la cadena".0000001"
, lanzarla al número y viceversa, para obtener"1e-7"
, ganándonos-
.Eso es básicamente todos los flotantes lo conseguirán: no hay más valores interesantes que no sean
Infinity
yNaN
, y no hay más caracteres utilizados en sus representaciones de cadenas habituales que no sean-+.0123456789e
.Propiedades
Entonces tenemos las letras
-+.0123456789adefinuyIN
. ¿Qué propiedades podemos alcanzar? Preguntemos JavaScript.Solo
[].find
, que Jens ya encontró. Vamos a convertir eso en una cadena, cosechar todas sus letras e intentarlo de nuevo. La representación de la cadena es un poco diferente en todos los navegadores. En Chrome y Edge,"function find() { [native code] }"
contieneacdefinotuv()[]{}
y un espacio; Nuestro alfabeto completo es ahora+-.()[]{}0123456789INacdefinotuvy
. En Firefox, hay más espacios y nuevas líneas, pero las letras son las mismas.Repetimos nuestra búsqueda:
String.prototype.concat
está en desuso: hace exactamente lo que+
hace, lo que ya podemos hacer. Así que tenemosArray.prototype.concat
yArray.prototype.find
. ¿Qué podemos hacer con ellos?Las funciones
concat()
nos permite crear, por primera vez, matrices más largas.[[]].concat([[]])
es[[], []]
, y lanzar eso a una cuerda nos atrapa","
. (Esto no nos ayuda a encontrar nuevas propiedades). Pero.concat
no modifica nuestros valores, y nunca puede regresarnull
ni nada de eso.Llamar
find()
tampoco nos ayuda: la documentación de MDN diceLos dos ya podemos hacerlos usando la indexación.
Y a partir de aquí, no hay otro lugar a donde ir. Si dudas de algo que he escrito, házmelo saber en los comentarios.
fuente
null
funciones que devuelven:String.prototype.match
,RegExp.exec
, yArray.prototype.includes
. Al encontrar que todo esto es imposible de formar, a menos que haya una forma extraña de formar una expresión regular que no conozca, también he concluido que no hay forma posible de hacerlo."catch"
y"throw"
, lo que actualmente no podemos, necesitaríamos algoeval
parecido a usarlas como palabras clave, que es nuestro objetivo en primer lugar.-
y la conversión de números, pero eso no es muy útil.Las 3 funciones en la respuesta de Lynn no fueron tan inútiles. Pero el modo estricto en ECMAScript 5 frustrado mi plan.
Hay una peculiaridad en las versiones anteriores de JavaScript / ECMAScript. Si se llama a un método sin un objeto,
window
se supone el objeto global . Entonces podemos hacer esto:Esto sigue siendo cierto para los navegadores modernos, pero solo si la función no está definida en modo estricto. Y todas las funciones integradas (con código nativo) parecían estar en modo estricto. En los navegadores más antiguos cuando todavía no existe el modo estricto, esto también funciona para las funciones integradas.
Supongamos que estamos usando navegadores antiguos. Entonces, si queremos
window
, tenemos que encontrar una función incorporada que devuelva algo que contengathis
. Dentro de las únicas opciones que teníamos, está la funciónArray.prototype.concat
haciendo exactamente eso. Podemos probarlo así:Entonces, básicamente no le importa si el objeto al que se llama es una matriz (pero debe ser un objeto en lo más mínimo). Simplemente lo envuelve en una matriz si no.
Si lo hubiéramos hecho
window
, en primer lugar podemos obtener la cadena[object Window]
convirtiéndola en una cadena. Con el nuevo personajeb
, podemos obtenerr
ys
usar las siguientes dos líneas respectivamente, y cada personaje que no teníamos enconstructor
:Pero el otro problema es eliminar la referencia del objeto
[].concat
. Envolverlo en una matriz y extraer no funciona, porque[].concat
ya significa[]["concat"]
. La única forma en que sé cuál podría construirse usando+[]()
es devolverlo desde una función.Array.prototype.find
parecía ser capaz de hacer eso:Siempre tuvimos funciones de verdad.
Array.prototype.concat
yString.prototype.concat
ambos devuelven la verdad si el objeto eswindow
. Si usamos la última, usamos las tres funciones disponibles.Pero, desafortunadamente,
Array.prototype.find
no existe en el navegador antiguo que estamos usando. Al menos no encontré uno que funcione. Y no encontré otra forma de eliminar la referencia del objeto.El código completo que se puede probar en los navegadores modernos que regresa
r
ys
, con la.bind(window)
solución alternativa:fuente
find
llegó mucho más tarde que el modo estricto, por lo que es poco probable encontrar algo que funcione. Pregunté por Edge porque pensé que podría tener la posibilidad de preferir la compatibilidad con versiones anteriores a seguir el estándar. También probé Konqueror por la misma razón. Y algunos navegadores de línea de comandos, pero ninguno de ellos admite JavaScript.find
aún no se implementó, ¿tal vez fue parcial? ... Si solo estuviera en su lista ...