Twój cel : napisanie kodu, który da klasyczny wynik „Cześć, świecie!” drukowane do STDOUT lub równoważnego.
Reguły : Kod musi być w całości drukowany ASCII. Cały kod musi być funkcjonalny - usunięcie dowolnego pojedynczego znaku zliczającego musi zmienić wynik lub spowodować, że kod nie będzie działał. Wszystkie zmienne muszą być użyte po przypisaniu. Literały znakowe i łańcuchowe muszą być niezbędne do uzyskania danych wyjściowych - to znaczy zastąpienie dowolnego literału znakowego lub dowolnego znaku w łańcuchu literowym innym znakiem musi być zdolne do zmiany wyniku (a nie poprzez efekt sekwencji ucieczki - zastąpienie znaku odwrotnym ukośnikiem lub odpowiednik)
(UWAGA: Ostateczna reguła została edytowana w)
Punktacja : Tutaj robi się ciekawie. Najwyższy wynik wygrywa według liczby znaków, zgodnie z typowymi regułami kręgli kodowych. Jednak wielokrotne użycie znaków spowoduje odjęcie punktów. Konkretnie...
- Wielokrotne użycie dowolnego znaku alfanumerycznego (az, AZ, 0-9) spowoduje odjęcie 3 punktów za powtórzenie (pierwsze użycie nie spowoduje odliczenia).
- Powtarzające się stosowanie podstawowej interpunkcji ([!? .-, ": ';]) - łącznie z nawiasami - spowoduje odjęcie 2 punktów za powtórzenie.
- Wielokrotne użycie innych znaków ASCII {`~ @ # $% ^ & * _ + = | \ /> <} - łącznie z nawiasami klamrowymi - spowoduje odjęcie 4 punktów za powtórzenie.
- Wielokrotne użycie spacji, tabulatorów i znaków nowej linii spowoduje odjęcie 1 punktu za powtórzenie. Oznacza to, że tylko pierwsze użycie spacji, tabulacji lub nowego wiersza będzie się liczyło do sumy całkowitej.
Uwaga: komentarze nie liczą się do sumy, chociaż znaki oznaczające początek / koniec komentarza. Na przykład w C / C ++, jeśli masz /* This is a comment */
, to policzy dwa ukośniki i dwie gwiazdki, ale nic między nimi.
Kilka przykładów (uwaga: użycie Julii jako przykładowego języka) ...
print("Hello, world!");
Wszystkich widocznych znaków: 22
Zawiera spację: +1
Powtarzane
znaki alfanumeryczne: -12 dla ll Powtarzana interpunkcja: -2 dla „
Wynik końcowy: 22 + 1-12-2 = 9
print("Hel",char(108),"o, wor",0x108,"d!"); # 0x108 makes a Uint8 that prints as ASCII
Wszystkie znaki: 43 (nie liczy żadnych znaków po #, który jest znakiem komentarza)
Zawiera spację: +1
Powtarzane znaki
alfanumeryczne: -18 dla rr1008
Powtarzane znaki interpunkcyjne: -24 dla () „” „” „,,,,
Końcowy wynik: 43 + 1-24-18 = 2
xy=STDOUT
m="Hello, world!"
print(xy,m);
Wszystkich widocznych znaków: 37
Zawiera
nowy wiersz : +1
Zawiera spację: +1
Powtarzane
znaki alfanumeryczne: -18 dla ksyllor Powtarzane znaki interpunkcyjne: -4 dla „,
Powtarzane inne ASCII: -4 dla =
Wynik końcowy: 37 + 1 + 1-18-4 -4 = 13
Kilka nieprawidłowych fragmentów kodu ...
x=2;print("Hello,world!")
Problem: x
jest przypisany, ale nieużywany.
print("Hello,"*" world!")
Problem: *
jest niepotrzebny, bez niego wynik będzie taki sam.
k=1
if k>0
print("Hello, world!")
else
print("abcghjmquvxyzABCDEFGIJKLMNOPQRSTUVWXYZ_+*-&|")
end
Problem: Drugie print
polecenie nie zostanie uruchomione. Również usunięcie znaków w cudzysłowie w drugim print
poleceniu nie zmieni wyniku.
x="Hello, world!";
print(x)
Problem: usunięcie znaku nowej linii nie zmieni wyniku ani nie spowoduje błędu (w Julii średnik jest konieczny tylko wtedy, gdy wiele poleceń znajduje się w tym samym wierszu, w przeciwnym razie po prostu pomija wartość zwracaną).
print("Hellos\b, world!")
Problem: s
postać nie wpływa na wynik, ponieważ zostaje skasowana \b
. Jest to dopuszczalne, jeśli jest wykonane za pomocą code ( "Hello",char(100),"\b, world!"
), ale nie można tego zrobić za pomocą literałów łańcuchowych lub literowych.
Wygodny kalkulator wyników - http://jsfiddle.net/4t7qG/2/ - dzięki Doorknob
Odpowiedzi:
Perl - 96
(Całkiem dobrze, biorąc pod uwagę teoretyczny wynik maksymalnie 97)
(Zauważ, że drugi wiersz zaczyna się od rzeczywistego
\t
znaku tabulacji)Kod składa się z 98 znaków i zawiera każdy znak ascii dokładnie raz, plus dodatkowo
-
.98 - 2 = 96
Nie ma tu literałów łańcuchowych , ale usunięcie dowolnego pojedynczego znaku psuje program.
Odbarwienie
W tym programie są 3 instrukcje (właściwie 2, ale wykorzystałem
+
jako separator instrukcji)s{}[Hel0o, w3$=d!]
To bardzo rozciągnięty przypadek operatora sed. Jest to częściej pisane jako
s/a/b/
, lubs:a:b:
, ale Perl pozwala tutaj na więcej fantazji:s(a)(b)
s(a)^b^
s(a)[b]
a nawets qaqbq
.Zastępuje pusty ciąg (wewnątrz
{}
) przezHel0o w360d!
(wewnątrz[]
) ($=
interpoluje60
domyślnie). Z powodu braku~=
operatora działa$_
.y<"#%&'*.124578:?@BCDEFGIJKLMNOQ/-9>(\n\t6PRSTUVWXYZ^_`abfghjmqvxz|~\cAk-u)
Jest to również bardzo rozciągnięty przypadek, ale
tr
operatora, który jest również nazywanyy
(y< >( )
).Spójrzmy na tabelę wymiany:
" # %&'*.124578:?@BCDEFGIJKLMNOQ /-9
\n\t6PRSTUVWXYZ^_`abfghjmqvxz|~\cA k-u
przesunąłem kilka znaków, aby istniejący ciąg nie został zerwany. Jedyną działającą częścią tutaj jest
/-9
->k-u
. Zastępuje on0
zl
,3
zo
, i6
zr
.Ponownie z powodu braku
~=
operatora, działa on$_
Więc teraz mamy pełną frazę w
$_
zmiennej.print
Brak argumentów powoduje, że wypisuje tylko
$_
zmienną.źródło
/-9
ik-u
są faktycznie używane do transformacji łańcucha. Reszta to śmieci równej wielkości . Jeśli usuniesz tylko jeden znak, zestawy nie będą wyrównane, a program nie wyświetli komunikatu „Cześć, świecie!” już.<...> removal of any single counting character must change the result or cause the code to not function.
Usunięcie 1 znaku gdziekolwiek go psuje. Możesz sprawić, by działało, usuwając 2 znaki, ale nie jest to zgodne z regułami.All code must be functional
. Przynajmniej wyraźnie naginasz zasady. Nie mówię wprost, że „łamie zasady”, ale jest to zdecydowanie wątpliwe.Ta odpowiedź została utworzona przed dodaniem reguły dotyczącej literałów łańcuchowych i nie bierze udziału w konkursie.
To całkowicie legalne. : P Jeśli usuniesz dowolny znak z tego ciągu, zostanie wydrukowany
ello, world!
.źródło
<<
muszą zostać usunięte.if 'x'>'w'
technikom, ale blokuje „k \ bH” na przykład na „H”. Możesz dodać drugą odpowiedź po dodanym ograniczeniu.CJam, 94
Wypróbuj online! Zauważ, że tuż przed wysuwem linii powinien znajdować się tabulator. SE nie lubi tabulatorów, więc musisz wstawić go ręcznie.
Łączny wynik: 94
Użyłem następującego kodu, aby sprawdzić, czy żadnego ze znaków w ciągu nie można usunąć:
Wyświetla tablicę pokazującą liczbę razy Witaj, świecie! zostanie wydrukowany, jeśli znak odpowiadający indeksowi zostanie usunięty.
źródło
254b
). Moduł wyniku końcowego 7 powinien wynosić 1, więc poprzedni blok kodu jest wykonywany raz. Potrzebuję modułu, aby każda postać była niezbędna.Z
ZT
, lub prawdopodobnie kilka innych znaków nie zmienia wynik.Ruby,
2841Po prostu zacznij od odpowiedzi z rozwiązaniem w duchu pytania:
Punktacja (myślę, że mam rację):
orli
)"'
)źródło
.
W3.1
można usunąć bez problemu. Jak Czyx
w0x4
lub-
w8-5
.PHP, 1 (tak, jeden punkt!)
Użycie magicznych znaków do wygenerowania sumy kontrolnej, która w formie binarnej pasuje do „Piekła”, „o, w”, „orld” i „!”.
Zwykle lubię znajdować luki, ale tym razem postanowiłem grać zgodnie z duchem i intencją konkursu. Każda postać i jej pozycja ma zasadnicze znaczenie dla wyniku. Jedynymi miejscami, które można zastąpić, są nazwy zmiennych, które nie są wartościami dosłownymi, białe znaki między nimi
php
iforeach
które sąPHP
traktowane jako równoważne oraz użycie'
vs,"
którePHP
traktuje jako podobne.Do Twojej wiadomości, oto kilka innych magicznych ciągów i skrótów zainteresowania:
źródło
\t
,\n
lub przestrzeń. Nie jest ekspertem od PHP, ale;
wydaje się również opcjonalny.Befunge-98 , 97 punktów!
Wypróbuj online!
Karta znajduje się między
q
an
.Używa podobnej sztuczki do poprzedniej odpowiedzi Befunge, aby uzupełnić wiersze pozostałymi znakami, ale unika używania zduplikowanych znaków w sekcji wykonawczej. Usunięcie któregoś z niewykonywalnych znaków powoduje, że wykonywane części są nie na miejscu, zwykle kończą się nieskończonymi pętlami lub drukują niewłaściwe dane wyjściowe.
Jak to działa
Naprawdę jedyna wykonująca część wygląda następująco:
Najpierw używa literału owijającego, aby dodać
, world!
do stosu. Pozwala to uniknąć dwóch"
sekund.Zwiększa
Hello
to stos przy użyciu różnych metod, aby uniknąć powielania znaków.$
wyskakuje nadmiar miejsca spowodowany literałem owijającego łańcucha.7+
dodaje 7 doh
końca literału ciągu, aby utworzyćo
.ba*46\%:
oblicza 111, wartość asciil
i powiela ją.'e
dodaje e do stosu.f1g
otrzymuje postać o wartości 1,15, która jestH
Następnie ponownie wykorzystuje
,
ciąg w celu wydrukowania całościHello, world!
. Reszta to tylko zmiany kierunku, aby przejść do zakończenia@
.źródło
Ruby, 78
Więcej nadużyć, jak sądzę, nie jestem pewien, jaka dokładnie będzie łatka. Pobiera długi ciąg znaków i sprawdza sumę wyniku, więc każde usunięcie lub zmiana spowoduje awarię programu. Prawdopodobnie można go trochę zoptymalizować, aby usunąć powielanie niektórych liter i uzyskać tam białe znaki.
źródło
if
można usunąć.if
faktycznie działa, a rzeczy po nim nadal są zgodne z regułami.puts('Hello, world!')
by zadziałało. Myślę, że zasady wymagają wyjaśnienia, czy jest to zgodne z prawem.PHP, 2257
Luka: ukośnik został pominięty w specyfikacjach i kalkulatorze wyników!
Ten kod zlicza liczbę wystąpień odwrotnych ukośników w każdym ciągu i wypisuje odpowiednik ASCII. Zastąpienie odwrotnego ukośnika innym znakiem lub usunięcie odwrotnego ukośnika powoduje błąd analizy lub zmienia wynik.
Ciekawą cechą odwrotnych ukośników
PHP
jest to, że trzeba ich unikać, aby automatycznie podwoić wynik! Możesz podwoić, potroić itp. Wynik, mnożąc liczbę ukośników odwrotnych, ale nie chciałem być chciwy i myślę, że może przekroczyć granice tego, co możesz wprowadzić.źródło
Befunge - 87
Pierwsza linia jest warta cztery punkty ze względu na całe powtórzenie, ale w drugiej linii nie ma zduplikowanych znaków. Jedynym dosłownym ciągiem znaków w tym kodzie jest
dlrow ,olleH
odwrócenie i wydrukowanie jako wynik. Usunięcie dowolnego znaku spowoduje rozłączeniev
końca pierwszego wiersza od@
końca drugiego, powodując, że program nigdy się nie zakończy. Jeśli…v
sam zostanie usunięty, kod przejdzie do nieskończonej pętli drukującej prawidłowe dane wyjściowe.źródło
Aceto , 3
W końcu udało się uzyskać pozytywny wynik!
Wypróbuj online!
źródło
∑
nie drukuje ASCIIAcc !!, -138 (i tak, to jest negatywne 138)
Chociaż może to nie być najlepszy wynik, jaki kiedykolwiek uzyskałem w PPCG, wątpię, czy może być wyższy niż ten w Acc !!
Wypróbuj online!
źródło