Celem Stone Rosetta Challenge jest pisanie rozwiązań w jak największej liczbie języków. Pochwal się swoją wielojęzycznością programistyczną!
Wyzwanie
Twoim wyzwaniem jest wdrożenie programu, który wprowadzi listę liczb i wyświetli regułę stosowaną do generowania każdej kolejnej liczby w szeregu, w jak największej liczbie języków programowania . Możesz używać dowolnej standardowej funkcji biblioteki, którą posiada Twój język, ponieważ jest to głównie prezentacja języka.
Co to jest „seria?”
Seria to uporządkowana lista liczb całkowitych. Każdy kolejny numer w serii można wygenerować, stosując prostą regułę do poprzedniego numeru w serii. W tym wyzwaniu reguła polega na pomnożeniu liczby przez stałą, a następnie dodaniu drugiej stałej. Obie stałe mogą być dowolnymi liczbami całkowitymi. Celem tego wyzwania jest uzyskanie tych dwóch stałych.
W przypadku serii 2 5 11
regułę można zapisać jako 2 1
. Oznacza to, że każda liczba jest poprzednią liczbą, razy 2, plus 1. Ważnym faktem jest to, że większość serii ma dokładnie jedną regułę. Niektóre serie mają albo nieskończoną liczbę, albo wcale, ale nie będziesz musiał sobie z tym poradzić.
Wejście
Dane wejściowe będą listą trzech różnych liczb całkowitych, które są liczbami w sekwencji. Liczby mogą być spacjami, przecinkami lub znakami nowej linii, ale proszę podać, które. Będę elastyczny w kwestii tego ograniczenia, ponieważ niektóre języki mogą mieć ograniczenia wprowadzania. Oto cztery przykłady danych wejściowych:
0 7 14
2 5 11
2 0 -4
5 -19 77
Wynik
Wyjściowe będą dwie liczby całkowite, które reprezentują regułę użytą do wygenerowania szeregu. Pierwsza liczba będzie stałą multiplikatywną, a druga liczba będzie stałą addytywną. Formatowanie wyniku może być spacją, przecinkiem lub znakiem nowej linii. Jestem również elastyczny w kwestii tego ograniczenia. Oto odpowiednie przykłady wyników:
1 7
2 1
2 -4
-4 1
Kryterium zwycięskiego celu
Jeśli chodzi o obiektywne kryterium wygranej, oto on: Każdy język to osobny konkurs na to, kto może napisać najkrótszą pracę, ale ogólnym zwycięzcą byłaby osoba, która wygra najwięcej z tych pod-konkursów. Oznacza to, że osoba, która odpowiada w wielu nietypowych językach, może zyskać przewagę. Code-golf jest przeważnie rozstrzygający, gdy istnieje więcej niż jedno rozwiązanie w języku: osoba z najkrótszym programem otrzymuje kredyt za ten język.
Reguły, ograniczenia i uwagi
Twój program może być napisany w dowolnym języku, który istniał przed 9 kwietnia 2012 r. Będę również musiał polegać na społeczności, aby zweryfikować niektóre odpowiedzi napisane w niektórych bardziej rzadkich / ezoterycznych językach, ponieważ jest mało prawdopodobne, że będę w stanie przetestować im.
Aktualny ranking
Ta sekcja będzie okresowo aktualizowana, aby pokazać liczbę języków i kto prowadzi w każdym z nich.
- AWK (32) - mellamokb
- bash (31) - Peter Taylor
- Befunge (29) - Howard
- bc (39) - kernigh
- brainfuck (174) - CMP
- C (78) - 10n3_shArk
- C ++ (96) - po lewej stronie
- Common Lisp (88) - kernigh
- Cray Chapel (59) - Kyle Kanos
- csh (86) - kernigh
- Cuda (301) - po lewej stronie
- dc (30) - kernigh
- DOS BATCH (54) - mellamokb
- Element (27) - Howard
- es (95) - kernigh
- Współczynnik (138) - kernigh
- Felix (86) - kirbyfan64sos
- Fortran (44) - Kyle Kanos
- Idź (101) - Howard
- GolfScript (16) - Howard
- Golflua (44) - Kyle Kanos
- Haskell (35) - po lewej stronie
- J (23) - Gareth
- Java (141) - Howard
- JavaScript (47) - mellamokb
- Julia (71) - ML
- Lua (51) - Howard
- Rtęć (319) - po lewej stronie
- MoonScript (48) - kirbyfan64sos
- Nimrod (146) - po lewej stronie
- Owl (22) - res
- Pascal (88) - po lewej stronie
- Perl (57) - Gareth
- PHP (61) - mellamokb
- PicoLisp (72) - kernigh
- Piet (56) - ML
- PostScript (61) - Howard
- Python (40) - Howard
- Q (36) - tartinina
- QBasic (34) - mellamokb
- R (50) - res
- Ruby (44) - Howard
- Scala (102) - Gareth
- SQL (57) - Aman ZeeK Verma
- TI-83 BASIC (25) - mellamokb
- Nieograniczona rejestracja maszyny (285) - Paxinum
- VBA (57) - Gaffi
- Biała spacja (123) - res
- zsh (62) - kernigh
Aktualne rankingi użytkowników
Równe stopnie są sortowane alfabetycznie.
Howard (9): Befunge (29), Element (27), Go (101), GolfScript (16), Java (141), Lua (51), PostScript, (61) Python, (40) Ruby (44)
kernigh (8): bc (39), Common Lisp (88), csh (86), dc (30), es (95), Factor (138), PicoLisp (72), zsh (62)
leftroundabout (6): C ++ (96), Cuda (301), Haskell (35), Mercury (319), Nimrod (146), Pascal (88)
mellamokb (6): AWK (32), DOS BATCH (54), JavaScript (47), PHP (61), QBasic (34), TI-83 BASIC (41)
Gareth (3): J (23), Perl (57), Scala (102)
Kyle Kanos (3): Cray Chapel (59), Fortran (44), Golflua (44)
res (3): Owl (22), R (50), Whitespace (123)
kirbyfan64sos (2): Felix (86), MoonScript (48)
ML (2): Julia (71), Piet (56)
Aman Zeek verma (1): SQL (57)
CMP (1): brainfuck (174)
Gaffi (1): VBA (57)
l0n3_shArk (1): C (78)
Paxinum (1): Unlimited Register Machine (285)
Peter Taylor (1): bash (31)
tmartin (1): Q (36)
źródło
code-golf
icode-challenge
.Odpowiedzi:
GolfScript, 16 znaków
Dane wejściowe są podawane jako lista oddzielona spacjami.
JavaScript, 56 znaków
Dane wejściowe są podawane na monit.
Ruby, 44 znaki
Dane wejściowe podano tutaj jako listę oddzieloną przecinkami.
Python, 40 znaków
Dane wejściowe są ponownie oddzielone przecinkami.
Java, 141 znaków
Wejście oddzielone znakiem nowej linii.
Lua, 51 znaków
Wejście oddzielone znakiem nowej linii.
Idź, 101 znaków
Wejście oddzielone znakiem nowej linii.
Fortran, 90 znaków
Wejście oddzielone znakiem nowej linii.
Befunge, 29 znaków
PostScript, 61 znaków
Sowa, 23 znaki
Wejście oddzielone znakiem nowej linii.
Element , 27 znaków
Wejście oddzielone znakiem nowej linii.
źródło
Brainfuck - 174
Piet - 82?
Nie jestem pewien, jak mierzyć tutaj konkurencyjny golf. Idę z całkowitym rozmiarem obrazu (w kodach) Mój jest 41x2:
Befunge - 34
Angielski - 278
Nie jestem pewien, czy to się liczy, ale pomyślałem, że dam temu szansę. Niezwykle trudno jest dokładnie opisać nawet prosty algorytm. Trochę życzę, aby angielski wspierał jakiś symbol grupowania w celu ustalenia pierwszeństwa.
źródło
D:\Software\Programming\Piet\npiet-1.3a-win32>npiet series2.png
? 5
? -19
? 77
05
Rozwiązanie powinno być-4 1
QBasic, 42
Wymaga wprowadzenia przecinków, danych wyjściowych ze spacjami (czy to w porządku?)
Merkury, 319
Haskell,
8581Teraz dane wejściowe ze spacjami, dane wyjściowe z nowymi liniami.
C, 80
C ++, 96
Nimrod, 146
Wejście w / nowe linie, przecinek wyjściowy.
Ten nie będzie się liczył, ale wydaje mi się, że nadal pasuje w jakiś sposób:
Twierdzenie matematyczne, 713 znaków LaTeX
Kiedy piszemy
:=
definicje ...Pascal,
9088Cuda, 301
źródło
m
i ponownie wykorzystującc
, a kolejne dwa, używającc-=b;c/=b-a;
zamiastc=(c-b)/(b-a);
.scanf()
formatu.AWK, 35 znaków
2 0 -4
bc, 39 znaków
z=f(2, 0, -4)
bc
wyrażeniem. Pobc
odczytaniu pliku źródłowego odczytuje standardowe wejście. Dlatego dane wejściowe muszą wyglądać jak wywołanie funkcji.bc
, który wymaga nowej linii po{
.Common Lisp, 88 znaków
2 0 -4
csh, 86 znaków
2 0 -4
csh
jest jedynym językiem, dla którego liczę znak nowej linii na końcu pliku. Jest tak, ponieważcsh
nigdy nie uruchamia ostatniego polecenia, chyba że jest tam nowy wiersz.set i=($<)
nie działa, ponieważ$<
nie ma podziału słów.dc, 30 znaków
2 0 _4
gdzie_
jest podkreślenie.es, 95 znaków
2 0 -4
es
jest rozszerzalną powłoką autorstwa Paula Haahra i Byrona Rakitzisa.Współczynnik, 138 znaków
2 0 -4
PicoLisp,
7472 znaków2 0 -4
a(read)b(read)c(read)
nar read a(r)b(r)c(r)
.TI-83 BASIC,
6361 znaków2
ENTER0
ENTER¯4
ENTER, gdzie¯
jest jednostkowym minusem kalkulatora.→
(prawa strzałka) liczy się jako U + 2192. Na przykład kalkulator liczy sięInput A
jako 2 znaki, ale liczęInput A
jako 7 znaków. Liczę również:
jako 1 znak.zsh, 62 znaki
2 0 -4
źródło
AWK (32)
Demo: http://ideone.com/kp0Dj
bash (38)
Demo: http://ideone.com/tzFi8
DOS / BATCH (54
55)Pobiera parametry jako rozdzieloną spacjami listę argumentów.
Java (143
185)JavaScript (48
6167)Demo: http://jsfiddle.net/BT8bB/6/
PHP (61
77)Demo: http://ideone.com/CEgke
QBasic (34)
TI-83 Basic (25
41)Tak, brakujący nawias prawy jest celowy. Jest to dobrze znana technika optymalizacji, polegająca na tym, że zamykanie nawiasów przed operacją STO nie jest konieczne w programowaniu podstawowym TI-83.
źródło
p
pojawia się błąd, który jest niezdefiniowany. Czy specyfikacja JS mówi, że argumenty funkcji powinny zostać ocenione przed ich rozwiązaniem?Biała spacja, 123
I / O jest oddzielony znakiem nowej linii. (Aby uzyskać kod źródłowy, przejdź do trybu edycji i skopiuj spację między tagami preformat; lub zobacz przykład online w Ideone .)
Objaśnienie, gdzie S, T, L reprezentuje spację, tabulator, podawanie linii:
R 50
We / wy jest rozdzielone spacjami.
Sowa
--- 22 ---
I / O jest oddzielony znakiem nowej linii.
--- 19 --- (jeśli ta wersja jest dozwolona; ale myślę, że to oszustwo, ponieważ \ jest kodem wykonywalnym):
We / wy jest rozdzielone spacjami. Wykorzystanie w wierszu polecenia:
owl prog 5 19\ 77
(\ działa jako unfiks jednorazowy minus w Sowie).źródło
J, 23 znaki
Stosowanie:
Liczby ujemne są reprezentowane przez podkreślenia w J.
PHP, 88 znaków
Scala, 102 znaki
Perl, 57 znaków
Wymaga opcji „-p”, do której dodałem 2 znaki. Zakłada, że dane wejściowe są prawidłowe, aby zapisać niektóre znaki.
Wszystkie moje odpowiedzi zajmują liczby oddzielone spacjami.
źródło
1!:1]3
po prawej stronie wyrażenia spowoduje odczytanie danych wejściowych ze STDIN. Myślę, że była dyskusja na temat meta lub w komentarzach do niektórych odpowiedzi J na temat tego, czy powinno to być dozwolone, czy nie. Jestem trochę ambiwalentny - lubię wymyślać, jak zmusić J do zrobienia tego, co chcę na najmniejszej przestrzeni, wezmę karę 6 znaków za wkład ze STDIN, jeśli tego właśnie wszyscy chcą.(],1{x-0{x*])%~/2-/\x=:".1!:1]1
w trybie konsoli wydaje się być w porządku.)($a=($_[1]-pop)/($_[0]-$_[1])).$/.($_[1]-$_[0]*$a)
PHP,
74,72, 69Gdy dane wejściowe są przekazywane jako argumenty:Teraz, jak sugerował @mellamokb, używając $ n = $ argv:C,
77, 78^ nie działa, oto rzeczy: [dzięki @ugoren za zwrócenie na to uwagi]źródło
fscanf
iscanf
bez spacji. Niesamowite!$argv
, tj.$n=$argv
Na początku?scanf
być wykonane w pierwszej kolejności, a następnied=..
potemb-d*a
?VBA, 57 znaków
( Jest to w zasadzie to samo co inne funkcje „BASIC”, ale nie widziałem już żadnych zgłoszeń VBA ).
źródło
Debug.?y;b-a*y
bash (42 znaki)
Pure Bash:
bash (31 znaków)
Ucieczka do czegoś innego:
(Na podstawie implementacji OWL Howarda )
źródło
Jest to (niezoptymalizowany) kod dla nieograniczonej maszyny rejestrującej, opisany tutaj: http://www.proofwiki.org/wiki/Definition:Unlimited_Register_Machine
Wejście powinno znajdować się w rejestrze 1,2 i 3, a wyjście będzie w rejestrze 1, 2 po zakończeniu programu. Liczby nieujemne i liczby całkowite nie są obsługiwane, ale dane wejściowe 0,7,14 i 2,5,11 są obsługiwane poprawnie.
Zero[8] Trans[2,11] Jump[3,11,7] Succ[11] Succ[8] Jump[11,11,3] Zero[5] Trans[1,12] Jump[2,12,13] Succ[12] Succ[5] Jump[12,12,9] Zero[17] Trans[8,13] Jump[13,17,25] Zero[16] Trans[5,14] Jump[13,14,22] Succ[14] Succ[16] Jump[14,14,18] Succ[9] Trans[16,13] Jump[17,17,15] Zero[6] Zero[20] Jump[9,6,40] Zero[7] Trans[1,21] Jump[20,7,36] Succ[21] Trans[21,19] Trans[19,21] Succ[7] Jump[7,7,30] Trans[21,18] Trans[18,20] Succ[6] Jump[6,6,27] Trans[20,4] Zero[10] Trans[4,15] Jump[2,15,47] Succ[15] Succ[10] Jump[15,15,43] Trans[9,1] Trans[10,2]
EDYCJA: usuwając nawiasy kwadratowe i skracając nazwy instrukcji:
URM 285
Z8 T2,11 J3,11,7 S11 S8 J11,11,3 Z5 T1,12 J2,12,13 S12 S5 J12,12,9 Z17 T8,13 J13,17,25 Z16 T5,14 J13,14,22 S14 S16 J14,14,18 S9 T16,13 J17,17,15 Z6 Z20 J9,6,40 Z7 T1,21 J20,7,36 S21 T21,19 T19,21 S7 J7,7,30 T21,18 T18,20 S6 J6,6,27 T20,4 Z10 T4,15 J2,15,47 S15 S10 J15,15,43 T9,1 T10,2
źródło
DOS-BATCH, 98
Wprowadź w osobnych wierszach
Bash, 51
Przykład:
sh prog.sh 2 0 -4
(argumenty rozdzielone spacjami)Perl, 84
Java, 297
Wejście oddzielone spacją, wyjście rozdzielone spacją.
SQL, 57
To smutny wpis, ale „po prostu” rozwiązuje cel. Zapytanie wiąże dane wejściowe w czasie wykonywania 1,2,3 są zmiennymi w kolejności wprowadzania.
źródło
bash
rozwiązanie, chciałem tylko zasugerować, że mogłeś usunąć wszystkie dodatkowe spacje i zapisać 6 znaków.Q, 36
stosowanie
źródło
Fortran 44
Dane wejściowe będą w jednym wierszu (oddzielone przecinkami lub spacjami)
Kaplica Crayów 59
Dane wejściowe będą w jednym wierszu, bez nowego wiersza (dodaj do tego 2 znaki, używając
writeln
zamiastwrite
).Golflua 44
Wejście rozdzielane znakiem nowej linii, wyjście rozdzielane spacjami
źródło
Julia, 71 znaków
Wejście i wyjście rozdzielane spacjami.
i,j,k=int(split(readline(STDIN)));println("$(l=div(k-j,j-i)) $(j-i*l)")
Przykładowe dane wejściowe i wyjściowe:
Piet,
866056 kodów (14x4), rozmiar kodu 10 dla lepszej widocznościMógłbym faktycznie zmniejszyć liczbę kodów o aż 35%. Nie spodziewałem się tak dobrego wyniku. Kodowanie tego programu wstecz było, jak się spodziewałem, całkiem udane. Wątpię, by mogło być krótsze niż to, ale byłbym naprawdę zainteresowany, gdyby ktokolwiek znalazł mniejsze rozwiązanie.
Wyzwanie nie określa, czy program musi się zatrzymać po wyświetleniu wyniku, więc mój najmniejszy program (56 kodów) powinien być poprawny. Po wyświetleniu wyniku po prostu zapętla się do początku, prosząc o nową triolę liczb całkowitych. Z powodu ciasnego upakowania nie ma miejsca na wyjście dwóch znaków nowego wiersza, ale nie jest to problem z interpreterem npiet, ponieważ zawsze wypisuje „?” jeśli oczekuje na wejście.
Istnieją dwa możliwe rozmiary, aby zbudować zapętloną wersję, ale wersja, która działa tylko raz, jest możliwa tylko w programie o rozmiarze co najmniej 64 kodeli (16 x 4). Poniższe wersje pokazują przyczynę. Może to również interesujące dla tych, którzy znają Pieta.
Ostatnia, najbardziej ciasno upakowana 56 wersja kodu z pętlą :
Druga wersja (60 kodów) z pętlą
Jeśli wersja 56 kodeli jest niezgodna z regułami, oto ostateczna wersja 64 kodela, działająca tylko raz :
Moja pierwsza wersja (86 kodów)
Dane wejściowe i wyjściowe są rozdzielane znakiem nowej linii.
Przykładowe dane wejściowe i wyjściowe:
W przypadku zapętlonych wersji wyglądają nieco brzydiej:
Wybrałem znak nowej linii jako separator, ponieważ kodowanie ASCII 10 (\ n) oczywiście wymaga tylko 7 koderów, w porównaniu do ASCII 32 (), który potrzebuje 8 koderów lub nawet ASCII 40 (,), który potrzebuje 9 koderów.
Kodowanie wstecz od wyniku do pierwszego wejścia jest świetnym sposobem na ograniczenie użycia kodera w operacjach ROL. Kolejność stosów na początku i na końcu jest znana, resztę można łatwo wykonać ręcznie.
Oto tekstowa wersja 64-programowego programu kodującego (ze stosem), w moim wymyślonym skrócie. Krótsze programy po prostu się nie kończą, ale wracają do początku.
źródło
MoonScript (48 znaków, wejście rozdzielane znakami nowej linii, wyjście rozdzielane znakami spacji)
Felix (86 znaków, znak rozdzielany znakiem nowej linii, znak rozdzielany przecinkami)
Julia (84 znaków, wejście rozdzielane spacjami, wyjście rozdzielane spacjami)
źródło
julia file.jl
ten sam błąd?