Wyzwanie polega na napisaniu programu lub skryptu, który zlicza sumę wszystkich cyfr w liczbach całkowitych od 1 do podanej liczby włącznie.
Wejście, jedna dodatnia liczba całkowita. Dane wyjściowe, suma cyfr w tej liczbie i wszystkie mniejsze liczby.
Przykłady:
Input: 5
Integer Sequence: 1, 2, 3, 4, 5
Sum of Digits: 1 + 2 + 3 +4 + 5 = 15
Input: 12
Integer Sequence: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
Sum of Digits: 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 1 + 0 + 1 + 1 + 1 + 2 = 51
Żeby było jasne, należy policzyć sumę cyfr - nie liczb całkowitych. W przypadku danych jednocyfrowych będzie to samo. Jednak dane wejściowe większe niż 10 będą miały różne odpowiedzi. To byłaby niepoprawna odpowiedź:
Input: 12
Output: 78
Kolejny przykład, aby pokazać różnicę:
Input: 10
Integer Sequence: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Sum of Integers (INCORRECT RESPONSE): 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55
Digit Sequence: 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 0
Sum of Digits (CORRECT RESPONSE): 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 1 + 0 = 46
Większy przypadek testowy (PRAWIDŁOWA REAKCJA):
Input: 1000000
Output: 27000001
Zasady i wytyczne:
- Przesłany kod musi być kompletnym programem lub skryptem, a nie tylko funkcją. Jeśli kod wymaga uwzględnienia, importu itp., Należy je uwzględnić w opublikowanym kodzie.
- Numer musi być wprowadzony przez użytkownika - nie zakodowany na stałe. Dane wejściowe mogą być odbierane jako argument wiersza polecenia, plik, standardowe wejście lub dowolny inny sposób, za pomocą którego Twój język może przyjmować dane wprowadzone przez użytkownika.
- Kod musi być w stanie poprawnie obsługiwać dane wejściowe przynajmniej do
(2^64)-1
. - Kod powinien wypisywać tylko sumę.
- Przesłane programy i skrypty powinny być przyjazne dla użytkownika i nie marnować zasobów komputerowych (np .: nie powinny zadeklarować niesamowicie dużych tablic, w których zmieści się każda postać). Nie ma za to ścisłej premii ani kary, ale bądźcie dobrymi programistami.
Punktacja:
Podstawowym mechanizmem oceniania jest długość kodu. Niższe wyniki są lepsze. Obowiązują również następujące premie i kary:
- -25 Bonus, jeśli Twój kod obsługuje wszystkie liczby dodatnie, na przykład:
1234567891234567891234564789087414984894900000000
- -50 Premia, jeśli Twój kod obsługuje na przykład proste wyrażenia
55*96-12
. Aby kwalifikować się do tej premii, kod powinien obsługiwać+ - / *
(dodawanie, odejmowanie, dzielenie, mnożenie) operatorów i egzekwować kolejność operacji. Podział to zwykły podział na liczby całkowite.- Podany przykład (
55*96-12
) ma wartość5268
. Twój kod powinien zwrócić to samo dla każdego z tych danych wejściowych - poprawna odpowiedź to81393
.
- Podany przykład (
- Bonus -10, jeśli twój kod kwalifikuje się do premii -50 i może obsłużyć
^
operatora (wykładnik). - Bonus -100, jeśli twój kod kwalifikuje się do premii -50 i nie używa
eval
ani nie obsługuje podobnych wyrażeń. - +300 Kara, jeśli twój kod opiera się na jakichkolwiek zasobach sieciowych.
55*96-12
wrócić?Odpowiedzi:
Perl 6: 108 - (25 + 50 + 100) + 0 = -67 punktów
Rozwiązanie w golfa (ostatnia linia oparta na świetnym rozwiązaniu xfix ):
Rozwiązanie bez gry w golfa:
Etap oceny przez powtarzanie pracuje nad każdym symbolem
*
,/
,+
,-
, znalezienie kiedy która leży pomiędzy dwiema liczbami całkowitymi, i podstawiając że korzystając z funkcji, która reprezentuje symbol.Bardziej szczegółowo: pobiera każdy symbol (np.
+
) I funkcję infix, którą powinien reprezentować (np.&[+]
Która jest skrótem&infix:<+>
i ta sama funkcja, którą wywołuje Perl 6 podczas wykonywania1 + 2
) i dokonuje globalnego podstawienia (s:g[…] = …
podobnie jak Perl 5s/…/…/ge
), który dopasowuje dwie liczby całkowite oddzielone symbolem ((\d+) $sym (\d+)
) i zastępuje je wynikiem funkcji odpowiadającej infiksowi wywołanemu tymi liczbami całkowitymi (infix($0, $1)
).Wreszcie, to ocenione wyrażenie jest wprowadzane
say [+] (1..$expression)».comb
, co xfix bardzo dobrze wyjaśnia w swoim rozwiązaniu .Przepraszam za spóźnienie na imprezę ☺
EDYCJA: Usunięto obsługę wykładników; i tak miał dokładnie 10 znaków i nie działał prawidłowo.
źródło
my $g
możesz chcieć użyć czegoś wcześniej zadeklarowanego (myślę, że to$!
może działać, ale nie przetestowałem).my$g=get;for <* / + -> {$g~~s:g[(\d+)$^s(\d+){}]=infix:[$^s] |@()};say [+] (1..$g)».comb
Spowodowałoby to obniżenie wyniku do 88 znaków lub -97 punktówMathematica 30- (10 + 50) = -30
Skrócone o 4 znaki dzięki Ybeltukovowi.
Range@n
zwraca liczby od 1 don
.Integerdigits@n
dzieli każdą z tych liczb na cyfry.Total[n,2]
sumuje cyfry. 2 ma umożliwić sumowanie na różnych poziomach, tj. Listach list.Testowanie
Wyrażenia
źródło
Tr@Flatten
może być zmniejszona doTotal[...,2]
:IntegerDigits@Range@#~Total~2&
.C:
150138 - (100 + 50) = -12Bardzo haniebnie kradnie @Fors odpowiedź stąd, aby dokonać oceny wyrażenia: https://codegolf.stackexchange.com/a/11423/13877
Przykładowe użycie:
Uwaga: implementacja wyrażenia nie przyjmuje pierwszeństwa operatora i zużywa wartości w momencie ich otrzymania; np.
1+2*3 = 9
zamiast typowego7
.źródło
sed,
411283–25 = 258Nie mogę się teraz przejmować golfem. :-) Nie zaleca się używania nawet z zdalnie dużymi liczbami całkowitymi, ale technicznie może poradzić sobie z dowolnie dużymi liczbami całkowitymi (prawdopodobnie zabraknie pamięci RAM dość szybko, ponieważ (mniej lub bardziej muszę) kodować liczbę w unary).
Przykładowe użycie
(Wcięte linie wejściowe dla łatwiejszego czytania.)
źródło
python, 55- (50 + 25 + 10) = -30
Nieefektywny, ale krótszy, a także zdolny do obsługi wyrażeń.
EDYCJA: Dzięki Wolframh i legoStormtroopr za sztuczki: D
python, 149- (25 + 50 + 10) = 64
Moja pierwsza wersja
wkład:
wydajność:
źródło
xrange
rozwiązanie na1234567891234567891234564789087414984894900000000
xrange
: Deval(raw_input())
przezinput()
.while
Pętla może byćwhile t:s+=sum(map(int,
t));t-=1
.input()
zamiasteval(raw_input())
, jakinput
jużeval
jest to wyrażenie! Oznacza to, że możesz uzyskać -10 binus za symbol mocy i bonus -100 za nieużywanieeval
!!!eval
i podobne , więc myślę, że -100 nie będzie się liczyćPython - 108 znaków minus 85 bonusów, 23 uderzeń, obsługuje bardzo, bardzo duże nakłady
Większość z tych rozwiązań wydaje się zapętlać wszystkie liczby całkowite mniej niż dane wejściowe i sumować wszystkie swoje sumy cyfr. To działa, ale czuję, że to nieeleganckie, i zapytałbym, czy naprawdę kwalifikują się do premii za 25 punktów, ponieważ nie sądzę, aby byli w stanie poradzić sobie z wkładem
1234567891234567891234564789087414984894900000000
w ciągu naszego życia. Rzeczywiście, po wprowadzeniun
cyfr rozwiązania te wymagająO(10^n)
czasu. Zamiast tego postanowiłem rzucić trochę matematyki na ten problem.Zbiór wszystkich
x
cyfr jest izomorficzny w tym zbiorze{0,1,2,3,4,5,6,7,8,9}^x
. Na stałe(n,sig)
sąx
różne wartościsig
,10^x-1
punkty zsig
-tego zestawu do indeksun
, a suma wszystkich cyfr0-9
jest 45. To wszystko jest obsługiwane przezf
.g
jest coś, co prawdopodobnie wszyscy znamymagic
pobiera wszystkie cyfry z liczby wejściowej i iteruje je od najmniej do najbardziej znaczącej. Powiedzmy, że najłatwiej jest to wyśledzić za pomocą przykładowego wejścia1,234,567
.Aby poradzić sobie z zakresem
1,234,567-1,234,560
, musimy dodać wszystkie cyfry od1
do7
i dodać7
sumę razy sumę pozostałych cyfr, aby poradzić sobie ze wszystkimi liczbami większymi niż1,234,560
. Teraz musimy zająć się resztą.Aby poradzić sobie z zakresem
1,234,560-1,234,500
, dodajemy6
(val
) i upuszczamy górny limit do1,234,559
. Wykonując pozostałą część kropli, zobaczymy każdą cyfrę 6 razy (val*f(sig)
). Zobaczymy wszystkie liczby od dokładnie0
do każdego ( ). Zobaczymy wszystkie pozostałe cyfry w tej liczbie dokładnie 60 razy ( ). Mamy teraz do czynienia ze wszystkimi liczbami ściśle większymi niż . Ta sama logika będzie stosowana indukcyjnie we wszystkich znaczeniach.5
10
(10**sig)*g(val-1)
(val*10**sig)*sum(digits[sig+1:])
1,234,500
Gra w golfa dzięki WolframH ogranicza to rozwiązanie do
I suma cyfr sum wszystkich liczb całkowitych do
1234567891234567891234564789087414984894900000000
jest265889343871444927857379407666265810009829069029376
Największa liczba, jaką udało mi się rzucić w wersji golfowej, to 10 ^ 300, w którym to momencie liczby zmiennoprzecinkowe zaczynają się przepełniać, a niestabilność numeryczna zaczyna powodować problemy. Dzięki funkcji szybkiego potęgowania potęgi kwadratowej i mnożenia problem ten zniknąłby.
A wsparcie LaTeXa byłoby naprawdę przydatne ...
źródło
2.65889343871e+50
, co jest zmiennoprzecinkowe przybliżenie rzeczywistego rozwiązania. Najwyraźniej wydrukowałeśint(t)
zamiastt
w podanym kodzie. To jest złe; prawdziwym rozwiązaniem jest265889343871444899381999757086453238874482500000214
. Po prostu unikaj używania pływaków, tj. Zamień**(x-1)
na krótszy**x/10
.d
(ponieważ jest używana dwukrotnie). Eliminując pozostałe (i używając niektórych lew) dochodzimy dod=map(int,str(input()))\nprint sum(v*(10**s*((v-1)/2+sum(d[:~s]))-~s*9*10**s/2)for s,v in enumerate(d[::-1]))
(108 znaków). Działa dobrze na wejściach o dowolnym rozmiarze (jakint("1"*1000)
).10**-1
jest0.1
i od tego momentu wszystko zamienia się w pływaki.1/10
jest0
(dzielenie liczb całkowitych) i wszystko może pozostaćint
s.TI-BASIC, 137 - (50 + 10 + 100) = -23
Input obsługuje liczby do
1E100
i automatycznie ocenia. Obsługuje wyrażenia.Chociaż jest to niesamowicie duża tablica, nie marnuję zasobów komputerowych (uruchamiane z kalkulatora ).
źródło
eval
powinna być pobierana.Scala 66
źródło
C
7774C
150150–25 = 99Oto alternatywna wersja, która technicznie powinna kwalifikować się do premii 25 za „dowolną” dodatnią liczbę całkowitą, ale jest niepraktycznie wolna, ponieważ algorytm ma czas liniowy na wejściu. Niezależnie od tego fajnie było pisać. Ręcznie odejmuje liczbę odczytaną jako znaki ASCII. Ta wersja ma 150 znaków. (Teraz z okropnym, porywającym argumentem, zapętlonym kodem!)
C
229224 - (50 + 100) = 74Zmiana obsługi wyrażeń. Operator wdraża pierwszeństwo według typowych zasad:
/ * - +
. Ograniczony do 97 tokenów = 48 warunków.źródło
GolfScript 18-50 = -32
Objaśnienie: Załóżmy, że dane wejściowe to „12”:
Stos jest
[0,1,2,3,...,12]
.Stos jest
"01234...9101112"
.Stos jest
"0 1 2 ... 1 0 1 1 1 2"
.Stos jest
[0,1,2,...,9,1,0,1,1,1,2]
.Stos wynosi 51, zgodnie z życzeniem.
Dane wejściowe mogą być dowolnym poprawnym wyrażeniem GolfScript, które może zawierać wykładniki wykładnicze. Na przykład:
Od
2(5 + 5) - 8 = 12
. Myślę, że powinno to kwalifikować się do premii, ale być może oczekiwano, że będzie to tylko w normalnej formie, a nie odwrotna polska notacja GolfScript.źródło
^
??
^
, nie?
lubpow
itd.Rubin, 37-50 = -13
Podwójna ewolucja na całej przestrzeni nieba! Podobnie jak w przypadku innych rozwiązań Ruby, myślę, że teoretycznie powinno to być w stanie pracować z dowolnie dużymi liczbami, ale czas wykonania byłby ... tragiczny.
Starsza wersja (49-50 punktów)
Zakładając, że premia za 10 postaci faktycznie wymaga, aby postać potęgowała się jako karetka, najkrótszym sposobem, jaki mógłbym dodać, jest:
Który kosztuje więcej postaci niż dałby bonus.
źródło
p"#{[*1..eval(gets)]}".chars.map(&:to_i).inject :+
&
prawie w golfie. W rzeczywistości, nie trzeba przestrzeń pomiędzyinject
i:+
obaj.Perl 6 (28 - 75 + 0 = -47 bajtów)
Może obsłużyć wszystkie liczby dodatnie (jednak duże zajmą dużo czasu, ponieważ obecnie implementacje Perla 6 są powolne, ale Perl 6 obsługuje natywnie duże liczby całkowite). Używa
eval
, aby zaimplementować prosty kalkulator (warto pięć kar za pięćdziesiąt znaków). Jest powolny tylko dlatego, że obecne implementacje są powolne, ale teoretycznie powinien być wystarczająco szybki (to znaczy, gdy poprawia się implementacja Perla 6). Co zaskakujące, wygrywam z Mathematica (na razie).»
w tym kodzie faktycznie nie jest potrzebny, ale umieszczam go tutaj ze względu na wydajność (w przeciwnym razie program przydzieli cały ciąg. Powodem jest to, że Perl 6 nie ma nieskończonych ciągów, ale ma nieskończone listy.W każdym razie możesz zapytać, jak działa ten kod. Cóż, przekażę to część po części.
get.eval
Pobiera jedną linię (
get
funkcję) i ocenia ją (eval
metoda).1..get.eval
Następnie Perl 6 przygotowuje obiekt zakresu, od
1
do wartości oszacowanej. Jest to zakres, więc nic wielkiego nie jest przydzielane.».comb
.comb
Metoda dzieli ciąg na znaki ( chyba że wywoływany jest z argumentem ). Na przykład'cat'.comb
zwraca'c', 'a', 't'
.»
mapuje elementy listy, więc.comb
jest uruchamiany na każdym elemencie - nie tylko na samej liście (na przykład(4, 9)».sqrt
daje2, 3
). To także nie przydziela więcej niż potrzeba, ponieważ Perl 6 ma nieskończone listy (na przykład Haskell).»
znak faktycznie nie jest potrzebny, ponieważ.comb
można go użyć bezpośrednio na liście, ale wiąże się to z niejawnym przymusem ciągów (a Perl 6 nie ma nieskończonych ciągów, więc marnuje to pamięć). Na przykład1, 2, 3
lista po konwersji na ciąg znaków zwraca1 2 3
. W przypadku Perla 6 spacja jest idealnie drobną liczbą, oznaczającą 0, więc kod działałby nawet przy takiej konwersji. Jednak nadużyłoby to zasobów komputerowych.[+]
Jest to operator redukcji. Zasadniczo
[]
w tym przypadku możesz użyć operatora+
. Tablicy Po redukcji operator jest zmniejszona, co[+] 1, 2, 3
jest1 + 2 + 3
, co jest6
. Perl 6 używa oddzielnych operatorów liczb i ciągów, więc nie będzie uważany za konkatenację.say
Na koniec
say
wyświetla wynik. W końcu chcesz zobaczyć końcowy wynik, prawda?źródło
[+] 1,2,3,4,5,6,7,8,9,10
czy1+2+3+4+5+6+7+8+9+10
mam rację?>
można go łączyć w łańcuchy, więc tak3 > 2 > 1
jest. Ta sama właściwość ma zastosowanie do operatorów zmniejszających, więc[>] 3, 2, 1
nadal jest prawdziwa, ponieważ oznacza3 > 2 > 1
-[>]
może być użyta do ustalenia, czy liczby są w kolejności malejącej.get.Int
zamiasteval
? Czy potrzebuje wyrażeń matematycznych?sort
bez argumentu metody porównania).Perl 31 - Brak bonusów
Przykładowe dane wyjściowe:
Perl 5 z
-p
, 50 - 28 bajtów: -22Wypróbuj online!
źródło
J, 22
Wyjaśnienie
Ocena przebiega od prawej do lewej.
źródło
+/,10#.inv>:i.
byłoby krótsze. Ale wciąż jest to funkcja, a nie kompletny program, o co poprosił OP.R, 64 - (50 + 10) = 4
Po uruchomieniu tego użytkownik jest proszony o wprowadzenie danych.
Stara wersja (nie obsługuje wyrażeń): 46 znaków:
źródło
u<-function(x) utf8ToInt(x)
i tak dalej.u <- utf8ToInt
bezfunction
. Może to być pomocne dla kodu golfa, jeśli funkcja jest używana wielokrotnie.Rcheatcodegolf
pakiet, czy legalne jest korzystanie ze wstępnie zdefiniowanych funkcji w tym pakiecie? :-)Partia - (181–50) - 131
Dla odrobiny zabawy.
Sprawię, że będzie trochę bardziej czytelny:
Stara metoda używa pętli for do uzyskania danych wyjściowych polecenia powershell, w przeciwieństwie do zapisywania i odczytywania plików:
Ustaw dane wejściowe na zmienną -
v
- za pomocą,/a
aby zaakceptować wyrażenia arytmetyczne.Niestety konieczne było włączenie opóźnionego rozszerzenia.
Użyj pętli for, aby policzyć od 1 do wprowadzonej wartości -
v
.Aby obsłużyć liczby większe niż 9, musiałem użyć programu PowerShell, aby uzyskać długość łańcucha, a następnie użyć innej pętli for, aby podzielić ten łańcuch i dodać go do sumy -
s
.Państwo mogłoby zmienić nazwę
powershell.exe
nap.exe
podstawie katalogu C: \ WINDOWS \ System32 \ WindowsPowerShell \ v1.0 \ następnie wywołać ją tylkop "&{'%%a'.length-1}
, oszczędność 9 bajtów. Ale to nie jest w duchu tego.Zostawiłem ten drugi z rzędu podczas przerwy na lunch.
Naprawdę nie mogę przetestować go z liczbami, które mają zbyt dużo większy niż ten ze względu na powolny jak to jest. Powinno to jednak działać w przypadku dość dużych liczb.
2147483647
to największa liczba, jaką zajmie (maksymalnie 32-bitowa liczba całkowita) przed wystąpieniem następującego błędu -To oczywiście dyskwalifikuje mnie z wyzwania.
źródło
v
i używać jej%1
bezpośrednio. 2. Możesz odjąć 1 w skrypcie PowerShell, a nie od@set /a b=%%b-1
długości, co oszczędza ci sporo. Po tych zmianach mam go do 211 z oryginalnego 240. :-)[decimal]
typ pozwala na wartości do (2 ^ 96) -1.Dyalog APL , 9–160 * = -151
Wypróbuj online!
⎕
uzyskać oceniany wkład,np.
"7+5"
daje12
⍳
wskaźniki 1 ... n[1,2,3,4,5,6,7,8,9,10,12]
⍕¨
sformatuj każdą liczbę w łańcuch["1","2","3","4","5","6","7","8","9","10","11","12"]
∊
zaciągnąć się (spłaszczyć)"123456789101112"
⍎¨
wykonać każdy znak (zwraca listę liczb jednocyfrowych liczb)[1,2,3,4,5,6,7,8,9,1,0,1,1,1,2]
+/
suma51
* Punktacja
-50 premii, ponieważ akceptuje nawet wyrażenia jako dane wejściowe. Wyrażenie musi być poprawnym APL, co jest dopuszczalne zgodnie z OP .
-10 premii, ponieważ ponieważ obsługuje również
^
(*
w APL).-100 premii, ponieważ wprowadzanie wyrażeń jest obsługiwane bez jawnego użycia
eval
(tj.⍎
W APL).źródło
eval
ani nie obsługuje podobnych wyrażeń. ” Ponieważ⍎¨
wydaje się, że każdy znak wykonuje się jeden po drugim, jest trochę taki sam jak eval (z wyjątkiem, że wykonuje znaki jeden po drugim zamiast wszystkich w tym samym czasie, jakeval
robi).⍎¨
służy tylko do konwersji cyfr na liczby całkowite, a nie do obsługi wyrażeń.⎕
rodzaj wbudowanej funkcji eval + input, czy eval jest zawsze wykonywany domyślnie, gdy wprowadzane są wyrażenia?⎕
zawsze przyjmuje wyrażenie jako dane wejściowe, ocenia je i zwraca wynik. Aby wprowadzić ciąg znaków, musisz umieścić wokół niego cudzysłowy. Fakt, że powiązana wbudowana⍞
funkcja ( ) zwraca dane wejściowe jako nieprzetworzony tekst, nie powinien mieć znaczenia (zwłaszcza, że symbole wskazują, że⎕
jest to podstawowa metoda wprowadzania danych i⍞
jest specjalnym wariantem), ponieważ w przeciwnym razie uzyskanie premii wymagałoby zastosowania matematyki ewaluator - zupełnie inne zadanie niż główne. Nie lubię bonusów, a -100 jest po prostu głupi lub miał na myśli APL, ale imho, wydaje się, że pasuje dokładnie do premii.⎕
rzeczywiście jest to normalny sposób na uzyskiwanie danych wejściowych i automatyczne przetwarzanie wyrażeń, to naprawdę uważam, że pasuje również do premii, więc daj +1 ode mnie. W dzisiejszych czasach bonusy są głupie, ale dobry sposób na ich wykorzystanie w celu zminimalizowania twojego wyniku.C # (161)
Ładny
źródło
Python3 + Bash (78-185 = -107)
Jeśli wynik wyrażenia nie jest liczbą całkowitą, najpierw zostanie obcięty. Jeśli wynik wyrażenia jest ujemny, wynik jest niezdefiniowany.
Używaj go jak:
1: chyba że policzysz wywoływanie Pythona z Bash jako takiego, ale nie sądzę, że tak jest. Jeśli uważasz, że tak jest, skorygowany wynik to -7.
źródło
Java, 254
Obsługuje wyrażenia. Podaj dowolne wyrażenie w celu. Uchwyty do momentu, aż długość będzie w stanie wytrzymać. Jeśli posprzątasz usuwając wszystkie spacje w jednym wierszu i nie ma instrukcji do wydrukowania, liczy się ona do 254 znaków (biorąc pod uwagę programowanie Java oparte na długich słowach).
PS: To kompletny program, nie tylko logika. Liczba słów podanych dla programu, nie tylko logiki.
źródło
Java (JDK8), 272
Moje pierwsze wyzwanie, w którym jestem, sugestie są mile widziane =)
Zębaty:
źródło
CJam, 9-25 = -16
CJam jest kilka miesięcy młodszy od tego wyzwania, więc nie kwalifikuje się do zielonego znacznika wyboru. Co więcej, to nie bije Perla. ;) Podobało mi się to podejście, więc i tak chciałem je opublikować.
Sprawdź to tutaj.
Chodzi o to, aby utworzyć zakres od 0 do N. Ten zakres jest następnie konwertowany na ciąg znaków, który po prostu łączy liczby całkowite z powrotem do tyłu. Za N = 12 dostalibyśmy
Następnie każdy znak jest konwertowany na liczbę całkowitą za pomocą
:~
(uzyskując tablicę liczb całkowitych), a następnie sumowany za pomocą:+
. CJam radzi sobie z dowolnie dużymi liczbami całkowitymi.źródło
Python 3 + astor ,
10171007 bajtów - (25 + 50 + 100) = wynik:842834zapisano 10 bajtów, usuwając
ts
i zmieniającp
edycja: Nie jestem w stanie przetestować absurdalnie długiej liczby całkowitej (1234567891234567891234564789087414984894900000000) [zawiesza mój komputer], ale z mojej wiedzy, Python 3 obsługuje dowolnie długie liczby całkowite.
To wdrożenie
wykorzystujenadużywa AST. Nie uważałbym nadużywania AST za „ewaluacyjny lub podobny”.Zbyt leniwy, by pisać bez golfa, więc dam ci wyjaśnienie klas:
Ostatni wiersz po prostu wykonuje te klasy w odpowiedniej kolejności na wejściu, aby zachować kolejność operacji i zapobiec niepożądanemu zachowaniu.
Przykładowe użycie ($ lub> oznacza dane wprowadzane przez użytkownika), a przy okazji, rzeczywisty program pobiera dane tylko raz:
źródło
C # (108)
Ładny
źródło
int
s; w C wszystko jest domyślnie ustawione naint
... Och, to C #.Rubin -> 83-50 = 33
Wersja „Aby przetestować”:
Testuje wyniki
źródło
C # (80)
To moja kolejna próba.
Ładny
źródło
n--
i+
potrzebne? Nie sądzę, że jest w innych językach w stylu C.2^64-1
nie pasuje do 64 bitów.4.5
; 2) średnia suma 20 cyfr wynosi90
(2^64
ma 20 cyfr); więc oczekiwana wartość będzie w pobliżu90 * 2^64 ≈ 1.66*10^21
. Potrzebujesz co najmniej71
bitów72
.Ruby 69-50 = 19 (lub -4)
Z pewnością można razem grać w golfa, ale oto
pierwszapiąta próbaDziała również dla wszystkich liczb, ale jest dla nich bardzo wolny, ponieważ działa wolniej niż O (n), więc nie dodałbym -25. Jeśli powolność jest w porządku, to byłoby -4 chociaż
Rubin 133–50–25 = 58
Jest to szybsza wersja, która działa w czasie krótszym niż O (n) (i wykorzystuje rzeczywistą matematykę!), Więc może zapewniać szybkie wyniki dla dużych liczb całkowitych, dlatego dodałem -25:
źródło
Haskell, 74–25 = 49
main=getLine>>=print.sum.map(\c->read[c]).concatMap show.(\x->[0..x]).read
źródło
interact
i fakt, że>>=
dla list jest taki samflip concatMap
, możeszmain=interact$show.sum.map(\c->read[c]). \x->[0..read x]>>=show
\c->read[c]
jestread.(:[])
ECMAScript 6, 86-50 = 36
źródło
for(i=eval(prompt(s=""));i;s+=i--)alert(s.replace(/\d/g,c=>Array(-~c).join()).length)
..join()
)for(i=eval(prompt(s=""));i;s+=i--)alert(s.replace(/\d/g,c=>Array(-~c)).length)
. 78-50 = 28 !R (72 punkty)
Wydajność:
źródło