Dołączona gra liczb
Napisz funkcję / program, który pobiera 2 parametry całkowite parametry całkowite lub zmienne całkowite , numer początkowy i maksymalną liczbę iteracji. Kod powinien wykonać następujący przykład gry, aby skonstruować nowy numer i powtarzać, aż liczba pozostanie pojedynczą cyfrą. na przykład.
3 7 2 = (3 + 7) & (7 + 2) = 10 9
1 0 9 = (1 + 0) & (0 + 9) = 1 9
1 9 = (1 + 9) = 10
1 0 = (1 + 0) = 1
Zasadniczo, biorąc każdą indywidualną cyfrę i dodając ją do sąsiada, a następnie dołączając wynik następnego dodawania.
Maksymalna liczba iteracji ma na celu ochronę nieskończonych pętli, a gdy maksimum zostanie osiągnięte, kod powinien zrzucić ostatnie 5 kroków liczbowych. Ten sam wynik powinien wystąpić po zakończeniu osiągania jednej cyfry. Jeśli wystąpiło mniej niż 5 kroków, wypisz tylko prawidłowe liczby.
Dane wyjściowe powinny wyglądać jak ( Step: Number
), w tym ostatnie 5 kroków zakończonych lub zakończonych kroków:
func(3541, 50)
utworzy ten dokładny format wyjściowy:
6: 1411
7: 552
8: 107
9: 17
10: 8
func(3541, 5)
wyprodukowałby:
1: 895
2: 1714
3: 885
4: 1613
5: 774
Całe obliczenie to:
1: 895
2: 1714
3: 885
4: 1613
5: 774
6: 1411
7: 552
8: 107
9: 17
10: 8
Jeśli jest mniej niż 5 kroków, po prostu wydrukuj te kroki.
Używaj tylko wbudowanych bibliotek, parametry mogą pochodzić z dowolnego miejsca (co jest najłatwiejsze dla wybranego języka). Brak limitu maksymalnego rozmiaru liczby całkowitej, a jeśli występują przepełnienia, pozwól mu się zawiesić.
Biorąc pod uwagę, że nie jest to zbyt trudne z logicznego punktu widzenia, dam do niedzieli 25-tej, 20:00 (UTC + 8), aby wnioski zostały rozpatrzone pod kątem przyjętej odpowiedzi, w którym to momencie zwycięzcą będzie którykolwiek z najkrótszych języków.
EDYTOWAĆ:
Gratulacje dla Howarda, wygrywając z 48 GolfScript odpowiedź .
Wyróżnienie 2 miejsce marinus z 66 APL odpowiedź .
Moim osobistym ulubionym (nastawionym na JavaScript) była odpowiedź core1024 .
func(3541, 5)
wydrukować 5 kroków czy 10?Odpowiedzi:
GolfScript,
4846 znakówDziękuje Peterowi Taylorowi za ulepszenie dwóch postaci.
Oczekuje obu liczb na stosie. Wypróbuj online .
Przykłady:
źródło
.,,
i przekształcenie ostatecznej mapy w sprawiedliwą{': '*}%
.APL (66)
Lewy argument to maksymalna liczba iteracji, a prawy argument to liczba początkowa.
Wyjaśnienie:
∆←⍺{
...}⍕⍵
: przekaż lewy argument jako liczbę, a prawy argument jako ciąg do funkcji obliczającej listę liczb i zapisz ją w∆
:(1<⍴⍵)∧⍺>0:
: jeśli liczba cyfr jest większa niż 1, a liczba pozostałych iteracji jest większa niż0
:⍎¨⍵
: oceń każdą cyfrę2+/
: zsumuj każdą parę⍕¨
: sformatuj każdą liczbę jako ciąg∆←,/
: konkatenuj ciągi i przechowuj w∆
∆,(⍺-1)∇⊃∆
: return∆
, a następnie wynik zastosowania tej funkcji∆
z dozwoloną jedną iteracją mniej⋄⍬
: jeśli nie, zwróć pustą listę∆,⍪⍳⍴∆
: sparuj każdy element∆
z jego indeksem w∆
{
...}/
: dla każdej pary:(⍕⍵),': ',⍺
: zwraca ciąg z indeksem, po którym:
następuje, a następnie liczba↑¯5↑
: zamień listę ciągów w macierz, aby wyświetlały się w osobnych wierszach, i weź 5 ostatnich elementówTest:
źródło
3 {...} 3541
.:
pierwszym)Mathematica, 172 znaki
Jest to o wiele za długo, dzięki nazwom funkcji Mathematica i brzydkiej obsłudze napisów (rzeczywista „gra” to tylko 76 takich znaków), ale i tak:
Oczekuje liczby wejściowej w zmiennej
n
i maksymalnej liczby iteracji wm
.Mniej golfa:
źródło
Ruby, 106 znaków
Nie mam 100% jasności co do reguł wprowadzania, ale jeśli dam radę
n
jako ciąg, mogę zapisać 5 znaków, a jeśli mogę użyć predefiniowanych zmiennych i napisać program zamiast funkcji, mogę zapisać kolejne 9.Tworzy funkcję,
f
którą można wywołać w następujący sposób:f[3541, 6]
f[372, 50]
f[9999, 10]
źródło
J -
9692 charNajpierw rozwiązałem to, zakładając, że wszystkie gry się zakończyły, a to wróciło, by ugryźć mnie w tyłek podczas testów. Lewy argument to liczba kroków, prawy argument to pozycja początkowa, którą można podać jako liczbę lub ciąg znaków.
To jest trochę zbyt golfowe i zwojowe, by można było go z powodzeniem degolfować, więc powiem tak:
(<@>:@[(' '-.~[:,@":2+/\"."0@]^:)":)
Ta część uruchamia grę przez określoną liczbę kroków.2+/\
odpowiada za dodanie każdej pary cyfr oraz<@>:@[
w połączeniu z^:
kontrolkami przechwytującymi pośrednie etapy gry.(#\(,': '&,)&":"0,)@}.@({.~,i.0:)@:".
Ta część formatuje wszystkie wyniki jakostep: result
.({.~,i.0:)
upewnia się, że nie wykonujemy zbyt wielu kroków,#\
to liczby kroków, a(,': '&,)&":"0
bit dodaje dwukropek i spację.(-@(<.5<.#){.])
Ta część wycina odpowiednie pięć lub mniej kroków z pełnej listy.<.
oznacza „minimum”.Działa, ale jeśli zaczniesz od wystarczająco dużej liczby, wyniki gry szybko zaczną rosnąć, co powoduje, że J zmienia się z liczb całkowitych na nieprecyzyjne podwajanie. Oto kilka przykładów:
źródło
JavaScript 139
144 150Nie golfił
źródło
Perl,
8684Z nowymi liniami dla czytelności:
+ Edycja: Nie ma wymówki, aby nie używać
-n
przełącznika linii poleceń, a następnie wynik wynosi 82 = 81 + 1 :Możliwe, że przepełnienie liczb całkowitych jest w porządku, wynosi 81 = 80 + 1
źródło
JavaScript, 247
278288307znakówSformatowany
Edycja 1 : Usunięto trójkę
Edycja 2 : Odwrócona logika „pomijania” indeksu 0
Edycja 3 : Przerobiono wywołanie rekurencyjne.
Skrzypce
źródło
Bash + coreutils, 115 bajtów
Wynik:
źródło
JavaScript (wersja robocza ECMAScript 6) - 134 znaków
Przykłady:
źródło
JavaScript, 182 bajty
źródło
Perl,
166147138129 129 bajtówNie golfowany:
Mam nadzieję, że to w porządku, że drukuje kilka dodatkowych pustych linii, jeśli całość zajmuje mniej niż 5 kroków.
źródło
(('')x5, @o, "$i: $s")
się(@o, "$i: $s")
ijoin"\n", @o[-5..0]
zjoin"\n", @o[-5..-1]
. Będziesz wtedy o 3 bajty naprzód;)Java
524405365 znaków [414 bajtów]Wersja golfowa:
class A{static int n=0;List<String> s=new ArrayList<>();void c(int b,int r){String d=b+"";if(r==0||b <= 9){int m=s.size();for(int i= m>=5?m-5:0;i<m;i++)System.out.println(s.get(i));return;}String l="";for(int i=0;i<d.length()-1;i++)l+=d.charAt(i)+d.charAt(i+1)-96;s.add(++n+":"+l);c(Integer.valueOf(l),--r);}public static void main(String[] a){new A().c(3541,50);}}
Wersja do odczytu:
źródło
chatAt
metodyInteger.valueOf(digits[i] + "") + Integer.valueOf(digits[i + 1] + "");
możesz(digits[i] + digits[i+1] - 96)
JavaScript 133 bajty
Nie golfowany:
źródło
Java, 341 znaków
371 znakówSformatowany:
Dzięki user902383 mogłem zredukować kod o 30 znaków, nie dzieląc łańcucha na tablicę przy użyciu -96 zamiast „Integer.valueOf ()
źródło
class a{public static void main(String[] a) {p(3541, 50);}static void p(int n,int k){Queue<String> q=new LinkedList();int c=0;while(n>9&&c<k){c++;String r="";String p=""+n;for(int i=0;i<p.length()-1;i++)r+=((p.charAt(i)+p.charAt(i+1)-96));n=Integer.parseInt(r);q.add(c+": "+n);if(q.size()>5)q.remove();}for(String s:q){System.out.println(s);}}}
Dart,
602588 bajtówDart jest prawdopodobnie jednym z najgorszych języków, w którym można to zrobić ... Muszę znaleźć lepszy sposób, aby to zrobić.
Tak czy inaczej, oto mój wpis:
Wejście przez konsolę
I nieprzygotowana, nieco nieupoważniona wersja:
źródło
PERL
135 129/125125/121 bajtówMa ten sam błąd co odpowiedź Tal
Edytuj 129 bajtów jako funkcję:125 bajtów jako funkcja:125 bajtów jako skrypt konsoli (bez skrótu):121 bajtów jako skrypt konsoli (bez skrótu):
Rozszerzony:
Testuj z
c(372,4);
:Testuj z
c(3541,50);
:źródło
C # - 269
Czytelny:
Stosowanie:
Wynik:
źródło
Kobra - 363
Dość przygnębiający wynik ... ale hej, wciąż pokonuję Javę.
W praktycznych przypadkach testowych powinien być odporny na przepełnienia liczb całkowitych.
źródło
Python 2.7,
174173158 znakówUżywanie wielu ciągów do wykonania zadania.
Python 2.7, 155 znaków
Wersja definiująca funkcję
Wersja lekko nie golfowa:
źródło
Haskell, 154
przykładowe użycie:
Aby uczynić go bardziej czytelnym, użyj
putStr
:źródło
putStr $ 3541#50
to porównać z przykładem PO. W przeciwnym razie cieszę się, że jest tu facet Haskell.Groovy -
191182 znakówNa podstawie rozwiązania Thomasa Rüpinga przeniesionego do Groovy 2.2.1:
Wykonanie i wyjście:
Nie golfowany:
źródło
** C
186179174 **Nieco mniej golfa (mini-golfa?)
Wystarczy przydzielić wystarczającą ilość pamięci, aby cyklicznie przechowywać pięć wyników. Pętla zewnętrzna trwa, dopóki nie osiągniemy limitu lub nie osiągniemy jednej cyfry. Pętla wewnętrzna dodaje ostatnią cyfrę liczby do ostatniej cyfry 1/10 liczby i dodaje ją, pomnożoną przez odpowiednią moc 10 do wyniku. Podziel pierwszą liczbę przez 10 i powtórz, aby uzyskać sumę. Następnie wydrukuj do pięciu ostatnich wyników.
Kolejnym wyzwaniem jest sprawdzenie, czy uda mi się wygolić na tyle, by pokonać golfa w językach skryptowych.
Edycja: Teraz kompiluje się z ostrzeżeniem, ale pięć znaków zostało zgolonych przez usunięcie deklaracji „void”
źródło
C # -
309330320306 bajtówWersja do gry w golfa:
Zastosowanie: F (3541,50);
Wersja bez golfa dla czytelności:
Sugestie dotyczące ulepszeń są zawsze mile widziane! ;)
Edycja: Usunięto String.Empty i zastąpiono go „”, aby zapisać 10 bajtów.
Edycja 2: Dzięki Malik za napiwek ze sznurkami!
źródło
.ToCharArray()
. Tablica = łańcuch znaków.ToString()
zrobić+""