Convertir JSF ** k en JS normal

12

Beaucoup d'entre vous connaissent déjà JSF ** k . Pour ceux qui ne le font pas, c'est un script qui transforme fondamentalement tout code JavaScript en quelque chose d'écrit en utilisant uniquement []()!+.

Votre tâche consiste à créer, en utilisant n'importe quelle langue de votre choix, un programme qui convertit JSF ** k en JavaScript non obscurci.

  • Entrée : une chaîne avec un code JSF ** k valide.
  • Sortie : une chaîne avec le code JavaScript normal qui a été précédemment JSF ** ked pour générer l'entrée.

Pour ce défi, considérez que la chaîne d'entrée n'a été ked JSF ** qu'une seule fois.

Il s'agit d'un concours de , donc le code le plus court, en octets, gagne.

William Barbosa
la source
@Michael mais le codage est-il réversible sans ambiguïté? Je ne pense pas ... comment puis-je décider si un [...]accès à un tableau faisait partie du code d'origine ou de l'obfuscation? même pour toutes les autres constructions, vraiment.
Martin Ender
2
@JanDvorak oh quoi ... c'est tellement contre-productif ... nous pourrions l' aider à clore cette question et à voter positivement au lieu de diminuer.
Martin Ender
2
@ m.buettner J'ai voté contre parce que je pense que la question ne va nulle part. Je ne veux certainement pas voter un article juste pour débloquer des privilèges pour quelqu'un.
John Dvorak
2
@JanDvorak Je pense que nous ne devons pas décourager les nouveaux utilisateurs qui veulent écrire de bons défis et écouter les critiques. Comme le bac à sable est sur méta et y restera, le vote à la baisse est contre-productif. La fermeture est totalement suffisante. Je ne pense pas qu'un seul vote positif nuirait à quiconque, et cela donnerait à l'utilisateur la chance de trouver réellement une entrée dans cette communauté. Mais quelqu'un était d'accord avec vous et a décidé de voter également, car diable, pourquoi les nouveaux utilisateurs devraient-ils être autorisés à publier dans le bac à sable (je suppose) ... et maintenant il ne peut toujours pas publier là-bas. Je ne pense pas que c'est ainsi que nous développons cette communauté.
Martin Ender
1
Pouvez-vous s'il vous plaît ajouter quelques explications sur ce que signifie JavaScript normal ? Il n'est peut-être pas évident de savoir comment procéder à la rétrotransformation. Par exemple, si j'itère deux fois l'obfustateur sur une belle entrée, quelle est la sortie suggérée? Le programme d'origine ou l'entrée qui était déjà obscurcie?
Howard

Réponses:

12

Javascript - 68 55 51

alert(/\n(.+)/.exec(eval(prompt().slice(0,-2)))[1])

Alternativement: (même longueur)

alert(/.+(?=\n})/.exec(eval(prompt().slice(0,-2))))

Fonctionne dans la console de votre navigateur. Garanti uniquement pour fonctionner avec le code généré par jsfuck.com avec l'option 'Source Eval' cochée.

Non golfé:

alert(
    /\n(.+)/.exec(                 // regex to extract code from inside outer function braces {}
        eval(prompt().slice(0,-2)) // remove the final set of parens () and evaluate the code
                                   // this results in a function, which will be converted to a string as 'exec' expects a string
    )[1]                           // get the first capture group
)
nderscore
la source
Dans une modification suggérée que j'ai rejetée, @ user3082537 a suggéré d'utiliser l'expression régulière au lieu de la tranche, comme dansreplace(/^.*\n|\n}$/g,'')
user12205
7

JavaScript, 122, fonctionne avec n'importe quelle entrée

s=prompt().slice(0,-2)
i=s.length
while(i--){if((l=s.slice(i)).split(')').length==l.split('(').length)break}alert(eval(l))

Assez simple; il revient simplement dans la chaîne jusqu'à ce que les parenthèses ( (et )) soient équilibrées. Les trois derniers caractères de la sortie JSF sont toujours )() , donc découper les 2 dernières parens puis trouver le paren correspondant pour l'autre fonctionnera toujours. (Cela fonctionne également avec l'entrée [].)

Poignée de porte
la source