Oryginalny kod:
[[ ! "${1////x}" =~ [[:alnum:]] ]]&&[[ $# = 1 ]]&&bash -c "$1"
Wejście:
__=; (( __++, __-- ));
(( ___ = __, ___++));
(( ____ = ___, ____++));
(( _____ = ____, _____++));
(( ______ = _____, ______++));
(( _______ = ______, _______++));
(( ________ = _______, ________++));
(( _________ = ________, _________++));
${!__##-} <<<\$\'\\$___$______$_______\\$___$______$_____\\$___$_______$__\\$___$_______$_________\'\ \$\'\\$___$___$__\\$___$______$_______\\$___$_______$______\\$___$_______$______\\$___$_______$_________,\ \\$___$____$_________\\$___$_______$_________\\$___$________$____\\$___$_______$______\\$___$______$______\\$__$______$___\'
Wyjaśnienie:
To koduje „echo Witaj, świecie!” jako ósemkowe sekwencje specjalne (\ xxx).
Tyle że nie możesz także używać liczb, więc pierwsza część tworzy zmienne dla liczb 0-7. Możesz użyć ich do zbudowania łańcucha z sekwencjami ósemkowymi, które będą oceniać, aby dać ci właściwe polecenie.
Ale eval
jest również alfanumeryczny. Więc zamiast tego, te potoki ciąg znaków jako dane wejściowe do innego wystąpienia bash
. $0
zawiera nazwę polecenia użytego do wywołania Bash, który zwykle jest po prostu bash
(lub -bash
dla powłoki logowania), jeśli uruchamiasz go normalnie (przez TIO lub wklejając go w terminalu). (Nawiasem mówiąc, oznacza to, że jeśli spróbujesz uruchomić to poprzez wklejenie go do skryptu, wszystko pójdzie okropnie źle, gdy będzie próbowało się rozwidlić kilka razy).
Ale i tak nie można powiedzieć $0
wprost. Zamiast tego, $__
zawiera nazwę z $0
( „0”), i można użyć ekspansję pośredni do niego dostęp ( ${!__}
odnosi się do zawartości $0
).
I to w końcu daje ci wszystko, czego potrzebujesz.
05AB1E , Adnan
Wypróbuj online!
W jaki sposób?
źródło
całkowicie ludzki , Python 2
Rozwiązaniem jest
źródło
Pyth : Pan Xcoder
G
jest wbudowany w małe litery alfabetu. Kod sprawdza równość z tym.źródło
Galaretka: EriktheOutgolfer
Galaretka , 11 bajtów
Wypróbuj online!
Wyjaśnienie
Oryginalny kod można wyjaśnić jako taki:
Więc weź „Witaj, świecie!” i zdobądź punkty kodowe, wyrównaj je, rzuć z powrotem do punktów kodowych, obróć w prawo 5 razy, a następnie wyrównaj i spłaszcz wynik.
źródło
Oktawa autorstwa Stewie Griffin
Nie jestem pewien, czy jest to właściwe rozwiązanie (w TIO drukuje
\00
postać), ale w mojejoctave-cli
powłoce wygląda to tak:Również w oryginalnym wyzwaniu napisano, że nie drukuj nic (lub znaku zerowego) , więc jeśli nic nie jest takie samo,
\00
to powinno być dobrze.Wypróbuj online!
źródło
0
a10
).Hello, World!
i przełamane.” jest dokładnym cytatem z wyzwania. I rzeczywiście czyni to odpowiedź banalną.Python 3 autorstwa rexroni
Zapobiegaj błędom, wychodząc wcześniej.
Wypróbuj online!
źródło
JavaScript (ES6) Autor: Ephellon Dantzler
{length:1, charCodeAt:()=>(e='Hello, World!', String.fromCharCode=()=>'')}
Wypróbuj online!
To było całkiem łatwe.
Zauważyłem, że żadne wejściowe ciągi znaków nie byłyby możliwe do wyprowadzenia,
Hello, World!
ponieważ całość wewnątrzString.fromCharCode
zwróci tylko wielokrotności 4 i!
ma kod char 33. Tak więc wyraźnie musimy po prostu zhakować cały program. Hakowanie wbudowanych skryptów w JavaScript jest banalne, jeśli nie próbuje się ich zatrzymać (a nawet jeśli tak się dzieje, zwykle jest wiele obejść ...).źródło
JavaScript (ES6), woal
Proste proxy, które zwraca poszukiwaną postać tylko co 3 razy, gdy zostanie wywołana.
Wypróbuj online!
źródło
Ruby, autor: Histocrat
Magiczny wkład to:
1767707618171221 30191World!
Wypróbuj online.
Wyjaśnienie:
1767707618171221
jest liczbą pierwszą, a zapisano ją w bazie 36"hello"
. Po pisaniu wielkimi literami tworzy to"Hello"
, które jest drukowane za pomocą$><<
$><<", #$'"if/30191/
szuka liczby30191
na wejściu i zapisuje, aby stdout ciąg złożony z przecinka, spacji i wszystkiego, co znajduje się na wejściu po30191
(za pomocą$POSTMATCH
, do którego odnosi się tutaj jego krótki wariant$'
).źródło
Lua 5.1 autor: tehtmi
Podaj to jako pierwszy argument:
Zakładając, że oryginalny kod znajduje się w pliku
tehtmi.lua
, uruchom (w bash lub podobnej powłoce):Działa również na Lua 5.3, z czego korzysta TIO, więc dlaczego nie wypróbować go online ? Nie testowałem na implementacji wykorzystującej rdzeń „PUC-Rio's Lua 5.1” (ponieważ tak naprawdę nie mogę znaleźć żadnych informacji), ale moje rozwiązanie prawdopodobnie tam również działa.
W jaki sposób?
Uruchamia pierwszy argument jako kod, ale tylko jeśli zawiera mniej niż 5 małych liter.
Sztuką jest ucieczka
print("Hello, World!")
. Innym sposobem, w jaki można to uruchomić, jest użycie_G["print"]("Hello, World!")
, które wykorzystuje tylko ciągi znaków.Ale nie możemy użyć łańcucha bezpośrednio ze względu na ograniczenie małych liter, jednak możesz uruchomić,
("").char
aby uzyskać funkcjęstring.char
, która może konwertować z serii bajtów na ciąg. Przypisałem ją do zmiennej wielkiej litery (abyśmy nie osiągnęli limitu), abyśmy mogli użyć jej do skonstruowania zarówno ciągów znaków, jakprint
iHello, World!
ciągów, których można używać jak wyżej.źródło
next
zamiast tego,char
który nie działa na Lua 5.3 z powodu losowości kolejności iteracji.JavaScript (ES6) firmy Voile
Dane wejściowe muszą być ciągiem zawierającym:
Spróbuj użyć tego:
Jeśli nie przejmujesz się końcowymi wymaganiami nowego wiersza dla danych wyjściowych, możesz zamiast tego zastąpić ostatnie 6 wierszy:
Jak to zrobiłem
Ograniczenia na wejściu są takie, że jest to ciąg znaków, każda linia ma dwa bajty długości lub mniej i że całkowita długość wynosi 80 bajtów lub mniej. Moja pierwsza próba po zrozumieniu, że poprawnie:
Uwaga:
\
s mają zignorować znaki nowej linii w ciągu wejściowym. Jest to niezwykle ważne dla odpowiedzi i nie mogę uwierzyć, że natknąłem się na nią przez przypadek. (Znałem to wcześniej, ale o tym zapomniałem)Ale to nie zadziałało, ponieważ
=>
musi być na tej samej linii co argumenty. Na szczęście wpadłem na pomysł, aby zawinąć coś podobnego w ciąg i umieścić eval w moich danych wejściowych, aby zredukować to do jednej linii, co daje moją ostateczną odpowiedź. Po wystąpieniu ewaluacji na wejściu generowany jest następujący ciąg znaków (który jest następnie ewaluowany do funkcji, a następnie uruchamiany):To było naprawdę trudne do złamania, ale w końcu mi się udało.
Również pierwszy crack w historii!
źródło
Cubically przez MD XF
Wyobrażam sobie, że to zawsze jest niebezpieczne, ale myślę, że mam crack, w oczekiwaniu na to, że mam rację, ponieważ w tłumaczu jest błąd (który właśnie skompilowałem).
Mój wkład
Wyjście jest
Hello, World!\n\n\n\n\n\n\n\n\n\n.....
z niekończącymi się nowymi liniami.Ale zauważyłem ostatnią sekcję kodu:
0x0A
w przerażający sposób ustawia notatnik (nowa linia), odczytuje dane wejściowe na twarzy 7 (strona wejściowa), a następnie drukuje kilkakrotnie twarz 6 (strona notatnika), aż 7 twarz wyniesie zero. Jeśli ustawisz twarz 7 na zero, powinieneś otrzymać tylko jedną nową linię. Jednak otrzymałem nieskończone nowe wiersze, a moje 13. wejście było zerowe i mogę zweryfikować, czy 7 twarzy jest zawsze zerowe, wstawiając w pętli „numer wydruku z 7 twarzy”:następnie drukuje niekończące się
\n0
pary.Patrzę na specyfikacje na sześciennej stronie github i to zachowanie wygląda okropnie jak błąd. Zmiana ostatniego znaku oryginalnego programu z a
7
na0
powoduje oczekiwane zachowanie. Interpreter TIO wykazuje to samo nieprawidłowe zachowanie.źródło
CJam , Erik the Outgolfer
Wypróbuj online!
W jaki sposób?
źródło
C # (.NET Core) , Grzegorz Puławski
Rozwiązanie, które znalazłem, w znacznym stopniu wykorzystuje znaki niedrukowalne, więc próba wklejenia go tutaj nie działała dobrze. Wartości bajtów dla danych wejściowych to:
Lub wersja ciągu jest dostępna w polu wejściowym łącza TIO.
Wypróbuj online!
Oryginalny program pobierałby różne znaki na wejściu, a następnie odwrócił dane wejściowe i pomnożył elementy dwóch list. W ten sposób utworzyłem ciąg 26 znaków, w którym pierwsze 13 znaków było odrębnych, wszystkie 13 ostatnich znaków pojawiło się również w pierwszych 13 znakach, a każda para indeksów
[i, 26-i]
pomnożona przez wartość bajtu i-tego znaku wHello, World!
.źródło
Ly , LyricLy
Wypróbuj tutaj (chociaż strona nie wyświetla nowej linii).
n
pobiera dane wejściowe, próbuje podzielić na spacje i rzutować na int, te zostają umieszczone na stosie.o
drukuje punkty porządkowe i8+
robi to, co można by pomyśleć. Zatem dane wejściowe muszą być o 8 mniejsze niż punkty kodowe w odwrotnej kolejności podzielone przez spacje.źródło
2
to zadziała - czy to tylko strona herokuapp go nie renderuje?C (gcc), autor: Felix Palmen
Oryginalny kod:
Argumenty:
Wypróbuj online!
Wyjaśnienie:
W(c)
oblicza adres ciągu znaków z listy argumentów do wydrukowania. Zaczyna się od adresu c-tego argumentu (O(c)
), który w tym przypadku jest 42-tym argumentem, a następnie odejmuje pierwszy znak drugiego argumentu (**O(2)
) jako przesunięcie liczby całkowitej, a następnie dodajex
, czyli liczbę argumentów.W(c)
używa drugiego argumentu, więc wiesz, że musi być co najmniej 3 z nich (0, 1, 2). Następnie „Witaj, świecie!” może przejść do pierwszego argumentu, a następnie, aby rozwiązać ten argument, potrzebujesz znaku, którego wartość ASCII mieści się w równaniu „42-x + 3 = 1”. Tak się składa, że jest „,”.źródło
JavaScript: ThePirateBay
Zastępuję metody
valueOf()
itoString()
przeanalizowanych obiektów, aby przymus nie powiódł się za pomocąTypeError
.źródło
6502 Montaż (C64) - Felix Palmen
Wyjaśnienie jest nieco związane.
Kod najpierw sprawdza przecinek (konieczność składni), a następnie odczytuje dwa argumenty, z których pierwszy jest WORD, przechowywany little-endian w pamięci 0014 i 0015, ten ostatni jest przechowywany w rejestrze X.
To całkiem sprytne, używając naszego wkładu do przepisania programu. W końcu przepisuje licznik pętli wyjściowej na końcu programu.
Nadchodzi przebiegłość:
na C64, d018 jest bardzo ważnym bajtem. Przechowuje punkty odniesienia dla rzeczy związanych z wyjściem ekranu. Zobacz tutaj, aby uzyskać więcej informacji. Jeśli otrzyma niepoprawną wartość, spowoduje awarię C64. Aby wydrukować wymagane mieszane wielkie i małe litery, musi to być 17 USD.
Teraz zaczynamy naszą pętlę wyjściową:
Ta stała została zapisana wcześniej. Wyraźnie określa, jak długo działa pętla. Zdarza się, że ma już prawidłową wartość, ale musimy ponownie wcisnąć 0e.
Reszta to tylko informacja, którą musimy wydrukować, zaczynając od adresu pamięci c025.
Więc po prostu podąża za matematyką.
źródło
$FF
to, ale potem postanowiłem to zostawić.6502 Kod maszynowy (C64) - Felix Palmen
Poprawna odpowiedź to
Kod jest raczej skomplikowany i wymaga wielu samodzielnych modyfikacji. Więc zamiast całkowicie go odwrócić, możesz go po prostu wykorzystać do złamania się.
Oto nieco bardziej pomocny demontaż kodu, aby pomóc zrozumieć, co się stało. Składnia dotyczy KickAssembler.
Oznaczenie go w ten sposób wystarczyło, aby zobaczyć, że kod XOR zawiera kilka stałych, które są ukryte, aby wydrukować to, czego potrzebujemy. Ponieważ XOR jest odwracalny, jeśli wprowadzisz pożądane wyjście, powie ci, co to jest klucz.
Więc zmieniłem ostatnią linię
więc wypisze ostatnie wymagane dane wejściowe zamiast awarii na złym wejściu.
I to jest to!
Jeśli jest jakieś zainteresowanie, będę więcej łamać kod.
źródło
vice
. Ale cokolwiek, to właściwe rozwiązanie.drops A in mystery+1, over the constant
” <- tak naprawdę jestmystery+4
z twoją wytwórnią. Offsety są w bajtach :) i FWIW, auto-modyfikacja jest dość powszechna nawet w poważnym kodzie 6502, o ile kod działa z RAM.Eksploduj , Step Hen
Wypróbuj online!
źródło
C (tcc) autorstwa Joshua
Wypróbuj online!
źródło
MATL autorstwa Luisa Mendo
Wypróbuj online!
źródło
Galaretka Jonathana Allana
Oryginalny kod:
Wypróbuj online!
Wejście:
Wyjaśnienie:
źródło
C (GCC na TIO) przez MD XF
Wypróbuj online!
W jaki sposób?
Próbuje wydrukować drugi argument jako ciąg znaków, który jest wskaźnikiem, który możemy określić na wejściu. Zdarza się tak, że w pamięci lokalizacji
4195875
zaczyna się"Hello, World!\n"
ciąg.Liczba została określona przez dodanie
print("%p", "Hello, World!");
przedprintf
, konwersję liczby szesnastkowej na dziesiętną i wypróbowanie jej na oryginalnym TIO. Jednak pokazał miprintf
ciąg formatu. Sprawdzając niektóre liczby, dowiedziałem się, że ciąg znajduje się przed ciągiem formatu.Tak więc w pamięci wyglądałoby to tak (jako ciąg C):
Oznacza to również, że każda aktualizacja kompilatora może uszkodzić rozwiązanie.
źródło
JavaScript (Node.js) Przez Voile
['Hello, World!','','','','','','','','','','','','']
Wypróbuj online!
źródło
Röda autorstwa fergusq
Wypróbuj online!
Wyjaśnienie za chwilę ...
źródło
JavaScript (ES6), woal
Wypróbuj online!
źródło
PHP przez LP154
Wypróbuj online!
(TIO nie ma zdefiniowanej klasy PDO, więc powyższa wersja demonstracyjna używa takiego kodu)
Inne rozwiązanie:
Wypróbuj online!
źródło
JavaScript (ES6), woal
Biorąc pod uwagę limit 81 znaków, prawdopodobnie nie jest to zamierzone rozwiązanie
Wypróbuj online!
źródło