Odwrotne delty tablicy
Twoim zadaniem jest, z uwagi na tablicę 32-bitowych liczb całkowitych, ponowne skompilowanie go z odwrotnymi deltami. Na przykład lista
1 3 4 2 8
trzyma delty:
2 1 -2 6
które są następnie negowane, dając:
-2 -1 2 -6
i ponownie skompilowano, uzyskując:
1 -1 -2 0 -6
jako wynik końcowy.
Wejście wyjście
Otrzymasz listę / tablicę / tabelę / krotkę / stos / itp. liczb całkowitych ze znakiem jako danych wejściowych dowolną standardową metodą wprowadzania.
Zmodyfikowane dane należy ponownie wyprowadzić w dowolnej akceptowalnej formie, zgodnie z powyższą metodą inwersji delta.
Otrzymasz N danych wejściowych, w 0 < N < 10
których każda liczba mieści się w zakresie-1000 < X < 1000
Przypadki testowe
5 6 7 8 -> 5 4 3 2
1 3 4 2 8 -> 1 -1 -2 0 -6
32 18 25 192 199 -> 32 46 39 -128 -135
Notatki
- Nie jesteś ograniczony do metody opartej na delcie: jeśli możesz wypracować łatwiejszą metodę (która nie powinna być zbyt trudna) , możesz jej użyć.
- Jak wspomniano powyżej, zawsze otrzymasz co najmniej 1 wkład, a nie więcej niż 9.
- Pierwsza liczba danych wyjściowych musi zawsze być pierwszą liczbą danych wejściowych, jeśli tak nie jest, metoda jest niepoprawna.
- Akceptowane jest tylko standardowe wyjście wejściowe
- Obowiązują standardowe luki
- To jest golf golfowy , więc wygrywa najmniejsza liczba bajtów!
- Baw się dobrze!
Mamy zwycięzcę.
Dennis „s Jelly odpowiedzi na maleńkim 3 bajty podjęła domu złoto, ze względu na fakt, że jestem pod wrażeniem, że nie może być pobity.
Byłem lekko rozczarowany, że nie zobaczyłem odpowiedzi opartej na oryginalnej specyfikacji, jednak później mogę rzucić na to nagrodę.
Odpowiedzi:
Galaretka ,
73 bajtyWypróbuj online!
tło
Delty (a, b, c, d) to b - a , c - b i d - c . Łączne zmniejszenie (a, b - a, c - b, d - c) przez odjęcie g daje a - (b - a) = 2a - b , 2a - b - (c - b) = 2a - c i 2a - c - (d - c) = 2a - d , więc poprawny wynik to (2a - a, 2a - b, 2a - c, 2a - d) .
Jak to działa
źródło
Python 2, 30 bajtów
Przetestuj na Ideone .
Jak to działa
Delty (a, b, c, d) to b - a , c - b i d - c . Łączne zmniejszenie (a, b - a, c - b, d - c) przez odjęcie g daje a - (b - a) = 2a - b , 2a - b - (c - b) = 2a - c i 2a - c - (d - c) = 2a - d , więc poprawny wynik to (2a - a, 2a - b, 2a - c, 2a - d) .
źródło
Mathematica, 8 bajtów
Nienazwana funkcja pobierająca nieokreśloną liczbę argumentów. Wykorzystuje to „łatwy” sposób: neguje całą listę i dodaje dwukrotnie (oryginalny) pierwszy element.
Nazywany na przykład jak
2#-{##}&[1,3,4,2,8]
; zwraca listę jak{1,-1,-2,0,-6}
.źródło
JavaScript (ES6), 21
Thx @Dennis
źródło
05AB1E , 4 bajty
Wypróbuj online! lub jako pakiet testowy
Wyjaśnienie
źródło
Python, 44 bajty
Wykorzystuje to „łatwiejszą metodę”.
źródło
Pyth, 5 bajtów
Tłumacz online!
źródło
R,
231817 bajtówautomatyczna wektoryzacja i domyślny wydruk na ratunek!
źródło
2*x[1]-x
zamiast tego?Rubinowy, 23 bajty
Niezbyt oryginalny.
źródło
Perl 6 ,
4016 bajtówRozszerzony:
źródło
Brain-Flak , 76 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
Haskell,
2019 bajtówTakie samo rozwiązanie jak Dennis, dziękuję za pomysł
2a - x
.Oszczędność jednego bajtu dzięki Christianowi Seversowi.
źródło
f(x:r)=x:map(2*x-)r
x
na przód.Pyke,
54 bajtówWypróbuj tutaj!
źródło
PHP, 48 bajtów
Wykorzystując technikę Dennisa. Użyj jak:
Wersja 55-bajtowa inna niż Dennis:
źródło
a&
zamiast''<
i dwa bajty z_
zamiast' '
.APL, 8 bajtów
Wyjaśnienie:
Przypadki testowe:
źródło
Labirynt , 34 bajty
Wypróbuj online!
Używa @Dennis „s
(2a - a, 2a - b, 2a - c, 2a - d)
podejście.Żółte kafelki służą do kontroli przepływu. W tym języku programowania 2D program rozpoczyna się od lewego górnego kafelka przesuwającego się na wschód, aby rozpocząć. Na skrzyżowaniach kierunek określa znak górnej części głównego stosu. Puste płytki to ściany.
Zielony
Ta sekcja oszczędza 2a do stosu pomocniczego.
?
Zdobądź pierwszy numer i pchnij go na szczyt głównego stosu:
Zduplikuj górę stosu_2
Pchnij dwa na szczyt stosu*
Popy
, popx
, pushx*y
}
Przenieś górę głównego stosu na szczyt stosu pomocniczego._
Przesuń zero na górę stosuPomarańczowy
Ta sekcja odejmuje 2a od bieżącej liczby, neguje wynik, wypisuje wynik, pobiera następny znak (delimetr), wychodzi, jeśli EOF, wypisuje nowy wiersz, dostaje następną liczbę.
"
Noop. Jeśli nadchodzi z północy, górna część stosu będzie wynosić zero, a program będzie kontynuowany na południe. Jeśli nadchodzi z zachodu, górna część stosu będzie równa jeden, a program skręci w prawo (dalej na południe);
Odrzuć wierzch stosu. Ponieważ zero lub jeden służy tylko do sterowania przepływem, musimy je odrzucić{
Przesuń górną część stosu pomocniczego (2a) na górę głównego stosu:
Duplikuj górę głównego stosu}
Przenieś górę głównego stosu na szczyt stosu pomocniczego-
Popy
, popx
, pushx-y
\`` Negate the top of the stack. This and the previous three operations have the effect of
- (x-2a) = 2a-x`!
Pop u góry stosu i wyślij go jako liczbę,
Naciśnij następny znak (który będzie ogranicznikiem) lub znak ujemny, jeśli EOF)
Zwiększ górną część stosu. Jeśli ostatnim znakiem jest EOF, wówczas górna część stosu będzie wynosić zero, a program przejdzie prosto do@
wyjścia i zakończy działanie. Jeśli ostatnim znakiem był ogranicznik, górna część stosu będzie dodatnia, powodując, że program skręci w prawo i będzie kontynuował wschód\
\
Wyjście nowego wiersza?
Uzyskaj następny numer_1
Popchnij jeden na górę stosu, aby skręcić w prawo na skrzyżowaniuźródło
Labirynt , 24 bajty
Format wejściowy i wyjściowy są listami oddzielnymi od kanału (chociaż format wejściowy jest w rzeczywistości o wiele bardziej elastyczny). Program kończy się z błędem.
Wypróbuj online!
Mam dwa inne rozwiązania przy tej liczbie bajtów, które działają w zasadzie tak samo, ale używają nieco innego przepływu sterowania.
Wyjaśnienie
Wskaźnik instrukcji (IP) zaczyna przesuwać się na wschód wzdłuż pierwszego wiersza, ale wszystkie polecenia poprzedzające w
?
zasadzie nie działają w stanie globalnym, ponieważ nigdzie nie używamy poleceń głębokości stosu. Tak więc kod naprawdę zaczyna się na?
zachodzie, ponieważ IP zmienia się, gdy uderza w ślepy zaułek.Dlatego kod zaczyna się od następującego liniowego bitu kodu:
To po prostu konfiguruje nam kopię
2a
do użycia[2a - a, 2a - b, 2a - c, ...]
formuły.Teraz wchodzimy do głównej pętli programu, używając dość standardowej sztuczki, aby przejść przez jedną linię kodu:
Zauważ, że stos będzie pusty za każdym razem, gdy trafimy,
<
więc wiemy, że otrzymamy tam zera.<
Następnie obraca się cała linia lewo, biorąc IP z nim, dzięki czemu otrzymujemy w ten sposób:IP musi następnie przejść w lewo, gdzie
>
przesuwa linię z powrotem do pierwotnego miejsca (aby przygotować ją do następnej iteracji). Następnie linia jest po prostu wykonywana od prawej do lewej, więc iteracja pojedynczej pętli jest następująca:Problemem podczas pracy z tego typu pętlą jest to, że nie można pracować z żadną formą wykonania warunkowego, ponieważ Labirynt nie ma możliwości pominięcia kodu. Dlatego zakończymy program dzieleniem przez zero, gdy uderzymy w EOF. Oto podział każdej iteracji pętli.
źródło
C ++ 14, 36 bajtów
Jako nienazwana lambda modyfikująca dane wejściowe:
Wykorzystując technikę Dennisa. Działa dla każdego pojemnika, takiego jak
int[]
lubvector<int>
.Stosowanie:
źródło
CJam, 16 bajtów
Format wejściowy:
[1 2 3 4]
. Korzysta z prostej formuły.Wyjaśnienie:
Przepraszamy za brak linku testowego. Sądzę, że SE nie lubi linków ze wspornikami w środku.
źródło
Pushy , 9 bajtów
Daj argumentów jako oddzielone przecinkami wartości w cmd linii:
$ pushy invdeltas.pshy 1,3,4,2,8
. Oto podział z przykładem stosu:Uwaga: może to być 8 bajtów, jeśli dozwolone jest wyjście wstecz:
@&2*K~-_
źródło
Perl, 26 + 3 (
-pla
flaga) = 29 bajtówlub
Za pomocą:
źródło
Dyalog APL , 5 bajtów
-+2×⊃
jest to 5-pociąg, analizuje jak dwa zagnieżdżone 3-pociągi („widelce”):
-+(2×⊃)
brzmi: negacja (
-
) całej tablicy plus (+
) dwukrotnie (2×
) pierwszy element (⊃
)źródło
Ised, 11 bajtów
Wezwanie:
ised --l 'file with input.txt' '2*$1_0-$1
(edycja: poprawione przez kradzież algebry od Dennisa)
źródło
Cud , 17 bajtów
Nie jestem pewien, dlaczego nie opublikowałem tego wcześniej. Stosowanie:
Bardziej czytelny:
źródło