Biorąc pod uwagę rozdzieloną spacjami listę liczb całkowitych, Twoim zadaniem jest znalezienie następnej liczby całkowitej w sekwencji. Każda liczba całkowita, w sekwencji jest wynikiem nakładania pojedynczej operacji matematycznych ( +
, -
, *
i /
) do poprzedniej liczby całkowitej, a każda sekwencja składa się z szeregu zmiennych takich operacji (ale nie więcej niż 10). Żadna sekwencja nie będzie dłuższa niż połowa długości sekwencji liczb całkowitych, więc każda sekwencja operacji pojawi się co najmniej dwa razy w celu potwierdzenia.
Dane wejściowe będą przesyłane przez stdin (lub w prompt
przypadku rozwiązań JavaScript).
Oto kilka objaśniających przykładów.
Wejście:
1 3 5 7 9 11
Wynik:
13
Dość łatwe, tym razem. Wszystkie wartości są poprzednimi wartościami +2
.
Wejście:
1 3 2 4 3 5 4 6 5 7 6
Ouput:
8
Dwa kroki w tej kolejności, +2
a następnie -1
.
Wejście:
2 6 7 3 9 10 6 18 19 15 45 46
Wynik:
42
Trzy kroki - *3
, +1
, -4
.
Przypadki testowe
Oto kilka kolejnych przypadków testowych:
Wejście:
1024 512 256 128 64 32 16
Wynik:
8
Wejście:
1 3 9 8 24 72 71 213 639
Wynik:
638
Wejście:
1 2 3 4 5 2 3 4 5 6 3 4 5 6 7
Wynik:
4
Wejście:
1 2 4 1 3 9 5 8 32 27 28 56 53 55 165 161 164 656 651 652 1304
Wynik:
1301
Mam niefarmowane rozwiązanie Scala (42 linie), które opublikuję za kilka dni.
To jest golf golfowy - wygrywa najkrótsza odpowiedź.
Odpowiedzi:
Golfscript,
203138 znakówUżywa o wiele więcej
if
s niż standardowy program Golfscript, a jego działanie jest dość tajemnicze, więc oto skomentowana (ale nie odznaczona inaczej niż przez dodanie białych znaków i komentarzy) wersja:Moje oryginalne zgłoszenie zawierało 88 znaków:
Jednak to próbuje obliczyć operacje od pierwszego wystąpienia każdego z nich, więc jeśli operacja jest mnożeniem lub dzieleniem, a argument za pierwszym razem wynosi 0, łamie się.
źródło
Haskell,
276261259257243 znakówOto moje nieefektywne rozwiązanie. Działa na liczbach całkowitych nieograniczonych (i ograniczonych). To rozwiązanie działa poprawnie z nieprecyzyjnym podziałem (np
5 / 2 = 2
.:).Jak to działa: tworzę każdą możliwą sekwencję (możliwych) operacji. Następnie testuję sekwencję wejściową liczb, aby sprawdzić, czy wygenerowana sekwencja utworzy dane wejściowe. Jeśli tak, zwróć następny numer w sekwencji. Kod zawsze zwraca odpowiedź uzyskaną z najkrótszej sekwencji operacji. Dzieje się tak, ponieważ lista sekwencji operacji jest generowana w tej kolejności. Podejmowanie decyzji między więzami jest arbitralne (ale konsekwentne). Na przykład kod zwraca
6
lub8
dla sekwencji2 4
.Nie golfowany:
źródło
Control.Monad -> Monad
możliwe A cointeract$show.n.q read.words
Python,
333366...315303278269261246 znakówTworzy operację z pierwszą parą liczb i sprawdza ją na innych parach. Przechowuje wszystkie operacje, a jeśli wszystkie się powiedzą, stosuje odpowiednią operację na ostatnim elemencie listy.
Edytowano: zdał test zła :-) Teraz wyszukaj operację na wszystkich pozycjach.
źródło
0 0 1 2 3 6 7 14
0 0 0 0 1 0 0 0 0 1
nie wyświetla0
.lambda x:x+b-a
->(b-a).__add__
. Szkoda, że to tylko jedna postać, dzięki temu wiele się uczę o pythonie.l
niejawnie globalnej oszczędności wiele: pastie.org/2416407Python,
309305295279 znakówObsługuje wszystkie oryginalne przypadki testowe, a także poważny przypadek Petera Taylora
0 0 1 2 3 6 7 14
:Niegolfowane, z wyjściem debugowania (bardzo pomocne w weryfikacji poprawności):
Stosowanie:
źródło
v<1
działa jako strażnik.Rubinowy 1.9
(437)(521)(447)(477)Działa dla wszystkich przypadków testowych, w tym „złego”. Zagram w to później.
EDYCJA: Zdałem sobie sprawę, że jest inny przypadek, którego nie załatwiłem poprawnie - kiedy kontynuacja musi użyć operacji „tajemnicy”. Sekwencja
2 0 0 -2 -4 -6
początkowo zwracała 0 zamiast -12. Naprawiłem to teraz.EDYCJA: Naprawiono kilka innych przypadków krawędzi i zmniejszyłem kod do 447.
EDYCJA: Ugh. Musiałem dodać kod do obsługi innych „złych” sekwencji, takich jak
0 0 0 6 18 6 12
źródło
Scala
Oto rozwiązanie, które wymyśliłem:
Nie golfowany:
źródło
echo "0 0 1 2 3 6 7 14" | scala Sequence
utrzymuje czarny ekran.scala Sequence
a następnie wprowadź sekwencję i naciśnij enter.Scala 936
bez golfa:
Zawodzi żałośnie u Petera Taylora
h
, ale nie widzę możliwości uzdrowienia programu w rozsądnym czasie.źródło
-
jako szczególny przypadek+
i/
jako szczególny przypadek*
? Mój sposób na przekazanie danych Petera Taylora (i podobnych) polegał na odcięciu pierwszej liczby w sekwencji i ponownym spróbowaniu. Nie miałem czasu przyjrzeć się, jak działa twój program, aby wiedzieć, czy to pomogłoby w twoim.-1, 0, 0, 1, 2, 3, 6, 7, 14
będzie wymagała innego leczenia.