Biorąc pod uwagę skończoną sekwencję arytmetyczną dodatnich liczb całkowitych z niektórymi terminami usuniętymi ze środka, zrekonstruuj całą sekwencję.
Zadanie
Rozważmy ciąg arytmetyczny: listę dodatnich liczb całkowitych, w których różnica między dowolnymi dwoma kolejnymi elementami jest taka sama.
2 5 8 11 14 17
Załóżmy teraz, że z sekwencji usunięto jedną lub więcej liczb całkowitych, z zastrzeżeniem następujących ograniczeń:
- Usunięte liczby całkowite będą kolejnymi warunkami sekwencji.
- Pierwsza i ostatnia liczba całkowita w sekwencji nie zostaną usunięte.
- W sekwencji pozostaną co najmniej trzy liczby całkowite.
W powyższej kolejności możliwe usunięcia obejmują:
2 5 8 14 17 (removed 11)
2 5 17 (removed 8 11 14)
2 14 17 (removed 5 8 11)
Twoje zadanie: Biorąc pod uwagę jedną z tych częściowych sekwencji, zrekonstruuj oryginalną pełną sekwencję.
Detale
Możesz założyć, że dane wejściowe są prawidłowe (ma rozwiązanie) i brakuje co najmniej jednego terminu. Wszystkie liczby w sekwencji będą dodatnimi (> 0) liczbami całkowitymi. Sekwencja może mieć dodatnią lub ujemną różnicę między warunkami (tzn. Może rosnąć lub maleć). To nie będzie stała sekwencja (np 5 5 5
.).
Twoje rozwiązanie może być pełnym programem lub funkcją . Każda z domyślnych metod wejścia i wyjścia jest akceptowalna.
Dane wejściowe i wyjściowe mogą być ciągiem (z dowolnym rozsądnym ogranicznikiem), listą ciągów lub listą liczb. Możesz reprezentować liczby w dowolnej bazie dogodnej dla twojego języka.
W zgłoszeniu należy podać wszelkie nietypowe metody / formaty We / Wy, aby inni mogli łatwiej przetestować kod.
Przypadki testowe
In: 2 5 8 14 17
Out: 2 5 8 11 14 17
In: 2 5 17
Out: 2 5 8 11 14 17
In: 2 14 17
Out: 2 5 8 11 14 17
In: 21 9 6 3
Out: 21 18 15 12 9 6 3
In: 10 9 5
Out: 10 9 8 7 6 5
In: 1 10 91 100
Out: 1 10 19 28 37 46 55 64 73 82 91 100
To jest golf golfowy ; najkrótsza odpowiedź w każdym języku wygrywa.
2 5 ... 17
Odpowiedzi:
Haskell , 63 bajty
Wypróbuj online!
Zasadniczo działa, próbując zbudować wynik z przodu, a jeśli to się nie powiedzie, z tyłu. Wykorzystuje to fakt, że pierwszy i ostatni element wejściowy zawsze będzie poprawny, fakt, że usunięte elementy muszą być następujące po sobie, oraz fakt, że zawsze będą zawierały co najmniej trzy elementy wejściowe. Wszystko, co muszę zrobić, to założyć, że członkowie przedostatni lub przedostatni są dokładni i sprawdzić, czy to działa. Na szczęście Haskell ma naprawdę piękną składnię do tworzenia serii arytmetycznych.
EDYCJA: dzięki @xnor za wskazanie błędu i dostarczenie rozwiązania!
źródło
[1,3,4,5]
daje[1,3,5]
.all(`elem`s)c
powinien to naprawić z tą samą liczbą bajtów.05AB1E ,
98 bajtówWypróbuj online!
Wyjaśnienie
Zapisano 1 bajt
gcd of deltas
zamiastmin delta
, zainspirowany przez użytkownika202729źródło
Brachylog v2, 9 bajtów
Wypróbuj online!
To jest przesłanie funkcji. Interpretator Brachylog może być tak oceniany, jakby był pełnym programem, podając go
Z
jako argument wiersza poleceń; w takim przypadku dane wejściowe są określone w formacie np.,[1, 2, 4]
a dane wyjściowe są zwracane w podobnym formacie, npZ = [1, 2, 3, 4]
. (Oczywiście w przypadku przesyłania funkcji dane wejściowe i wyjściowe nie są w żadnym formacie; są to tylko listy.)To faktycznie rozwiązuje trudniejszy problem niż ten, o który poprosił OP: opracowuje najkrótszą arytmetyczną sekwencję liczb całkowitych zawierających określone wartości w określonej kolejności, niezależnie od tego, czy usunięcia są kolejne, czy nie. Ponieważ używa brutalnej siły, może być bardzo powolny, jeśli wiele wartości zostanie usuniętych.
Wyjaśnienie
Program składa się z trzech głównych części.
⊆
znajduje nadsekwencję danych wejściowych (tj. sekwencję, która ma dane wejściowe jako podsekwencję). Gdy istnieje więcej niż jedno możliwe wyjście z programu Brachylog, wybrane wyjście jest pierwszym wyjściem w kolejności rozstrzygania, a kolejność rozstrzygania jest określana przez pierwsze polecenie w programie, które ma o nim opinię; w tym przypadku⊆
określa kolejność, która faworyzuje krótkie wyniki nad długimi. Otrzymane przez nas dane wyjściowe będą najkrótszą kolejnością danych wejściowych, która jest zgodna z ograniczeniami w pozostałej części programu..
…∧
Służy do wyprowadzenia wartości, którą widzi jako dane wejściowe (tj. W tym przypadku nadsekwencję), ale także do zapewnienia, że określony warunek ją zachowuje. Innymi słowy, wyprowadzamy najkrótszą nadsekwencję spełniającą określony warunek (i ignorujemy wszelkie wyniki pośrednie zastosowane w celu sprawdzenia, czy spełnia on warunek).Wreszcie mamy
s₂ᵇ-ᵐ
=
, tj. „Wszystkie delty sekwencji są równe”, warunek, który stosujemy do wyniku. (Zwracana z tego wartość to lista delt, a nie sama supersekwencja, dlatego potrzebujemy.
…,∧
aby upewnić się, że właściwa rzecz jest wyprowadzana).Brachylog jest tutaj powstrzymywany, ponieważ nie ma żadnych wbudowanych programów, które mogłyby obsługiwać obliczenia delt, stosowania operacji na nakładających się parach z listy lub tym podobnych. Zamiast tego musimy wyraźnie powiedzieć, co mamy na myśli:
s₂ᵇ
znajduje wszystkie (ᵇ
) podciągi (s
) o długości 2 (₂
) (użycieᵇ
jest wymagane do utrzymania połączenia między niewiadomymi w podciągach i nadsekwencjach; częściej używaneᶠ
to zerwie połączyć). Następnie-ᵐ
odejmuje każdą z tych par, aby utworzyć deltę. To denerwujące, że trzeba napisać pięć bajtóws₂ᵇ-ᵐ
dla czegoś, co ma wbudowane większość współczesnych języków gry w golfa, ale tak właśnie wygląda czasem codegolf.źródło
Python 2,
104978983716760 bajtówDzięki Chas Brown za oszczędność 4 bajtów.
Dzięki ovs za oszczędność 7 bajtów.
Wprowadź listę według argumentów.
Wypróbuj online!
Wyjaśnienie:
Ponieważ usuwane są kolejne, wystarczy sprawdzić różnice między dwiema parami kolejnych elementów.
źródło
b if b%c else c
je[c,b][b%c>0]
.key=abs
! Wygląda na to, że ludzie często omijają tęf=
część, chyba że używana jest funkcja rekurencyjna; abyś mógł w ten sposób zapisać 2 bajty.a[-1]-a[-2]
za[2]-a[1]
- logika jest taka sama, a otrzymasz kolejne 2 bajty.Pyth , 11 bajtów
Wypróbuj tutaj!
Dzięki Stevenowi H. za uratowanie bajtu!
Pyth , 12 bajtów
Wypróbuj tutaj!
Jak to działa
źródło
Q
więc można sortować i wziąć pierwszy element zamiastabs(GCD(Q))
jak w%hS.+SQ}hQe
do 11 bajtów. Zestaw testowyGalaretka , 8 bajtów
Wypróbuj online!
Uwagi:
Działa tylko na niektórych starych wersjach Jelly. ( na przykład to zatwierdzenie ) (gdzie
g
usefractions.gcd
, którego znak wyniku jest taki sam jak znak wejściowy, zamiastmath.gcd
, który zawsze zwraca wartość dodatnią).Powyższy link TIO to link TIO Pythona 3, kod Pythona składa się z kodu źródłowego Jelly z zatwierdzenia, o którym wspomniałem powyżej, z wyjątkiem wszystkiego (3 plików) spakowanych w tym samym pliku (do uruchomienia TIO) i
dictionary.py
został zredukowany do tylko niektóre linie. Niemniej jednakdictionary.py
nie ma to związku z tą odpowiedzią, ponieważ nie używa skompresowanego łańcucha. (“...»
konstrukcja)Wyjaśnienie:
Po pierwsze, ponieważ ciągły segment jest usuwany i pozostają co najmniej 3 elementy, na starej liście pozostają dwie kolejne liczby, a wszystkie delty będą wielokrotnościami kroku. Dlatego lista
gcd
różnic (I
przyrostów) będzie wartością bezwzględną kroku.Na szczęście
gcd
jest podpisany (patrz uwaga powyżej)Tak więc program:
Rosnący zakres liczb całkowitych od
Ṃ
minimalnej doṀ
maksymalnej.Modułowy, wybierz co n-ty element.
$
Łańcuch Monadic ( ) łączyI
(przyrosty, różnice) ig/
(redukujegcd
elementy listy). Jeśli przyrosty są dodatnie, togcd
będzie dodatnie, a lista powracająca będzie od lewej do prawej (rosnąca) i odwrotnie.źródło
gcd
zamiastmin
zmuszało nas do wiązania. Szkoda, że dostaję gcd ze znakiem, w przeciwnym razie byłbym o 7;)MATL , 13 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
JavaScript (ES6),
9290Edytuj 2 bajty zapisane dzięki Arnauld
Łatwo, ponieważ wystarczy sprawdzić różnice między dwoma pierwszymi i dwoma ostatnimi. Ale wciąż niewiarygodnie długo.
Mniej golfa
Test
źródło
a-=d=e*e>d*d?d:e
powinien działać i zapisać 2 bajty.Wolfram Language (Mathematica) , 50 bajtów
Wypróbuj online!
źródło
{##}
iLast@{##}
ale najlepsze co mogłem dostać się, że było 51 bajtów.Rubinowy ,
65 62 5554 bajtówWypróbuj online!
-1 bajt dzięki Justin Mariner
źródło
h
, pozostawiająca,*,b,c
. Wypróbuj online!Haskell ,
7369 bajtówWypróbuj online!
źródło
J ,
49, 4746 bajtówZainspirowany rozwiązaniem Emigny.
Jak to działa:
Wypróbuj online!
źródło
Łuska , 9 bajtów
Wypróbuj online!
Wielkie dzięki H.PWiz do zmniejszenia o połowę liczby bajtów, wskazując, że stosowanie
…
na liście rangifies go! ...źródło
F⌋
również zastąpić▼
?gcd
było radzenie sobie z deltami ujemnymiC # (.NET Core) ,
167 + 13 = 180145 + 13 = 158 bajtówWypróbuj online!
+13 dla
using System;
Co zaskakujące, wyzwanie to miało więcej niuansów, niż początkowo oczekiwałem.
Podziękowanie
-22 bajty zapisane z powodu pewnych zgrabnych uproszczeń @DLosc.
DeGolfed
źródło
Python 2 , 147 bajtów
Wypróbuj online!
źródło
Python 2 , 78 bajtów
Wypróbuj online!
źródło
Galaretka , 8 bajtów
Wypróbuj online!
źródło
dc , 64 bajty
Wypróbuj online!
źródło
Japt , 12 bajtów
Spróbuj
Wyjaśnienie
Wygeneruj tablicę liczb całkowitych (
õ
) z ostatniego elementu tablicy wejściowej (Ì
) do pierwszej (Ug
). Oblicz krok między elementami, pobierając wszystkie dwie pary elementów z danych wejściowych i zmniejszając je o różnicę bezwzględną (Uäa
), a następnie sortując (ñ
) tę tablicę i biorąc pierwszy element (g
).źródło