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 Functionde 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 nullpero 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, nullo cualquiera de las letras r s l kserí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

eval2453 caracteres conwindowpermitido.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,[]+xnos da una representación de cadena dexen 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 Nsiguen las letras .El uso del
++truco en cualquier valor no entero alcanzado hasta ahora daNaNo 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
0123456789adefinuNqueNúmeros literales
Como un ejemplo de la segunda opción, podemos hacer la cadena
"1e1000", y luegoInfinitydesde+"1e1000"y fundición que volver a cadena no nos lleva a las letrasyyI.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
InfinityyNaN, 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.concatestá en desuso: hace exactamente lo que+hace, lo que ya podemos hacer. Así que tenemosArray.prototype.concatyArray.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.concatno modifica nuestros valores, y nunca puede regresarnullni 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
nullfunciones 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 algoevalparecido 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,
windowse 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.concathaciendo 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 obtenerrysusar 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[].concatya significa[]["concat"]. La única forma en que sé cuál podría construirse usando+[]()es devolverlo desde una función.Array.prototype.findparecía ser capaz de hacer eso:Siempre tuvimos funciones de verdad.
Array.prototype.concatyString.prototype.concatambos devuelven la verdad si el objeto eswindow. Si usamos la última, usamos las tres funciones disponibles.Pero, desafortunadamente,
Array.prototype.findno 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
rys, con la.bind(window)solución alternativa:fuente
findllegó 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.findaún no se implementó, ¿tal vez fue parcial? ... Si solo estuviera en su lista ...