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.


@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
)

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 [].)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.