Konwertuj JSF ** k na normalny JS

12

Wielu z was już zna JSF ** k . Dla tych, którzy tego nie robią, jest to skrypt, który w zasadzie zamienia dowolny kod JavaScript w coś napisanego tylko za pomocą []()!+.

Twoim zadaniem jest zbudowanie, przy użyciu dowolnego wybranego języka, programu, który konwertuje JSF ** k na nieobrobiony JavaScript.

  • Dane wejściowe : ciąg znaków z poprawnym kodem JSF ** k.
  • Dane wyjściowe : ciąg znaków ze zwykłym kodem JavaScript, który wcześniej był generowany przez JSF ** w celu wygenerowania danych wejściowych.

W przypadku tego wyzwania należy wziąć pod uwagę, że łańcuch wejściowy został tylko raz zapisany w JSF **.

To jest konkurs , więc wygrywa najkrótszy kod w bajtach.

William Barbosa
źródło
@Michael, ale czy kodowanie jest jednoznacznie odwracalne? Nie sądzę ... jak zdecydować, czy jakiś [...]dostęp do tablicy był częścią oryginalnego kodu, czy też częścią zaciemnienia? tak samo dla wszystkich innych konstrukcji.
Martin Ender
2
@JanDvorak oh co ... to jest tak bezproduktywne ... moglibyśmy mu pomóc w rozwiązaniu tego pytania i przegłosowaniu zamiast przegłosowaniu.
Martin Ender
2
@ m.buettner Zagłosowałem, ponieważ nie sądzę, aby pytanie nigdzie się kończyło. Zdecydowanie nie chcę głosować za postem, aby odblokować komuś pewne przywileje.
John Dvorak
2
@ JanDvorak Myślę, że nie powinniśmy zniechęcać nowych użytkowników, którzy chcą pisać dobre wyzwania i słuchać krytyki. Ponieważ piaskownica jest na meta i pozostanie tam, głosowanie w dół przynosi efekt przeciwny do zamierzonego. Zamknięcie jest całkowicie wystarczające. Nie sądzę, aby jeden głos byłby szkodliwy dla nikogo, i dałby użytkownikowi szansę na faktyczne wejście do tej społeczności. Ale ktoś zgodził się z tobą i postanowił też głosować, bo do cholery, dlaczego nowi użytkownicy powinni mieć możliwość publikowania w piaskownicy (tak sądzę) ... a teraz nadal nie może tam publikować. Nie sądzę, że tak rozwijamy tę społeczność.
Martin Ender
1
Czy możesz dodać wyjaśnienie, co oznacza normalny JavaScript ? Może nie być oczywiste, w jaki sposób należy dokonać transformacji wstecznej. Na przykład, jeśli powtórzę obfustator dwa razy na jakimś ładnym wejściu, jakie jest sugerowane wyjście? Oryginalny program lub dane wejściowe, które zostały już zaciemnione?
Howard

Odpowiedzi:

12

JavaScript - 68 55 51

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

Alternatywnie: (ta sama długość)

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

Działa w konsoli przeglądarki. Gwarantowana tylko praca z kodem generowanym przez jsfuck.com z zaznaczoną opcją „Eval Source”.

Nie golfowany:

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
źródło
W sugerowanej edycji, którą odrzuciłem, @ user3082537 zasugerował użycie wyrażenia regularnego zamiast wycinka, jak wreplace(/^.*\n|\n}$/g,'')
user12205
7

JavaScript, 122, działa z dowolnym wejściem

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

Dość proste; po prostu wraca do łańcucha, dopóki nawiasy ( (i )) nie są zrównoważone. Ostatnie trzy znaki wyjścia JSF są zawsze )() , więc wycięcie ostatnich 2 parenów, a następnie znalezienie pasujących paren dla drugiego zawsze będzie działać. (Działa również z danymi wejściowymi [].)

Klamka
źródło