Właśnie zostałeś zatrudniony przez niemiecką firmę produkującą samochody. Twoim pierwszym zadaniem, jako inżyniera, jest napisanie programu obliczającego ślad ekologiczny ciągów ASCII.
Ekologiczny ślad charakteru oblicza się w następujący sposób:
Wpisz kod ASCII znaku w formacie binarnym i policz liczbę 1.
Na przykład A
ma ślad 2, ale O
jest bardziej brudny z śladem 5.
Globalny ślad łańcucha jest sumą śladów jego znaków. Pusty ciąg ma zerowy ślad.
Twój program musi zaakceptować ciąg ASCII jako parametr (poprzez wiersz poleceń lub dane wejściowe), obliczyć swój ślad ekologiczny i wyprowadzić go. Sam program musi być zakodowany w ASCII.
Jest jednak czkawka. Ponieważ Twoja firma chce wejść na nowy rynek z bardziej surowymi zasadami ochrony środowiska, musisz dostroić swój program, aby zachowywał się inaczej w „trybie testowym”. A zatem:
Program powinien wypisać 0, gdy otrzyma ciąg
test
jako parametr.
Punktacja
Wygrywa kod źródłowy o najmniejszym śladzie ekologicznym (i tak, odpowiedź test
jest zabroniona!)
źródło
\x7F}~_?{ow7yvu/s\x1F;=znm>k|OW[]^gc\x1Ex\x1D\eef\\'ZY+-VU.St\x173iNM5K6r\x0FG9:q<ljQ\x15\x13pC\aEF8IJL4\x0E21\x16RTh,X*)\x19\v&%\x1A#d\x1C\rab`!\"$(\x180\x05A\x14B\x12\x11DHP\x03\f\x06\n\t\x80\x10\x01@\x04\b\x02 \x00
Odpowiedzi:
CJam,
3331Istnieje 11300000000950000000034000000011600000001010000000115000000011600000000340000000061000000003300000042000000005800000001050000005000000000010000000980000000049000000010200000000980000000049000000000000004900000001020000000098000000004900000000000000490000000102000000009800000000490000000000000049000000010200000000980000000049000000000000000000000000010200000000980000000000000000000000000000000000010200000000980000000000
Kod jest równoważny z
które można przetestować online .
Jak to działa
Jak to działa
Ten kod źródłowy ma ślad ekologiczny 75.
źródło
Lenguage , 0
Wyjście jest jednoargumentowe , ponieważ Lenguage / Brainfuck nie ma zdrowego sposobu drukowania liczb całkowitych w bazie 10.
Rzeczywisty kod źródłowy zawiera
zero bajtów i jest równoważne z następującym programem Brainfuck:
Wypróbuj online na brainfuck.tk .
Długość kodu Brainfuck jest bardzo nieoptymalna - na początek zakodowałem na stałe ślady wszystkich znaków ASCII - ale wynik 0 to wynik 0 ...
źródło
PowerShell,
337344304 punktyRUSZAM SIĘ DO CIEBIE, PONIEWAŻ TANIEJ!
Pobiera dane wejściowe jako
$A
, następnie rzutuje jako tablicę znaków, a następnie iteruje pętlę for dla każdego znaku, używa absurdalnie trudnego[convert]::ToString()
do przekształcenia znaku w tej pozycji na binarny, zastępuje wszystkie zera niczym, a następnie liczy długość i dodaje to do$B
. Na koniec używa równoważności do indeksowania do tablicy dynamicznej (tzn. Jeśli$A
jesttest
, to-CEQ
jest$TRUE
, więc indeksuje do drugiego elementu0
).Edit1 - Poprawiony przypadek testowy
"TEST"
Edit2 - Grał w golfa kilka punktów, iterując same postacie, a nie ich wskaźniki, i pamiętając, że
-replace
nie potrzebuje drugiego parametru, jeśli zastępujesz go niczym.źródło
" 00100010
jest bardziej przyjazny dla środowiska niż pojedynczy cytat' 00100111
."TEST"
"
. Korekta również pod-CEQ
kątem rozróżniania wielkości liter. To trochę podniosło liczbę punktów, ponieważ niepoprawnie punktowałem,' '
ponieważ nie wyznaczyłem go poprawnie w testach.Pyth -
5249Trzy punkty oszczędzają dzięki @orlp.
Pobiera dane wejściowe w cudzysłowach, aby zaoszczędzić powierzchnię.
Pakiet testowy .
źródło
@,0
się*
zapisać 3 :)@,0
, czy po prostu zapomniałeś zmienić?Common Lisp,
294281235Aby obniżyć wynik, użyłem
@
(koszt 1) i!
(koszt 2) jako nazw zmiennych (edytuj: i jeszcze lepiej, jeśli użyję@
dla zmiennej występującej najczęściej w funkcji). I krzyczę TOO ponieważ jest tańszy.Całkiem drukowane
źródło
;)
JavaScript, 279
Edytuj poprawkę błędu (nie liczono bitu 1 każdego znaku)
Kompletny program, z wejściem i wyjściem przez wyskakujące okienko. Testowany w przeglądarce Firefox powinien działać w dowolnej nowoczesnej przeglądarce.
Niektóre narzędzia (testowane z Firefoksem)
źródło
test
zamiast 0.prompt
funkcją. W Firefoksieprompt
tłumaczy znaki nowej linii (2-bitowe) na spacje (1-bitowe), więc otrzymujemy 277 zamiast 279Julia,
254246232count_ones
Funkcja zlicza liczbę jedynek w binarnej reprezentacji swojego wejścia.Zredukowałem mój ślad ekologiczny dzięki FryAmTheEggman!
źródło
Python 3, 271
źródło
z=input();print(sum(bin(ord(i)).count("1")for i in z)*(z!="test"))
.... @ FryAmTheEggman Jinx?Perl,
13611873Wymień wszystkie
@
z\0
Przykład użycia:
źródło
MATLAB,
198194 bajtówNajpierw ciąg jest odczytywany ze STDIN przez
input
funkcję. Gdy to nastąpi, porównujemy ciąg wejściowy z ciągiemtest
. Jeśli wynik nie jesttest
, konwertujemy każdy znak na jego kod ASCII, a następnie jego reprezentację binarną poprzezdec2bin
. Piękną konsekwencją tej funkcji jest to, że jeśli prześlesz ciąg znaków, binarna reprezentacja jego kodu ASCII jest ograniczona jednym znakiem w wierszu.Jako przykład:
dec2bin
wyprowadza tablicę znaków. Gdy to się stanie, odejmij 48, czyli kod ASCII dla 0, aby macierz została przekonwertowana nadouble
składającą się z zer i jedynek. Gdy to nastąpi, wezwanie donnz
zliczenia całkowitej liczby niezerowych elementów w tej macierzy. Zauważ, że ten wynik jest mnożony przez przeciwieństwo łańcucha w porównaniu ztest
. Powinien ciąg nie będzietest
, otrzymamy obliczenie powierzchni postojowej. Jeśli jest równy, to mnożenie daje 0.Kilka przykładów:
źródło
de2bi
zamiast tego użyć i uniknąć-48
rzutowania go na typ liczbowy (a także 2 dodatkowe znaki w nazwie funkcji).Grzmotnąć
440430412405403Całkiem proste. Zapętla znaki na wejściu konwertując najpierw na ascii (z
printf %d
i'
na początku liczby, a następnie na binarne (zbc
), usuwa zera i zlicza liczbę znaków.Nie jest to świetna odpowiedź, ale jeszcze nie widziałem próby uderzenia.
Zmodyfikowany od czasu mojej pierwszej odpowiedzi pozwolił na podanie ciągu wejściowego po prostu w wierszu poleceń (tzn. Stał się wieloma parametrami wejściowymi, jeśli wiele słów), ale po przeczytaniu innych odpowiedzi myślę, że mogę założyć, że jest cytowany, więc cały ciąg jest
$1
źródło
do
z{
idone
z}
. 2. Nie potrzebujesz również spacji dookoła<<<
. 3. Możesz zastąpić\n
dosłownym dosuwem linii.=
i||
kosztuje 15, a korzystanie!=
i&&
to tylko 13! Dodatkowa postać, ale oszczędza dwa punkty ...Ceylon,
1431,764,697,571,547,538,501,493,467, 451To był oryginalny, nie golfisty:
To pobiera argument z parametru wiersza poleceń ... proces.arguments jest (być może pustą) sekwencją ciągów, więc przed użyciem jednego z nich musimy sprawdzić, czy rzeczywiście istnieje. W innym przypadku wysyłamy komunikat o błędzie (nie jest to wymagane przez pytanie i zostanie wyrzucone w następnych wersjach).
sum
Funkcja Cejlonu przyjmuje niepustą iterowalną część jakiegoś typu, który musi spełniaćSummable
, tj. Maplus
metodę taką jak Liczba całkowita. (Nie działa z pustymi sekwencjami, ponieważ każdy typ Summable będzie miał swoje własne zero, a środowisko wykonawcze nie ma szansy dowiedzieć się, który z nich jest przeznaczony).Elementy łańcucha lub jednego bitu liczby całkowitej nie są niepustą iterowalną. Dlatego używamy tutaj funkcji do zbudowania iterowalności poprzez określenie niektórych elementów, a następnie „zrozumienia” (które zostanie ocenione na zero lub więcej elementów). Tak więc w przypadku znaku dodajemy je (ale tylko wtedy, gdy ustawiony jest odpowiedni bit), w przypadku ciągu dodajemy wynik znaków. (Zrozumienie zostanie ocenione tylko wtedy, gdy funkcja odbiorcza faktycznie się nad nim iteruje, a nie podczas budowania Iterable).
Zobaczmy, jak możemy to zmniejszyć. Po pierwsze, każda z funkcji jest wywoływana tylko w jednym miejscu, więc możemy je wstawić. Ponadto, jak wspomniano powyżej, pozbyć się komunikatu o błędzie. (764 punktów śladu).
Tak naprawdę nie potrzebujemy zagnieżdżenia wewnętrznego
sum
, możemy to jedno wielkie zrozumienie. (To oszczędza nam 37 punktów śladusum({0,})
, a trochę więcej dla białych znaków, które i tak zostaną wyeliminowane na końcu.) To jest 697:Możemy zastosować podobną zasadę do specjalnego
"test"
ciągu w postaci łańcucha: ponieważ w tym przypadku wynik wynosi 0 (tzn. Nic nie jest sumowane), możemy to zrobić tylko jako część sumy (ale musimy odwrócić warunek) . To głównie oszczędza namprint(0);
trochę nawiasów klamrowych i kilka wcięć, dochodząc do 571:Robimy to samo za pierwszym razem
if
, z efektem ubocznym, który teraz nie daje żadnych argumentów, a także0
nic nie robi. (Przynajmniej myślałem, że tak się stanie tutaj, zamiast tego wydaje się, że zawiesi się w wiecznej pętli? Dziwne.)Możemy faktycznie pominąć tutaj funkcję
()
dla tejsum
funkcji, używając alternatywnej składni wywołania funkcji , która używa{...}
zamiast tego()
i wypełni wyrażenia w iterowalnych argumentach. Ma to ślad 538:Zastąpienie nazwy funkcji
footprint
(40) przezp
(3) pozwala zaoszczędzić kolejne 37 punktów, co prowadzi do 501. (Nazwy funkcji Cejlonu muszą zaczynać się od małych liter, więc nie możemy uzyskać tutaj mniej niż 3 punkty).Nazwy zmiennych
s
(5) ic
(4),i
(4) również nie są optymalne. Zamieńmy je naa
(argument),d
(cyfra?) Ib
(indeks bitów). Ślad 493:Nie widzę żadnej optymalizacji spoza białych znaków, więc usuń niepotrzebne spacje (1 punkt za każde miejsce, dwa za każde z dwóch podziałów linii):
Podczas przeglądania interfejsu API odkryłem, że Character.hash faktycznie zwraca tę samą wartość co jego
integer
atrybut. Ale ma tylko 14 punktów zamiast 30, więc schodzimy do 451!źródło
PowerShell
273336328324293288295edytuj - zapomniałem przypadku „testowego” ... tak drogiego.
editedit - przegapiłem okazję DUŻA.
editeditedit - uwzględnił sugestie dotyczące komentarzy (dzięki TimmyD).
edycja 4 - D jest tańszą odmianą niż C (2 vs. 3)
edycja 5 - Powrót do 295 ze względu na sprawdzanie wielkości liter.
Pętle przechodzą przez ciąg znaków i zliczają jedynki, które są przesunięte względem wartości ASCII znaków.
Porada dla TimmyD za przekazanie mi przewidywania, aby używać wielkich liter ORAZ na końcu używać indeksu tablicy.
źródło
PARAM($A)[CHAR[]]$A|%{$C=[INT]$_;WHILE($C){$B+=$C-BAND0X1;$C=$C-SHR1}};($B,0)[$A-EQ"TEST"]
PS C:\scripts> .\ecological-footprint.ps1
"TEST"
PARAM($A)(([CHAR[]]$A|%{$B=$_;0..9|?{[INT]$B-SHR$_-BAND1}}).LENGTH,0)[("TEST"-EQ$A)]
Matlab, 320
źródło
C 374
Dodano nowe linie (nie uwzględnione w wyniku) dla zachowania przejrzystości. Można go poprawić do 360, zmieniając nazwy zmiennych na wielkie, ale postaram się wymyślić coś lepszego.
Dane wejściowe są wprowadzane za pomocą wiersza polecenia, co oznacza, że powoduje awarie w przypadku nieobecności danych wejściowych. Oczekuję gorszego wyniku dla wejścia poprzez stdin.
źródło
PHP,
377337299 Ślad ekologiczny (wciąż dużo) ,10291 bajtówWydaje się, że PHP jest przyjazny środowisku tylko w trybie testowym. ;)
Działa z wiersza poleceń, takich jak:
while
jest bardziej przyjazny dla środowiska,for
nawet jeśli mają tę samą liczbę znaków. Również nazwy zmiennych pisane wielkimi literami mają lepszy ślad niż ich odpowiedniki pisane małymi literami.Edytować
decbin
zamiastbase_convert
źródło
VBA,
475418Dzięki Jacob za 57 punktów zniżki
Konwertuje ciąg na tablicę bajtów (128 to skrót vba dla „Konwertuje ciąg z Unicode na domyślną stronę kodową systemu”, więc nie będzie działać na Macu ....)
Pętle przetwarzają tablicę bajtów na binarną i łączą wszystko razem.
VBA, dlaczego jesteś taki zły w golfie ... :(
źródło
"test"
oczywiście)JavaScript,
418410źródło
" 00100010
jest bardziej przyjazny dla środowiska niż pojedynczy cytat' 00100111
.Pyth, 64
Sprawdza, czy dane wejściowe są testowe, a jeśli nie, liczy liczbę 1 w binarnej reprezentacji danych wejściowych.
źródło
Haskell, 292
Nie ma tu nic do powiedzenia: zamień każdą postać w wartość ascii (
fromEnum
) i oblicz1
s (viaa
). Zsumuj wszystkie wyniki.źródło
JavaScript (ES6),
521478458449473465To moja pierwsza próba gry w golfa w JavaScript, więc prawdopodobnie jest bardzo nie golfa.
źródło
Rubin,
316313Bardzo proste, szukając więcej możliwości gry w golfa:
b
zamiast,x
aby zapisać 3 punkty.źródło
$*[0]
zamiastgets.chomp
(trwa wejście jako argument wiersza poleceń)" 00100010
jest bardziej przyjazny dla środowiska niż pojedynczy cytat' 00100111
.H
jest lepszy niżI
z tego samego powodu.Python 2,
294281269266Port mojej odpowiedzi na Pythona powyżej.
Dane wejściowe są odbierane jako ciąg (z cudzysłowami):
źródło
" 00100010
jest bardziej przyjazny dla środowiska niż pojedynczy cytat' 00100111
.A=input();print[sum(bin(ord(H)).count("1")for H in A),0][A=="test"]
wyniku z wynikiem 243.CJam, 123
źródło
Pyth, 96
Port mojej odpowiedzi CJam, powyżej / poniżej.
źródło
I
próbować używać trójskładnika?
, ale w tym przypadku, ponieważ jest to bool, którego możesz po prostu użyć*
(po przełączeniu nan
zamiastq
),k
jest automatycznie,""
as
na łańcuchach jest to samojk
. Mam nadzieję, że dobrze się uczyłeś pyta! :)CJam,
83817977Jak dotąd najlepszy po wypróbowaniu wielu odmian:
Wypróbuj online
Wyjaśnienie:
źródło
Ruby, 247
Proste przejście przez wszystkie bajty wejścia i wszystkie bity w każdym bajcie, zsumowane do zmiennej
d
.d
jest inicjowany na -2, ponieważh
zawiera kończący znak nowej linii od wartości wejściowej (wart 2 bity) i nie chcemy tego liczyć.Podobnie
h
będzie zawieraćtest
końcowy znak nowej linii, więc nowy wiersz musi zostać uwzględniony w wartości porównania.źródło
R, 279
Dość oczywiste.
Testy:
źródło
C, ślad 378, 98 bajtów
Inne rozwiązanie C:
Działa to tak, że s jest zazwyczaj inicjowane na 0, ale staje się -17, jeśli argument wiersza poleceń to „test” (strcmp zwraca 0 dla równych ciągów, a niezerowe dla różnych ciągów, więc odwrócenie daje 1, jeśli ciąg to „test”). Liczba -17 została wybrana, aby zrekompensować powierzchnię 17, która zostanie obliczona dla „testu”. Obliczanie powierzchni postojowej jest łatwe dzięki operatorom bitowym.
Kłapnięcie! Początkowo brakowało mi „najkrótszych wygranych footprintów”, więc dążyłem do uzyskania najkrótszego kodu ... Zobaczę, czy mogę zmniejszyć „footprint”.
źródło
Java, 594
Java nie jest bardzo zielona.
Wersja bez golfa:
D
jest zadeklarowany jakoInteger
taki, abyśmy mogli uzyskać dostęp do metodyInteger
statycznejbitCount
w sposób przyjazny dla środowiska.bitCount
Sposób traktujechar
S jako liczby całkowite i zwraca liczbę ustawionych bitów.źródło