Twoja firma niedawno zatrudniła nową grupę niezwykle oddanych administratorów. Uważają, że samo oglądanie ekranów komputera jest dość ograniczające (to znaczy, częstotliwość odświeżania 60 Hz po prostu NIE wystarcza), więc podłączyli szynę danych procesora do przetwornika DAC i odtwarzali to na głośniku przez serwerownię, aby mogli usłyszeć do 20 kHz. Jeden problem: to sysadmini, a nie inżynierowie elektrycy, a ich konfiguracja głośników ciągle się psuje. Uznali, że jest to spowodowane zbyt gwałtownymi zmianami wartości bajtów w kodzie, które inżynierowie oprogramowania kompilują na komputerze mainframe. Administratorzy sysadminów organizują teraz małą konkurencję, aby dowiedzieć się, kto może zrobić kod, który jest najbardziej łagodny dla ich konfiguracji głośników.
Wyzwanie
Twoim zadaniem jest stworzenie programu lub funkcji w wybranym języku, który ma możliwie najmniejszą różnicę między kolejnymi bajtami (patrz sekcja Obliczanie). Ten program będzie musiał obliczyć swój wynik.
Wkład
Ciąg ASCII stdin
lub najbliższy odpowiednik twojego języka, lub jako dane wejściowe funkcji, jeśli tworzysz funkcję. Ponieważ twój program będzie musiał wziąć się za dane wejściowe, aby obliczyć twój wynik, twój program powinien obsługiwać Unicode, jeśli zawiera on Unicode. W przeciwnym razie ASCII jest wystarczający. Można założyć, że dane wejściowe mają co najmniej 2 bajty.
Obliczenie
Każdy znak ciągu zostanie przekonwertowany na jego numeryczny odpowiednik, przy użyciu standardu ASCII. Następnie różnica między wszystkimi postaciami zostanie najpierw podniesiona do kwadratu, a następnie zsumowana . Na przykład ciąg abd
otrzyma wynik 1²+2²=5
.
Wydajność
Dane wyjściowe będą stanowić tytuł wpisu. Oznacza to, że powinien być poprzedzony przez a #
lub dołączony przez nowy wiersz i -
(myślnik). Następnie powinna wypisać nazwę języka programowania, po której następuje przecinek, spacja, a następnie liczba całkowita reprezentująca wynik obliczeń. Na przykład
#C++, 98
byłoby prawidłowe wyjście. Dane wyjściowe powinny być podane w stdout
najbliższym odpowiedniku języka lub jako wartość zwracana do funkcji.
Punktacja
Twój wynik będzie wartością obliczoną przez twój program, z samym programem jako danymi wejściowymi.
Edycja: powinien obsługiwać teraz nowe wiersze, przepraszam za wcześniej, ludzie
Oto skrypt Pyth do weryfikacji obliczenia wyniku.
źródło
Odpowiedzi:
CJam,
1051827643569545407327279235233229Powyższy program generuje rzeczywisty kod źródłowy o długości 1 179 112 bajtów.
Testowanie
Za pomocą interpretera Java można wygenerować i przetestować kod źródłowy w następujący sposób:
Alternatywna wersja
Kosztem 36 punktów - dla końcowego wyniku 265 - możemy skrócić kod źródłowy o 99,92%:
Możesz wypróbować tę wersję online w interpretatorze CJam .
Pomysł
Chcemy wykonać kod
utrzymywanie wyniku na jak najniższym poziomie. Aby to osiągnąć, zbudujemy ten ciąg znaków po znaku (z kilkoma przerwami przed i po) i oceniamy wynik.
Na szczęście,
'
(dosłowny znak dosłowny),(
(zmniejszenie) i)
(przyrost) są kolejnymi znakami ASCII, więc popychanie dowolnych znaków jest stosunkowo niedrogie.Znaki ASCII po
'
mogą być wypychane jako'()…)(
, gdzie liczba)
zależy od punktu kodowego.Na przykład
+
można nacisnąć jako'())))(
. Odległość pomiędzy'
a(
i(
a)
oznacza 1. wzdłużny)(
znoszą się nawzajem; ich jedyną funkcją jest utorowanie drogi kolejnym'
(odpowiadającym następnemu znakowi) kolejnym znakom.Postacie popchnięte w ten sposób podniosą wynik o 4 punkty.
Znaki ASCII wcześniej
'
mogą być wypychane jako''(…(
, gdzie liczba(
zależy od punktu kodowego.Na przykład
#
można nacisnąć jako''((((
. Odległość między'
i(
wynosi 1.Postacie popchnięte w ten sposób podniosą wynik o 2 punkty.
''(…(
faktycznie działa dla wszystkich znaków ASCII, ponieważ znak ma szerokość 16 bitów i jest zawijany. Na przykład+
można''
nacisnąć, a następnie 65 532(
s.Ta technika jest używana w 1,2-megabajtowej wersji kodu.
Postać
'
może zostać popchnięta jako''
, pozostawiając wynik niezmieniony.Kod
źródło
Haskell,
1528279574291196839217744771742Użycie (uwaga:
"
należy uciec):Przygotowuję pusty ciąg
""
do ciągu wejściowego, aby pomóc tłumaczowi Haskell w określeniu typów. Bez tego wnioskowanie typu nie powiedzie się, kod jest zbyt polimorficzny. Reszta to zwykły biznes: zamapuj każdą postać na ascii, zrób listę różnic sąsiadów, kwadrat, sumę i przedrostek języka.źródło
> <>, 30227
Gah, tytuł podwoił mój wynik; słowami mojego własnego programu, n & oooooo! Później zajmę trochę czasu, aby to poprawić. Wiem również, że ten wynik może być wyłączony, ponieważ tak naprawdę nie mogę wprowadzić nowego wiersza w tłumaczu online i nie jestem pewien, czy istnieje sposób na wypełnienie stosu wejściowego na oficjalnym.
W żadnym wypadku nie jest całkowicie zoptymalizowany, ale w
pełniwykorzystuje względną bliskość (przynajmniej pod względem znaków ASCII) poleceń w> <>. Nie mogłem łatwo przesłać nowego wiersza jako danych wejściowych, więc użyłem sprawdzania wyniku Pyth, ale pasuje on do wielu losowych przypadków testowych, z których korzystałem, więc powinno być dobrze.Oto jeden z wynikiem 30353 (który powinien być poprawny, ponieważ jest to jedna linia):
źródło
Jawa,
66465+65.50662434Zaskakująco krótki. Akceptuje tablicę char zamiast łańcucha.
Użyłem programu do wygenerowania najlepszych nazw zmiennych.
źródło
((Function<char[],String>) ABCD->{…}).apply(…)
dzięki. Te lambdas wydają się być dość niekompletne bez kontekstu typu.K5, 25478
Całkiem proste rozwiązanie. Jest to funkcja, która pobiera dane wejściowe za pomocą ciągu znaków.
źródło
Windows PowerShell ISE Host, 62978
638946796077050Edytuj - zapisano niektóre punkty, pozbywając się
$A
zmiennej i zamiast tego odliczając wstecz ciąg, a także przez konwersję niektórych słów kluczowych na CAPSEdytuj2 - zapisano kilka punktów, używając
$($HOST.NAME)
zamiastPowerShell
Edit3 - zapisano kilka punktów, zamieniając nazwy zmiennych i zmieniając sposób generowania danych wyjściowych.
Używa zmiennych o nazwach liczbowych, ponieważ są one „bliżej”,
$
więc nasza kara jest mniejsza.Interesujące jest nie stosowanie regularnych technik gry w golfa. Na przykład
|%{$
wynosi 22534, a|foreach{$
tylko 8718.Prawdopodobnie jest to prawie optymalne bez zmiany technik.
źródło
MATLAB,
+19.2143974839444+38.78537593Podziękowania dla Luisa Mendo za dalsze zmniejszenie różnicy liczą się dalej!
Dzięki NumberOne za zmniejszenie liczby szumów poprzez zmianę nazwy zmiennej wejściowej!
Jak to działa
ans
zmiennej domyślnej w MATLABA9876543210
i wypisuje sumę kwadratowych sąsiadujących różnic ciągu.diff
znajduje pary sąsiadujące różnice w tablicy i tworzy tablicęlength(A9876543210)-1
. Za pomocądiff
tablicy ciągów rzutuje się to nadouble
tablicę, w której generowane są kody ASCII każdego znaku, a różnice między kolejnymi parami dają inną tablicę.diff(A9876543210)'
faktycznie wytwarzało więcej hałasu niż zA9876543210.'
(dzięki Luis Mendo!)źródło
A=
norm(diff(B))^2
krótszy%d
.B
jako nazwy zmiennej?A=@(A)...
jest prawidłowy MATLAB, ponieważA
ma zasięg.QBasic, 38140
YAY FOR SHOUTY SYNTAX
(Testowane z QB64 .)
Jest to pełny program, który wprowadza ciąg znaków i wysyła odpowiedź. Jedynym ograniczeniem jest to, że program nie może pobierać danych wielowierszowych (
LINE INPUT
może obsłużyć wszystko, o ile jest to pojedyncza linia).Odbarwione:
Dogodnie przekazanie ciągu wieloznakowego w celu
ASC
uzyskania wartości ASCII pierwszego znaku. Również dogodnie zmienne numeryczne są automatycznie inicjowane do zera.źródło
Python 2, 91026
Definiuje anonimową funkcję, która pobiera ciąg znaków i zwraca wynik. Wypróbuj online .
Większość z nich jest dość prostą implementacją funkcjonalną: zip
A
z,A[1:]
aby uzyskać listę par liter, a następnie odjąć ichord
s, kwadrat i sumę za pomocą wyrażenia generatora.Zauważmy, że obie zmienne wewnątrz generatora wypowiedzi są zawsze tylko następnie następujących znaków:
)
,,
, i przestrzeń. Wszystkie trzy mają bardzo niskie wartości ASCII, więc powinniśmy zakończyć każdą zmienną znakiem o możliwie najniższej wartości ASCII. Najniższym znakiem, który może zakończyć zmienną w Pythonie, jest0
. Co więcej, każda szansa na podzielenie jednego dużego skoku na dwa mniejsze skoki obniży wynik:A0
kosztuje 289, aleA90
wynosi tylko 145 iA9876543210
jest marna 73.(To podejście nie pomogło zmiennej lambda
A
, prawdopodobnie dlatego, że następuje po niej[
jedno wystąpienie).źródło
JSFuck, 144420642
Zbuduj z:
Wklej to do małego pola wprowadzania JSFuck.com , aby skompilować je do JSFuck. Wynikiem jest skrypt o długości 112701 znaków, więc nie mogę go tutaj umieścić. Ostatnie dwa znaki tego skryptu to nawiasy, wstaw dane między nimi.
Program potrzebuje prawie 20 sekund na ocenę komputera.
Wyjaśnienie
Mam więcej czasu, aby nad tym popracować, więc usiadłem i spróbowałem zoptymalizować nazwy zmiennych. Oto nazwy zmiennych, których warto używać, w kolejności ich wyniku.
Oto JavaScript, który przetłumaczyłem na JSFuck:
Przyjrzałem się bliżej tłumaczowi JSFuck.com i zorientowałem się, jak działa jego funkcja oceny. Po zaznaczeniu opcji „Źródło ewaluacyjne” kod stanie się samoczynnie wykonującą się funkcją JSFuck. Aby uzyskać dane wejściowe, musimy jednak uzyskać dostęp do argumentów [0] z funkcji. To prowadzi nasz ostateczny kod JS do ...
(Jeśli zastanawiasz się, dlaczego moja poprzednia wersja miała niższy wynik niż ten wynik, to dlatego, że był to program JSFuck, który zwrócił ciąg, który musiał zostać oceniony jako JS. To dlatego też nie zostawiłem go w poście)
źródło
abs
jest niepotrzebny. Myślę, że to może zrobić różnicę ... :)JSFuck, 102280181
.CJam,
236631938911547Wypróbuj online
Zaczyna się wydawać, że można to popychać prawie bez końca, strategicznie dodając więcej postaci. Ale myślę, że zaczynam osiągać punkt malejących zwrotów, więc na razie przestanę. Na przykład tam, gdzie mam
ULC;;;
, mógłbym użyć całego alfabetu do tyłu, a następnie 26;
, ale zyski stają się coraz mniejsze.Zdecydowanie największa luka mi pozostało to między
m
i,
w początkowym łańcucha. Nie znalazłem nic rozsądnego, żeby się tego pozbyć. Jestem pewien, że istnieją sposoby. Ale jeśli przekroczę granicę, może zacząć wyglądać jak rozwiązanie Dennisa ...źródło
JAVASCRIPT, 33911
Jest to zdecydowanie jedna z najgłupszych optymalizacji, jakie kiedykolwiek przeprowadziłem w golfa kodowym ...
Podpowiada Neilowi za sugestię „komentarz spam” = P
źródło
/**/
w odpowiednie miejsca.JAVASCRIPT, 31520
To rozwiązanie było
znacznie bardziej absurdalne,bardzo różniło się od mojego drugiego, więc czułem, że zasługuje na własną odpowiedź.To 7306 znaków, z których większość to rzeczywisty program zakodowany w tym ciągu 0/1, a reszta po prostu go dekoduje. Działa poprzez uzyskanie indeksu każdego „1” minus indeks poprzedniego „1”, aby uzyskać niezbędną wartość znaku. Następnie ewaluuje otrzymany ciąg znaków do faktycznej funkcji, która jest zasadniczo standardowym programem golfowym służącym do rozwiązania problemu (który sam w sobie ma tylko około 105 znaków).
źródło
R,
68911571835381652224Pobiera ciąg ze STDIN i konwertuje go na liczbę całkowitą za pomocą raw. Różni, kwadratuje i sumuje wynikowy wektor. Wynik jest zwracany jako ciąg. Dzięki @nimi za wskazówkę dotyczącą nazwy zmiennej.
źródło
Mathematica, 33552
Ten kod przekształca się w funkcję bez nazwy, która oblicza „szum” ciągu wejściowego. Wykorzystuje fakt, że reprezentacja danych binarnych w ASCII jest zasadniczo „bezszumowa”. Dane binarne, które widzisz, to ciąg
która sama byłaby prawidłową odpowiedzią, zdobywając 37848 punktów.
Wszystko inne
po prostu dekoduje ciąg binarny i interpretuje go jako kod Mathematica. Zauważ, że pusty komentarz Mathematiki
(**)
jest bardzo „cichy” i faktycznie usuwa hałas z"
s.źródło
Java8:
1171701005089906298890Za pomocą wyrażenia lambada i wbudowanego przypisania zmiennej można nieco skrócić ten kod.
źródło
Java,
129300128400+110.930106581105101To wyzwanie skłoniło mnie do głębszego zastanowienia się nad postaciami i optymalizacją postaci, niż znalezieniem najkrótszego rozwiązania. Będę pracował nad obniżeniem liczby.
Jest to funkcja lambda,
B
która jest łańcuchem reprezentującym funkcję. Nie zapomnij uciec od cudzysłowu ("
), przekazując to jako ciąg.źródło
Pyth, 16391
Jedyną sztuczką używaną tutaj jest kodowanie base-256
#Pyth,
, które kosztuje znacznie mniej niż sam ciąg.źródło
M,
47033 52798Aby tego użyć, musimy uciec z cudzysłowów i „escape” białych znaków (które są znaczące w MUMPS!) W następujący sposób:
Zauważ, że „M” to alternatywna nazwa dla „MUMPS” - wśród praktyków nie ma zgody co do tego, która z nich jest poprawna. Oczywiście wybrałem tutaj krótszą opcję.
źródło
NEW
zapychać). Więc kiedy zaczynam robić arytmetykę naAAAA
(terazAAA9876543210
), jest ona zmuszana0
(może to tylko szczegół implementacji Caché? Nie mam instalacji GT.M do przetestowania). Dobre wezwanie do priorytetów operatora; Zawsze trudno mi myśleć w kategoriach operacji od lewej do prawej. (Zapomniałem również, że M ma operatora potęgowania - nie jest to coś, co często pojawia się, gdy piszesz aplikacje CRUD.)Ruby, 118402
Czyta w pliku za pomocą wiersza polecenia, takiego jak
ruby diff.rb /path/to/file
. Jest miejsce do poprawy, nad czym teraz pracuję.źródło
C ++ 166345
źródło
Perl, 93556
Spróbuję jeszcze bardziej to ograniczyć.
Okazuje się, że nawiasy klamrowe (
{
i}
ASCII 123 i 125) oraz podkreślenie (_
, ASCII 95) są bardzo drogie, ponieważ wszystkie inne znaki są w zakresie 30-70, dlatego sformatowałemif
tak, jak to zrobiłem, i dlaczego używam$AAAAA
zamiast ukochanej Perla$_
.Niestety, wszystkie zmienne z symbolami są tylko do odczytu, więc nie mogę skorzystać z kombinacji takich jak
$#
i$$
.źródło
F #,
136718130303Gdzie jest
\n
po;
.źródło
POSIX Shell, 172026
szkoda, że nie mogę uzyskać takiego samego wyniku jak Pyth Checker (178386) ...
źródło
Lua,
171078117896Gra w golfa:
Nie golfowany:
źródło
C ++, 49031
makro C ++, które pobiera ciąg c i zapisuje wynik na standardowym wyjściu
Wypróbuj online!
źródło
C ++, 5
źródło