W New Modern Times , kiedy Charlie Chaplin napotyka komputer, jest on zatrudniony w stoczni sortowania, jako osoba zatwierdzająca, aby ustalić, czy pracownicy prawidłowo sortują przedmioty. Przedmiotowe przedmioty to paczki kulek. Paczki z nieparzystą liczbą kulek są układane w Czerwonym Koszu, a paczki z parzystą liczbą Kul są układane w Niebieskim Koszu.
Charlie Chaplin ma przebić program , który sprawdziłby, czy w procedurze sortowania występuje jakakolwiek anomalia. Mack Swain, jego bezpośredni szef, dzieli algorytm, który musi kodować.
Algorytm
L = List of Marble packets that's already sorted
L_ODD = List of packets with Odd Number of Marbles
L_EVEN = List of packets with Even Number of Marbles
Check_Digit = √(ΣL_ODD² + ΣL_EVEN²)
Jego zadaniem jest określenie Check_Digit i dopasowanie go do wartości, jaką kiedykolwiek oblicza jego Szef.
Charlie Chaplin podczas lunchu był w stanie przekraść się do szuflady Macka Swaina i ustalić, że jego szuflada ma pojedynczą kartę ze stemplami w pierwszych 46 32 kolumnach (co oznacza, że Mack był w stanie napisać program zawierający tylko 46 32 znaki).
Charlie Chaplin potrzebowałby teraz pomocy wszystkich ninja-kodów, aby napisać program z jak najmniejszą liczbą wierszy. Ogłasza także bonus 50 punktów, jeśli ktoś może wymyślić program krótszy niż jego Szef.
streszczenie
Biorąc pod uwagę listę / tablicę / wektor liczb dodatnich (nieparzyste i parzyste), musisz napisać funkcję, która akceptuje array(int [])/vector<int>/list
i oblicza pierwiastek z sumy kwadratów sum liczb nieparzystych i parzystych na liście.
Rozmiar programu to rozmiar treści funkcji, tzn. Z wyłączeniem rozmiaru podpisu funkcji.
Przykład
List = [20, 9, 4, 5, 5, 5, 15, 17, 20, 9]
Odd = [9, 5, 5, 5, 15, 17, 9]
Even = [20, 4, 20]
Check_Digit = √(ΣOdd² + ΣEven²) = 78.49203781276162
Uwaga: rzeczywista wydajność może się różnić w zależności od precyzji zmiennoprzecinkowej implementacji.
Wynik
Wynik obliczany jest jako Wynik obliczany jest jako Σ(Characters in your Program) - 46
. Σ(Characters in your Program) - 32
. Oprócz regularnego głosowania społeczności, najniższy wynik ujemny otrzymałby dodatkowy bonus 50 punktów.
Edytować
- Przesunięcie użyte do obliczenia wyniku zostało zmienione z 46 na 32. Uwaga, nie wpłynie to na kwalifikację do tabeli liderów / nagrody lub nie unieważni żadnego rozwiązania.
Werdykt
Po makabrycznym pojedynku pomiędzy Ninja, pan Chaplin otrzymał wspaniałe odpowiedzi. Niestety niewiele odpowiedzi próbowało w niewłaściwy sposób wykorzystać tę zasadę i nie było zbyt przydatne. Naprawdę chciał uczciwego pojedynku, a odpowiedzi, w których logika została zakodowana w podpisach funkcji, oznaczałyby, że podpis funkcji jest integralną częścią rozwiązania. Wreszcie, Ninja FireFly był wyraźnym zwycięzcą i przyznał mu premię, na którą zasługuje. Tabela liderów (aktualizowana codziennie)
╒══════╤═════════════════╤══════════════╤═════════╤════════╤═══════╕
├ Rank │ Ninja │ Dialect │ Punches │ Scores │ Votes ┤
╞══════╪═════════════════╪══════════════╪═════════╪════════╪═══════╡
│ 0 │ FireFly │ J │ 17 │ -15 │ 6 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 1 │ tmartin │ Kona │ 22 │ -10 │ 2 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 2 │ Sven Hohenstein │ R │ 24 │ -8 │ 7 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 3 │ Ben Reich │ GolfScript │ 30 │ -2 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 4 │ mollmerx │ k │ 31 │ -1 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 5 │ David Carraher │ Mathematica │ 31 │ -1 │ 3 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 6 │ tmartin │ Q │ 34 │ 2 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 7 │ daniero │ dc │ 35 │ 3 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 8 │ psion5mx │ Python │ 38 │ 6 │ 2 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 9 │ O-I │ Ruby │ 39 │ 7 │ 5 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 10 │ gggg │ Julia │ 40 │ 8 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 11 │ FakeRainBrigand │ LiveScript │ 50 │ 18 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 12 │ Sylwester │ Perl5 │ 50 │ 18 │ 2 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 13 │ daniero │ Ruby │ 55 │ 23 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 14 │ vasuakeel │ Coffeescript │ 57 │ 25 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 15 │ dirkk │ XQuery │ 63 │ 31 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 16 │ crazedgremlin │ Haskell │ 64 │ 32 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 17 │ Uri Agassi │ Ruby │ 66 │ 34 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 18 │ Sumedh │ JAVA │ 67 │ 35 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 19 │ Danny │ Javascript │ 67 │ 35 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 20 │ deroby │ c# │ 69 │ 37 │ 1 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 21 │ Adam Speight │ VB │ 70 │ 38 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 22 │ Andrakis │ Erlang │ 82 │ 50 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 23 │ Sp0T │ PHP │ 85 │ 53 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 24 │ brendanb │ Clojure │ 87 │ 55 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 25 │ Merin Nakarmi │ C# │ 174 │ 142 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 26 │ Boopathi │ JAVA │ 517 │ 485 │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 27 │ Noyo │ ES6 │ ? │ ? │ 2 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 28 │ shiona │ Haskell │ ? │ ? │ 0 │
├──────┼─────────────────┼──────────────┼─────────┼────────┼───────┤
│ 29 │ Vivek │ int │ ? │ ? │ 0 │
└──────┴─────────────────┴──────────────┴─────────┴────────┴───────┘
Odpowiedzi:
J,
1817 znaków - 32 = ⁻15(Jako „ciało funkcyjne”; musi być umieszczone w nawiasach lub powiązane z nazwą).
Wyjaśnienie
Próbowałem zrobić rozłożony pogląd na to, co robi każdy kawałek, tak jak Tobia w odpowiedziach APL.
+/&.:*:
można go zastąpić złożoną sztuczką wielkości|@j./
OI, aby uratować kolejne dwa znaki.Przykład
źródło
ES6,
(48–32) = 16(1-32) = -31Orginalna wersja:
Definicja całej funkcji wynosi 53 znaki, a sama treść to 48.
Zaktualizowana wersja, w pełni wykorzystująca definicję problemu i przenosząca prawie wszystko z ciała do podpisu:
Nowa definicja funkcji ma teraz łącznie 63 „ciosów”, ale funkcja BODY jest teraz JEDNA ZNAKÓW O CHARAKTERZE. Ponadto nie powoduje już uszkodzenia globalnej przestrzeni nazw! :RE
Stosowanie:
źródło
R, (24–32) = −8
Ciało funkcji składa się z 24 znaków.
Stosowanie:
źródło
sqrt(sum(by(x,x%%2,sum)^2))
Ja tylko nie zoptymalizowałem sqrt .... cholera :-) +1 :-) PS: ciekawe jest, jak na początkuby
wygląda na to ze względu na gówniany format wyjściowy, ale po przejechaniusum
go jest naprawiony ;-)by
zwraca tablicę jednowymiarową. Nie należy oceniać funkcji na podstawie jej wynikuprint.by
.by
nie zwraca tablicy (btw, co rozumiesz przez „tablicę”? W R. nie ma żadnej. Prawdopodobnie chodziło o wektor), ani o wektor.by
zwraca obiekt klasyby
.?array
. Ponadtois.array(by(1,1,I))
zwracaTRUE
.Ruby 2.1+ - (39 znaków łącznie - 7 bez treści - 32 przesunięcie = 0)
Nieco inne podejście. Tworzę liczbę zespoloną
a+b*i
takie, żea
ib
są sumami parzystych i nieparzystych numerów wlist
, odpowiednio. Potem biorę tylko wartość bezwzględną.Moje poprzednie rozwiązanie, które ma 5 znaków dłużej, ale działa na wersji 1.9.3+:
Ostatecznie, jeśli dozwolone są Rails + Ruby 2.1+, możemy użyć skrótu
Array#sum
do zaledwie 25 znaków:źródło
Python 2.7: 45, nie: 40, nie: 38 - 32 = 6
Nie ma tu nic nowego, tylko kombinacja sztuczki z liczbą złożoną, którą widziałem w ostatnim wyzwaniu Pitagorasa, lambda dla zwięzłości oraz minimalizacja składni / nawiasów:
Aktualizacja - zapisano kilka znaków. Dzięki @DSM za sztuczkę podniesienia złożonego komponentu do 0/1.
Ok, przeczytanie pytania i rozpoznanie reguły liczenia „treści funkcji” zapisuje kolejne 2 znaki:
Testowanie iPython:
źródło
abs
liczb zespolonychAPL (27–46 = –19)
na przykład:
źródło
Mathematica 31-32 = -1
GatherBy[#,OddQ]
tworzy listy parzyste i nieparzyste.Wewnętrzne
Tr
znajduje sumy, z których oba są podniesione do kwadratu, a następnie zsumowane (przez zewnętrznąTr
).N
konwertuje z liczby niewymiernej (pierwiastek kwadratowy z liczby całkowitej) na przybliżenie dziesiętne.Przykład
Jeśli
f[n_]:=
nie zostanie uwzględniony w liczeniu, można zapisać dodatkową postać.Przykład
źródło
Kona, 22–32 = -10
źródło
Perl5: (50 - 32 = 18)
źródło
say
zamiastprint
i<>
zamiast@ARGV
(podając argumenty na STDIN zamiast w wierszu poleceń)say
wymagałobyuse
? przełączenie z tablicy argumentów na<>
wymagałoby dodatkowegosplit/ /,
.dc 3 (35–32)
Używanie tablic, jak sugeruje @Tomas. Oszczędza to niektóre znaki, ponieważ mogę obliczyć parzystość każdej liczby i użyć jej jako indeksu, zamiast dostrajania parzystości jako metody rozgałęziania i umieszczania właściwych wartości we właściwych rejestrach. Okazuje się również, że tablice dadzą ci 0, nawet jeśli tablica / indeks nie był używany, więc nie musisz niczego inicjować.
Zakłada, że liczby są już na stosie, i pozostawia wynik jako jedyną wartość pozostałą po zakończeniu.
Test:
dc 16 (48 - 32)
Pierwsza wersja użyciu rejestrów o i e do przechowywania liczb parzystych i nieparzystych.
źródło
sose
;-) być może mógłbyś uzyskać krótszy wynik używając komend dc array ?Python, 9 (55–46)
Użycie funkcji lambda oszczędza niektóre bajty na znakach nowej linii, tabulatorach i
return
.Przykład:
źródło
Rubin (66 - 32 = 34)
test:
źródło
Math.hypot *a.partition(&:odd?).map{|x|eval x*?+}
goli kilka znakówRubin, 55–46 = 9
Test:
źródło
h
:f=->a{h=[0,0];a.map{|v|h[v%2]+=v};e,o=h;(e*e+o*o)**0.5}
Q, 34–32 = 2
.
źródło
Julia, 40–46 = -6
Realizacja
Wynik
źródło
Coffeescript, (57 - 32 = 25)
Realizacja
źródło
+=
i zmienić0.5
na.5
GolfScript 30
Nie sądzę, że GolfScript ma na to dużą szansę!
źródło
c #: 69-32 = 37
Pełny kod:
PS: Dla zabawy to też działa, niestety nie zmienia liczby potrzebnych znaków:
źródło
Prolog (73 - 32 = 41)
Tutaj liczymy wszystko po „: -” jako ciało funkcji.
Funkcja wywołania:
źródło
Matlab (44–46 = -2)
Treść funkcji ma 44 znaki:
Całkowita funkcja w następujący sposób:
Testy funkcji:
źródło
Python 2.7 - 64-46 = 18
Może być krótszy przy użyciu
zip
magii, ale na razie:Na zakończenie okazuje się, że możesz wykonać magię zip, ale kosztuje cię to więcej (o kilka postaci), więc powyższe stoi, chyba że ktoś może poprawić jeden z tych:
źródło
abs(sum(1j**(i%2)*i for i in x))
.!s%2
? To co najmniej stopniowa zmiana, którą możesz zaakceptowaćC # 174
Czytelny
źródło
Clojure = 87 - 46 = 41
Jednak mało idiomatyczne.
źródło
Haskell, 64 ° C - 46 = 18
Nie za trudne do odczytania. Przykładowy przebieg:
źródło
int e=0,o=0;for(int i :n){if(i%2==0)e+=i;else o+=i;}System.out.println(Math.sqrt(e*e+o*o));
Rzeczywista metoda w kodzie Java
źródło
PHP 85–32 = 53
$a=$b=0;foreach($x as $q){if(($q%2)==0)$a=$a+$q;else$b=$b+$q;}echo sqrt($a*$a+$b*$b);
To najlepsze, jakie kiedykolwiek wymyśliłem jako początkujący. Jestem pewien, że muszą być też krótsze wersje.
EDYTOWAĆ:
Zredukowana wersja kodu może być:
Ta wersja ma tylko 64 (21 mniej niż oryginalna odpowiedź) znaków.
Tak powiedział 64-32 = 32
źródło
foreach($l as$m)$m%2?$o+=$m:$e+=$m;echo sqrt($o*$o+$e*$e);
VB.net (81c - 11c = 70) - 32 = 38
Poprzez swobodne użycie terminu Napisz funkcję
źródło
XQuery, (63 - 32 = 31)
Realizacja
Wynik
BaseX został użyty jako procesor XQuery.
źródło
Erlang: 82 ° C - 32 = 50
Erlang nie nadaje się do tego. Większość skrótów to więcej znaków (krotek itp.)
Jedyne prawdziwe rzeczy warte odnotowania:
{lists,sum}
jest odwołaniem do funkcjilists:sum
i można go wywoływać--
( odjęcie listy ) listy liczb nieparzystych od pełnej listyMoże dzwonić za pomocą:
Wynik:
78.49203781276162
źródło
Haskell
57 - 32 = 25
Prosta optymalizacja crazedgremlins odpowiedź:
Optymalizacje:
read$show
jest krótszy niżfromIntegral
- 3 znakis=sum\n
a dwas
mają całkowitą długość 8 znaków, dwasum
to tylko 6 znaków. - 2 znakiPróbowałem też dodać więcej elementów do operatora, ale ostatecznie skończyło się to tak długo:
źródło