Na potrzeby tego wyzwania zdefiniujemy białe znaki jako tylko linie (0x0A) i spacje (0x20). Zauważ, że większość języków i smaków wyrażeń regularnych uważa również wiele innych znaków za spacje, zarówno wewnątrz, jak i poza zakresem ASCII, więc możesz nie być w stanie skorzystać z odpowiednich wbudowanych funkcji.
Wyzwanie gliniarzy
Powinieneś napisać program lub funkcję w wybranym przez siebie języku, który pobiera ciąg znaków składający się ze znaków ASCII (oprócz NUL) jako dane wejściowe i wyjściowe, po usunięciu wszystkich białych znaków. Na przykład, jeśli otrzymałeś następujące dane wejściowe:
H e l l o,
W o r l d!
Powinieneś wyjść
Hello,World!
Twoje zgłoszenie będzie wtedy kodem źródłowym z usuniętymi białymi spacjami (ten sam proces, jak przekazanie rozwiązania jako danych wejściowych do siebie, chociaż twoje rozwiązanie może również zawierać znaki spoza zakresu ASCII). Twoim celem jest jak najtrudniejsze ustalenie, gdzie należy wstawić białe znaki, aby odzyskać prawidłowe rozwiązanie w wybranym języku. Pamiętaj, że złodzieje mogą wstawić mniej białych znaków niż usunięto, ale nie więcej. Pamiętaj też, że złodzieje nie muszą dokładnie pasować do twojego kodu, muszą tylko znaleźć prawidłowe rozwiązanie.
Twoja odpowiedź powinna zawierać następujące informacje:
- Język (i wersja, jeśli to konieczne), w którym napisałeś swoje rozwiązanie.
- Liczba bajtów Twojego rozwiązania przed usunięciem białych znaków.
- Twoje rozwiązanie z białymi spacjami zostało usunięte.
Rozwiązaniem może być program lub funkcja, ale nie fragment kodu i nie można zakładać środowiska REPL. Można przyjmować dane wejściowe za pośrednictwem STDIN, argument wiersza polecenia lub argument funkcji i dane wyjściowe za pośrednictwem STDOUT, wartości zwracanej funkcji lub parametru funkcji (wyjściowej).
W trosce o sprawiedliwość musi istnieć darmowy tłumacz lub kompilator dla wybranego przez ciebie języka.
Nie wolno używać wbudowanych funkcji do mieszania, szyfrowania lub generowania liczb losowych (nawet jeśli generator liczb losowych zostanie ustawiony na stałą wartość). Twoje rozwiązanie musi być w stanie przetworzyć dowolny ciąg 100 znaków lub mniej w ciągu 10 sekund na rozsądnej maszynie stacjonarnej.
Jeśli twoja odpowiedź nie zostanie złamana w ciągu 7 dni (168 godzin), możesz ujawnić własne rozwiązanie, w którym to momencie odpowiedź zostanie uznana za bezpieczną . Dopóki nie ujawnisz swojego rozwiązania, może ono zostać złamane przez rabusiów, nawet jeśli minęło już 7 dni. Wygrywa najkrótsza bezpieczna odpowiedź (mierzona przed usunięciem białych znaków).
Jeśli twoja odpowiedź się popsuła, zaznacz to w nagłówku odpowiedzi wraz z linkiem do odpowiedzi odpowiedniego rabusia.
Idź tutaj po część rabusiów.
Nieprzetworzone zgłoszenia
<script>site = 'meta.codegolf'; postID = 5686; isAnswer = false; QUESTION_ID = 103182;</script><script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>jQuery(function(){var u='https://api.stackexchange.com/2.2/';if(isAnswer)u+='answers/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJeRCD';else u+='questions/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJO6t)';jQuery.get(u,function(b){function d(s){return jQuery('<textarea>').html(s).text()};function r(l){return new RegExp('<pre class="snippet-code-'+l+'\\b[^>]*><code>([\\s\\S]*?)</code></pre>')};b=b.items[0].body;var j=r('js').exec(b),c=r('css').exec(b),h=r('html').exec(b);if(c!==null)jQuery('head').append(jQuery('<style>').text(d(c[1])));if (h!==null)jQuery('body').append(d(h[1]));if(j!==null)jQuery('body').append(jQuery('<script>').text(d(j[1])))})})</script>
źródło
Odpowiedzi:
Haskell, 100 bajtów, złamany przez nich
To pełny program i dadaistyczny wiersz.
Kod z withspace (Wypróbuj online!)
Wciąż wyglądam dość poetycko, jeśli mnie zapytasz.
Nie zaciemniono
Wyjaśnienie
do
-Notation jest tylko cukier syntaktyczny, więcf
równoważnie można zapisać jakoDla list
>>=
-operator jest zdefiniowany jakoconcatMap
, więcf
staje sięTak więc biorąc pod uwagę dane wejściowe
"a b\nc"
,lines
dzieli dane wejściowe na znaki nowej linii["a b","c"]
,words
dzieli każdą linię na białych znakach, dając[["a","b"],["c"]]
(jak sobie uświadomiłem, że teraz obejmuje to znaki nowej linii, więc taklines
naprawdę nie jest potrzebne). Konkatenacja raz daje["a","b","c"]
,id
jest funkcją tożsamości i jako taka nie ma żadnego efektu, a końcowa konkatenacja daje łańcuch"abc"
.źródło
C, 475 bajtów, pęknięty przez Riley
Niektóre części C sprawiają, że naprawdę bardzo łatwo jest zobaczyć, gdzie powinny się znajdować białe znaki. Jednak preprocesor c tego nie robi. Tak więc ten kod składa się z dwóch części: do linii 17 (236 znaków z białymi spacjami) kod jest praktycznie nieudostępniony, a potem (239 znaków z białymi spacjami), powodzenia!
Nie wygram tych zawodów długim strzałem, ale chciałem zobaczyć, co można zrobić z preprocesorem c.
Kompiluje (z ostrzeżeniami, jeśli je włączysz) zi
gcc -std=c89 -ansi
działa podobniecat file | ./a.out
To pękło znacznie szybciej, niż myślałem, gratulacje! Moja strategia polegała na
#defines
usunięciu oczywistych granic tokenów (takich jak „;”), a następnie na użyciu większej liczby,#defines
aby NAPRAWDĘ nieintuicyjny był sposób ich tasowania.Tak przy okazji, tak wygląda kod po dodaniu tylko oczywistych białych znaków:
źródło
Oktawa, 69 bajtów, BEZPIECZNIE!
Format wejściowy: nowych linii nie można wprowadzać bezpośrednio w wierszu polecenia. Utwórz ciąg przez konkatenację w następujący sposób:
Wywołaj funkcję w ten sposób (dodaj białe znaki):
Oryginalny kod:
Aby to zadziałało, potrzebujesz tylko 66 bajtów, ale napisałem 69 w nagłówku, aby nie podawać zbyt wielu informacji.
Oryginalny kod wygląda następująco:
Wyjaśnienie:
U
jest punktem kodowym85
w tabeli ASCII, więc wygląda na to, że po nim powinna być pierwsza spacja85
. Źle!Jeśli
853
zamiast tego wstawimy spację , powinniśmy uzyskać numer znaku853
, prawda ..? Używając,char
aby sprawdzić, czy jest to rozpoznawalna postać:Jednak nie używamy
char
w kodzie, używamy krótszej wersji, w której łączymy liczby z pustym ciągiem[853 '']
. Zamiast dawać błąd spoza zakresu, krótsza wersja po prostu przyjmuje moduł liczbowy 256.Tak się po prostu stało
85+3*256 = 853
. Gdychar(853)
daje ostrzeżenie,[853,'']
wracaU
.Oczywistym sposobem wykonania tego zadania w Octave jest:
Wiemy, że po pierwszym muszą być nawiasy otwierające (punkt kodu 40)
U
.29
oczywiście nie pasuje, więc przesuwamy przestrzeń jeszcze bardziej w prawo i dostajemy296
.mod(296,256) = 40
. Bingo!Kontynuuj w ten sposób i zakończ sekwencją:
Na koniec używamy
eval
do przekształcenia łańcucha w kod.źródło
U
wśród tych liczb :-)JavaScript ES6, 199 bajtów, złamany przez SLuck49
Dość obszerny wpis z 33 bajtami białych znaków do dodania.
źródło
[ 10, 0, 0, 0, 0, 9, 8, 1, 5, 0, 0 ]
sekwencji przerw i moja funkcja iteracji dla tablicy to(a)=>{for(var x=0;!a[x];x++);if(a.length-x>1){a[0]=a[x]-1;a[x]=(x==0?a[x]:0);a[x+1]++;}else{a[0]=a[x]+1;a[x]=0;i=0}}
. Zacząłem o[ 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]
.> <>, 40 bajtów, Cracked by Teal pelikan
Nawiasem mówiąc, korzystałem z fishlanguage.com , na wypadek, gdyby były różnice między tłumaczami.
źródło
Befunge-93, 58 bajtów, Bezpiecznie!
Wypróbuj online!
Oryginalny program
Wypróbuj online!
Sztuczka polegała na tym, że ścieżka wykonania była bardziej pionowa niż pozioma, a następnie w kodzie losowo wstawiano różne spacje, aby dalej tasować ścieżki pionowe. Kiedy linie zostały przerwane i białe znaki zostały w końcu usunięte, mamy nadzieję, że bardzo niewiele wskazywało na to, w jaki sposób operacje były ze sobą powiązane.
W przypadku, gdy nie było to wystarczająco trudne, wrzuciłem trochę przeplatania, więc wiele operacji zakończyło się różnymi ścieżkami kodu przepływającymi prostopadle do siebie. Chodzi o to, że jeśli uważasz, że znalazłeś właściwą pozycję dla konkretnego polecenia, nie zdajesz sobie sprawy, że będziesz musiał użyć go ponownie w kodzie później.
Nie jestem pewien, czy warto było tyle wysiłku, aby skomplikować sprawę, czy ludzie nawet nie zadali sobie trudu, aby to rozwiązać. :)
Objaśnienie kodu
źródło
C # 6, 201 bajtów, Cracked by Link Ng
184 bajty zwinięte, pozostawiając 17 bajtów białych znaków.
Rozwiązanie pęknięte przy użyciu, podczas
Concat
gdy moje zamierzone rozwiązanie wykorzystałoJoin
, oto zamierzone rozwiązanie:źródło
MATL , 22 bajty. Popękane i popękane .
Jest to program, który pobiera dane wejściowe przez STDIN i generuje dane wyjściowe przez STDOUT.
Kod bez spacji i znaków nowej linii:
Format wejściowy jest trochę niewygodne, ponieważ, jak Mátl zajmuje wejście ciąg. Ciągi znaków nowej linii nie mogą być wprowadzane bezpośrednio przez STDIN, ponieważ każde wejście musi być pojedynczą linią (nowa linia oznacza koniec wprowadzania). Format jest więc następujący:
Ciąg jest ujęty w pojedyncze cudzysłowy . Jeśli treść ciągu zawiera pojedyncze cudzysłowy, są one zastępowane przez duplikowanie . Przykład:
'I''m a string'
Aby wprowadzić ciąg z znakami nowej linii, należy go podzielić na znaki nowego wiersza i połączyć wszystko (za pomocą nawiasów kwadratowych), w tym liczby jako kody ASCII . Rozważmy na przykład ciąg utworzony przez moje imię i nazwisko z nową linią pośrodku. Zostałby wpisany jako
['Luis' 10 'Mendo']
.Umożliwia to wprowadzanie dowolnych innych (prawdopodobnie niemożliwych do wydrukowania) kodów ASCII. Zatem ciąg w punkcie 1 powyżej można alternatywnie wprowadzić jako
['I' 39 'm ' 97 32 'string']
. Sprawdź tutaj .Jedynym warunkiem jest to, że co najmniej jedna z części w nawiasach jest łańcuchem. Wymusza to interpretację dowolnych liczb jako kodów ASCII podczas łączenia.
Przepraszamy za niezręcznePowodzenia przy użyciu tego formatu!Oryginalne rozwiązanie
Każdy z nich
%
jest symbolem komentarza, więc reszta linii jest ignorowana.Przestrzenie nic nie robią, ale służą jako separatory. Na przykład
1e5
bez spacji będzie interpretowany jako liczba100000
.t
pobiera dane wejściowe i kopiuje je.' @ *'
wypycha ten ciąg id
oblicza kolejne różnice, co daje[32 -32 10]
(-32
jest bezużyteczne).m
daje logiczną tablicę wierszy wskazującą, które znaki są32
lub10
(lub-32
).1
a następniee
przekształca się w wiersz. Tutaj nie ma mowy.5
następnie ponownieM
wypycha1
(ostatnie wejście do najnowszej funkcji wielokrotnego wprowadzania, czylie
).d
oblicza kolejne różnice1
, a więc daje[]
(pusta tablica).w
zamienia, a na koniec(
przypisuje[]
znaki do białych znaków, tzn. usuwa je.źródło
RProgN , 15 Bajtów popękanych !
Możesz bawić się kodem tutaj . Stosunkowo proste rozwiązanie, miejmy nadzieję, że irytujący sposób, w jaki RProgN obsługuje ciągi znaków, sprawi, że nie będzie on używany.
Oryginalny program
Wyjaśnienie
Po pierwsze, dane wejściowe są domyślnie wypychane na stos. Stos:
<INPUT>
Następnie używamy „”, aby przesunąć spację na stos. Stos:
<INPUT> " "
`faktycznie próbuje wypchnąć ciąg reprezentowany przez` (WORD), ale ponieważ po nim jest spacja, po prostu wypycha pusty ciąg. Stos:
<INPUT> " " ""
R oznacza cukier dla polecenia Zamień. Stos:
<INPUTWITHOUTSPACES>
Następnie „NEWLINE” wypycha ciąg zawierający znak nowej linii, co jest miłe, ponieważ RProgN nie używa znaków ucieczki, po prostu prosto w górę pozwala popchnąć taki ciąg. Stos
<INPUTWOSPACES> "\n"
Następnie ponownie używamy „trick” i Replace, co daje nam wynik.
źródło
Rubin, 86 bajtów + 1 flaga = 87 ( pęknięty przez Dom Hastings )
Wymaga flagi wiersza polecenia
-p
.Kod jest w rzeczywistości prawidłowy w tej formie, to po prostu brak możliwości.
źródło
Belka , 72 bajty, Bezpiecznie!
Teraz dla języka 2D. Można grać w TIO Nexus .
Dość prosty program, w którym nie ma wiele, aby oszukać ludzi.
źródło
Labirynt , 127 bajtów
Mam nadzieję, że zrobiłem to dobrze :) to mój pierwszy wpis na gliny i złodziei.
Kod oryginalny
źródło
Java, 3241 + 28 bajtów dla dużego importu Integer
Ten wpis ma jedynie na celu udowodnienie możliwości czysto kryptograficznie bezpiecznego wpisu. Wierzę, że jest to zgodne z zasadami, ale jeśli jest to sprzeczne z duchem, daj mi znać, a usunę się z uczciwości. Pozostawię to „niebezpieczne” na czas nieokreślony do czasu, gdy (i jeśli) pęknięcie zostanie znalezione. Jest to potworność i na pewno można ją dalej optymalizować, ale oto ona.
Dla uczciwości wobec rabusiów, oto wszystko z dodaną „oczywistą” białą spacją.
Powodzenia, chciałbym zobaczyć to pęknięte. W rzeczywistości ustanowię nawet nieograniczoną nagrodę za to. Jeśli w którymś momencie to zrobisz, otrzymasz 500 powtórzeń nieskończonego wyróżnienia za wymianę stosu (a także prawdopodobnie wspaniały matematyczny papier).
źródło
C, 140 bajtów, pęknięty przez Riley
Zacznijmy od łatwego.
(Mam nadzieję, że robię to dobrze.)
źródło
Befunge 98, 65 bajtów, złamany przez Pietu1998
Oryginalny program
źródło
V , 37 bajtów Pęknięty przez nmjcman101
Ponieważ jest to niedrukowalne, oto jego czytelna wersja:
Lub jeśli wolisz, zrzut heksowy:
źródło
Minkolang v0.15 , 88 bajtów, pęknięty!
Wypróbuj online!
źródło
JavaScript ES6, 380 bajtów, bezpieczny
Jest to wpis, który początkowo planowałem wydać. Jest ogromny i prawie nie ma szans na wygraną, ale myślę, że powinien być wystarczająco kryptograficznie wytrzymały, aby wytrzymać 7 dni. Teraz może się okazać, że się mylę!
67 bajtów białych znaków do dodania.
Rozwiązanie
Jest to implementacja rozszerzonego algorytmu szyfrowania Tiny . 64-bitowy klucz kodowany spacjami jest interpretowany do następującego 128-bitowego klucza:
Źródło: Wikipedia
Po odszyfrowaniu i przekonwertowaniu na ASCII, 64-bitowy blok
[x, y]
odczytuje jakoc3BsaXQ=
, co stanowi zakodowaną reprezentację Base64split
.Pokaż fragment kodu
źródło
Vitsy , 73 bajty, bezpieczny
To jest po prostu zło.
Powodzenia! 13 elementów białych znaków do dodania.
Oryginalny kod:
Wypróbuj online!
To z grubsza upraszcza do:
źródło
C #, 159 bajtów, Pęknięty przez mleko
153 upadło, więc znalezienie tylko 6 bajtów białych znaków nie powinno być zbyt trudne ...
źródło
siatkowy, 43 bajty, pęknięty
Wersja na TIO jest nieaktualna, ale możesz zdobyć kopię z github .
źródło
Wolfram, 132
Prawdopodobnie ma więcej niż jedno rozwiązanie (wskazówka: Mersenne)
Rozwiązanie
źródło
Biała spacja ,
8174 bajtówWersja czytelna dla człowieka:
Wiem, że to stare wyzwanie, ale mam nadzieję, że ktoś zechce się tym zająć. Próbowałem zoptymalizować pod kątem liczby bajtów, ale może być możliwe utworzenie czegoś krótszego z taką samą liczbą znaków tabulacji.
źródło
tcc, 850 bajtów
Aby uniknąć wklejenia bardzo długiej linii, przeszedłem przez tr -d '\ n' | fold -b -w 60.
źródło
SILOS , 159 bajtów Bezpiecznie!
Powinny być dość trywialne. To mój pierwszy wpis na gliniarzy i złodziei.
Nikt go nie zaatakował, prawdopodobnie z powodu ezoterycznej natury mojego własnego języka. Wydaje się, że jest to obskurny sposób na przemijanie, ale tak naprawdę nie ma to znaczenia, ponieważ krótsze są bezpieczne.
Krępuj się próbować go online
źródło