tło
Programiści w dzisiejszych czasach nie wydają się utrzymywać prostych buforów! Częstym źródłem błędu jest próba użycia indeksu tablicy, który jest zbyt duży dla bufora. Twoim zadaniem jest zaimplementowanie bufora, w którym duże indeksy zostaną zredukowane do rozmiaru, który bufor może obsłużyć. Ponieważ dokładnie decyduję, co jest najlepsze dla wszystkich, zaimplementujesz ten bufor zgodnie z moimi dokładnymi specyfikacjami.
Przegląd
Masz bufor tylko wstawiany, który powiększa się wraz z dodawaniem elementów. Bufor jest indeksowany zerowo, a także indeksuje modulo jego bieżący rozmiar. Specjalną zasadą dla tego wyzwania jest:
- Aby wstawić element o indeksie i środki, aby obliczyć j ,
j = i % buffer.length()
i wstawić nowy element po j pozycji na liście.
Jedynym szczególnym przypadkiem jest to, że bufor jest pusty, ponieważ moduł arytmetyczny zero nie działa. Tak więc, jeśli bufor jest obecnie pusty, nowy element będzie miał indeks 0 .
Jeśli bufor ma tylko jeden element, to zawsze po włożeniu 0th elementu. To tylko jeden przykład ogólnego przypadku.
Jeśli bufor zawiera 6 elementów: [4, 9, 14, 8, 5, 2]
i powiedziano ci, aby wstawić nowy element 10
o indeksie 15 , znajdziesz go 15 % 6 == 3
, a następnie wstaw nowy 10
po 8
indeksie 3, co daje wynikowy bufor o wartości [4, 9, 14, 8, 10, 5, 2]
Problem
Napisz funkcję lub program, który pobierze uporządkowaną listę dodatnich liczb całkowitych i dodatnich wskaźników liczb całkowitych, w których je wstawisz.
Zacznij od pustego bufora i dodaj określone liczby całkowite do bufora przy odpowiednich indeksach.
Wyprowadza uporządkowaną listę liczb całkowitych znajdujących się w buforze po wykonaniu wszystkich określonych wstawek.
To wyzwanie dla golfa, więc wygrywa najkrótszy kod.
Wskazówki dotyczące wprowadzania danych
Możesz wziąć listy danych wejściowych, jeśli uznasz to za stosowne. Przykłady:
- Lista par:
[ [1,1], [2,4], [3,9], [4,16], [5,25]...]
- Lista artykułów i lista indeksów:
[1, 2, 3, 4, 5...], [1, 4, 9, 16, 25]
- Spłaszczony:
[1, 1, 2, 4, 3, 9, 4, 16, 5, 25 ...]
- itp.
Możesz założyć, że dane wejściowe zawsze zawierają co najmniej jeden element i odpowiedni indeks.
Przypadki testowe
Kwadratowa obudowa od góry:
[(1, 1), (2, 4), (3, 9), (4, 16), (5, 25), (6, 36), (7, 49), (8, 64)] -> [1, 2, 8, 7, 6, 5, 4, 3]
Wygenerowałem je losowo:
[(11, 9), (13, 14)] -> [11, 13]
[(1, 18), (11, 7), (3, 35), (16, 22)] -> [1, 11, 16, 3]
[(3, 16), (16, 37), (0, 28), (18, 24)] -> [3, 18, 0, 16]
[(7, 26), (8, 20), (11, 39), (1, 23), (17, 27)] -> [7, 8, 11, 1, 17]
[(15, 35), (17, 7), (16, 15), (1, 13), (2, 6), (11, 34)] -> [15, 17, 1, 2, 16, 11]
[(2, 13), (1, 20), (16, 25), (8, 21), (5, 2), (16, 37), (3, 0)] -> [2, 3, 8, 1, 16, 5, 16]
[(6, 20), (15, 15), (12, 26), (10, 27), (17, 13), (7, 18), (4, 16)] -> [6, 10, 17, 12, 7, 4, 15]
[(18, 9), (5, 34), (15, 4), (12, 29), (2, 5), (7, 0), (7, 10), (16, 38)] -> [18, 7, 15, 2, 16, 5, 7, 12]
[(0, 12), (12, 0), (4, 16), (15, 12), (6, 28), (8, 10), (11, 24), (0, 25)] -> [0, 11, 8, 6, 15, 0, 4, 12]
[(6, 12), (14, 13), (10, 33), (11, 35), (1, 3), (0, 28), (15, 27), (8, 10), (1, 2)] -> [6, 14, 10, 1, 11, 8, 15, 0, 1]
[(2, 29), (19, 30), (18, 17), (13, 3), (0, 21), (19, 19), (11, 13), (12, 31), (3, 25)] -> [2, 13, 3, 11, 0, 12, 19, 18, 19]
Implementacja referencji Python3
def f(inputs):
# `inputs` is a list of pairs
buff = []
for item, index in inputs:
if len(buff) == 0:
buff.insert(0, item)
else:
insert_after = index % len(buff)
buff.insert(insert_after+1, item)
return buff
Odpowiedzi:
MATL ,
2422 bajtówDane wejściowe to macierz (z
;
separatorem wierszy) zawierająca wartości w pierwszym rzędzie i indeksy w drugim.Dane wyjściowe to tablica kolumn wyświetlana jako liczby oddzielone znakami nowej linii.
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe , z każdym wynikiem wyświetlanym w jednym wierszu.
Wyjaśnienie
źródło
Perl, 37 bajtów
35 bajtów kodu + 2 bajty na
-lp
flagi.Wypróbuj online!
Implementacja jest dość prosta,
splice
wstawia tablicę@F
do indeksu1+<>%(@F||1)
(pamiętaj, że@F||1
obsługuje przypadek pustej tablicy).Kilka słów o (pozornie) niedopasowanych nawiasach klamrowych
}{
(ponieważ miałem na ten temat komentarz i myślę, że jest to dość dziwne dla ludzi, którzy nie znają Perla) i jest to dość powszechna sztuczka w golfie w Perlu:-p
flaga otacza kod z (z grubsza)while(<>){ CODE } continue { print }
, (continue
jest wykonywany po każdej iteracji). Więc z tymi nieporównywalnymi}{
zmieniam kod nawhile(<>) { CODE}{ } continue { print }
. Tworzy więc pusty blok zaraz po moim kodzie (ale to nie jest problem) icontinue
jest wykonywany tylko raz, powhile
(tj. Kiedy wszystkie dane wejściowe zostały odczytane).źródło
}{
doprowadza mnie do szału ...}{
mi przypomina tę iluzjęES6 (JavaScript),
58,57,53, 50 bajtówGrał w golfa
Pobiera tablicę par indeks-wartość jako dane wejściowe.
EDYCJE
&&
do zwracania wartości, -1 bajt|0
(ponieważ najwyraźniej splot dobrze radzi sobie z NaN), -2 bajtyb=[]
drugi „argument” dla map () , -2 bajtów (Thx @ETHproductions!)Test
źródło
a=>a.map(e=>...,b=[])&&b
e=>
się(e,i)=>
i używająci
zamiastb.length
Haskell ,
7069 bajtówWypróbuj online! Zastosowanie:
foldl(!)[] [(1,5),(2,4),(3,7)]
. Zapisano jeden bajt dzięki @nimi!Wyjaśnienie:
Rozwiązanie bez obliczania modułu: (90 bajtów)
Wypróbuj online!
źródło
j<-1+i`mod`length b
zapisuje bajt.Python 2 ,
64625856 bajtówDzięki @xnor za grę w golfa z 2 bajtów!
Wypróbuj online!
źródło
(len(x)or 1)
zamiast inicjowania długości?len(x or[0])
i-~len(x[1:])
remis.Python 2 ,
6260 bajtówPobiera dane wejściowe jako listę par, drukuje wynik. Edycja: Outgolfed by Dennis
Wypróbuj online!
Jest to dość proste - wykonaj pętlę przez dane wejściowe, wstawiając elementy we właściwe miejsce, a następnie wydrukuj wynik. Podejmowanie decyzji, do którego indeksu należy wstawić
1+y%(len(b)or 1)
. Jest to standardowy sposób przeprowadzania indeksowania modułowego zor 1
obsługą przypadku na krawędzi pustej listy.źródło
JavaScript (ES6), 60 bajtów
Testowy fragment kodu
Pokaż fragment kodu
źródło
V ,
384035 bajtówTa odpowiedź zagina definicję listy i zwykle nie jest językiem używanym do manipulowania listami, ale chciałem użyć tego,
[count]/{regex}
który niedawno dodałem do V. Dane wejściowe są pobierane jak[index] [num] [index] [num] ...
i zwracane jak[num] [num] [num]
.Wypróbuj online!
Hexdump dla 2 ukrytych postaci:
Wyjaśnienie
Kod do
dG@"
formatuje wszystkie\d+ \d+
pary, aby lista 1 2 3 4 5 6 wyglądała podobniea następnie
dG@"
wykonuje to wszystko jako kod V, jak poniżej:źródło
PHP,
7292 bajtyprzyjmuje dane spłaszczone z argumentów wiersza poleceń. Uruchom z
-nr
.źródło
Fatal error: Uncaught DivisionByZeroError: Modulo by zero
, naprawiłem to, a następnie próbowałem1 1 1 2 1 3
i otrzymałem[1=>null]
jako dane wyjściowe zamiast[1,3,2]
j+1
zamiast wstawiać poj
, nie?18 1 7 11 35 3 22 16
=>[1,11,16]
zamiast[1,11,16,3]
insert
słowo kluczowe. Dzięki; naprawiony.Java 7,
125124 bajtyAkceptuje płaską listę wartości oraz indeksy. W przypadku testu kwadratów dane wejściowe byłyby
new int[] {1, 2, 3, 4, 5, 6, 7, 8, 1, 4, 9, 16, 25, 36, 49, 64}
Wypróbuj online!
źródło
Mathematica, 62 bajty
Czysta funkcja z pierwszym argumentem
#
powinna być listą par. Zaczynając od pustej listy{}
, opuściłFold
listę wejść#
z następującą funkcją:źródło
Perl 6 , 51 bajtów
Pobiera spłaszczone wejście.
źródło
Clojure, 87 bajtów
źródło