Prosty golf na początek tygodnia! Dostaniemy trzy tablice: the podstawy tablicy B
The tablicy wartość V
i tablicy wskaźnik I
. Powinieneś stworzyć kolejną tablicę, w której wartości V
są wstawiane B
według wskaźników określonych przez I
. Oto przykład:
Base: [5, 1, 4, 1, 3]
Values: [0, 0, 7]
Indices: [5, 0, 3]
Wskaźniki wskazują na następujące pozycje w tablicy podstawowej:
[ 5, 1, 4, 1, 3 ]
^ ^ ^
0 3 5
Tak więc wstawiając odpowiednie elementy z tablicy wartości, wynik powinien być:
[0, 5, 1, 4, 7, 1, 3, 0]
Zasady
Możesz napisać program lub funkcję, przyjmując dane wejściowe przez STDIN (lub najbliższą alternatywę), argumenty wiersza poleceń lub argumenty funkcji i wypisywać wynik za pomocą STDOUT (lub najbliższej alternatywy), zwracaną wartość funkcji lub modyfikując tablicę podaną jako B
parametr .
Jeśli przesłanie jest funkcją I
i V
może być zmodyfikowane w jakikolwiek sposób, a także B
jeśli nie jest używane w danych wyjściowych.
Możesz przyjąć następujące założenia dotyczące danych wejściowych:
- Wszystkie elementy tablicy podstawowej i wartości będą liczbami całkowitymi nieujemnymi.
- Tablica wartości będzie miała najwyżej jeden element więcej niż tablica podstawowa.
- Tablica wartości i tablica indeksu będą miały tę samą liczbę elementów.
- Tablica indeksów nie będzie zawierać powtarzających się indeksów, a wszystkie indeksy będą w zakresie.
- Tablice podstawowa i wartości mogą zawierać powtarzające się elementy.
- Dowolna lub wszystkie tablice mogą być puste.
- Nie można zakładać, że wskaźniki są podawane w określonej kolejności.
- Możesz odbierać dane wejściowe i generować dane wyjściowe w dowolnym dogodnym, jednoznacznym łańcuchu lub formacie listy. Możesz także wybrać otrzymywanie trzech tablic w innej kolejności.
- Możesz wybierać między indeksowaniem opartym na 0 i opartym na 1.
To jest kod golfowy, więc wygrywa najkrótsza odpowiedź (w bajtach).
Przypadki testowe
Podany w formacie B V I => Result
indeksowania 0. Jeśli korzystasz z indeksowania 1, zwiększ elementy trzeciej tablicy o 1.
[] [] [] => []
[] [1] [0] => [1]
[1,2] [] [] => [1,2]
[1,2] [3] [0] => [3,1,2]
[1,2] [3] [1] => [1,3,2]
[1,2] [3] [2] => [1,2,3]
[0,0,0] [1,1,1,1] [0,1,2,3] => [1,0,1,0,1,0,1]
[5,1,4,1,3] [0,0,7] [5,0,3] => [0,5,1,4,7,1,3,0]
[1,2,3,4] [4,3,2,1] [4,0,3,1] => [3,1,1,2,3,2,4,4]
Daj mi znać, jeśli natkniesz się na inne interesujące przypadki, a ja je dodam.
Tabela liderów
Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
# Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
# Ruby, <s>104</s> <s>101</s> 96 bytes
var QUESTION_ID=50369;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),e.has_more?getAnswers():process()}})}function shouldHaveHeading(e){var a=!1,r=e.body_markdown.split("\n");try{a|=/^#/.test(e.body_markdown),a|=["-","="].indexOf(r[1][0])>-1,a&=LANGUAGE_REG.test(e.body_markdown)}catch(n){}return a}function shouldHaveScore(e){var a=!1;try{a|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(r){}return a}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading),answers.sort(function(e,a){var r=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0],n=+(a.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0];return r-n});var e={},a=1,r=null,n=1;answers.forEach(function(s){var t=s.body_markdown.split("\n")[0],o=jQuery("#answer-template").html(),l=(t.match(NUMBER_REG)[0],(t.match(SIZE_REG)||[0])[0]),c=t.match(LANGUAGE_REG)[1],i=getAuthorName(s);l!=r&&(n=a),r=l,++a,o=o.replace("{{PLACE}}",n+".").replace("{{NAME}}",i).replace("{{LANGUAGE}}",c).replace("{{SIZE}}",l).replace("{{LINK}}",s.share_link),o=jQuery(o),jQuery("#answers").append(o),e[c]=e[c]||{lang:c,user:i,size:l,link:s.share_link}});var s=[];for(var t in e)e.hasOwnProperty(t)&&s.push(e[t]);s.sort(function(e,a){return e.lang>a.lang?1:e.lang<a.lang?-1:0});for(var o=0;o<s.length;++o){var l=jQuery("#language-template").html(),t=s[o];l=l.replace("{{LANGUAGE}}",t.lang).replace("{{NAME}}",t.user).replace("{{SIZE}}",t.size).replace("{{LINK}}",t.link),l=jQuery(l),jQuery("#languages").append(l)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/,NUMBER_REG=/\d+/,LANGUAGE_REG=/^#*\s*([^,]+)/;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table></div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table></div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody></table><table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody></table>
NULL
pustą tablicę dla języków, w których jest pusta tablicaNULL
?Odpowiedzi:
Pyth, 14 bajtów
Demonstracja.
Ten program przyjmuje dane wejściowe jako trzy krotki list w kolejności Podstawa, indeksy, wartości.
Objaśnienie na przykładzie
[5, 1, 4, 1, 3], [5, 0, 3], [0, 0, 7]
:Weź dane wejściowe: niejawne, Q to dane wejściowe.
Stwórz indeks, pary wartości:
CtQ
=[(5, 0), (0, 0), (3, 7)]
Posortuj pary w porządku rosnącym indeksu:
SCtQ
=[(0, 0), (3, 7), (5, 0)]
Wyjmij wartość z każdej pary:
medSCtQ
=[0, 7, 0]
Podziel listę bazową w miejscu wskazań:
cFPQ
=[[], [5, 1, 4], [1, 3], []]
Przeplot 3 i 4:
.icFPQmedSCtQ
=[[], 0, [5, 1, 4], 7, [1, 3], 0, []]
Połącz w jedną listę:
s.icFPQmedSCtQ
=[0, 5, 1, 4, 7, 1, 3, 0]
źródło
ssC,cFPQamedSCtQ]
.Python 2, 54
Pobiera dane wejściowe jako
B,I,V
.B
Po wywołaniu modyfikuje dane wejściowe (dzięki Martin Büttner za przypomnienie, że to możliwe).Używa
map
wywoływaniaB.insert
każdej pary indeksu / elementu. Aby uniknąć problemu przesuwania indeksów listy podczas wstawiania elementów, sortuje pary w kolejności malejącej indeksu według brzydkiego zip / sort / unzip. Gdyby nie problem zmiany, moglibyśmy to zrobićmap(B.insert,*X)
.Stara metoda (65):
źródło
Haskell, 62 bajty
Przykład użycia:
f [5,1,4,1,3] [0,0,7] [5,0,3]
->[0,5,1,4,7,1,3,0]
.Jak to działa: powiększ listę bazową indeksami „półtora” zaczynającymi się od
0.5
(np.[(0.5,5),(1.5,1),(2.5,4),(3.5,1),(4.5,3)]
) I połącz ją z parami indeks-wartość. Posortuj i odrzuć indeks.Uwaga : nie wiem, czy tutaj oszukuję. Z matematycznego punktu widzenia jest w porządku, ale programista może argumentować, że lista indeksów
[5,0,3]
nie jest listąIntegers
wymaganą, ale listąFractionals
(dokładnie, typ jest polimorficzny, ale musi należeć doFractional
klasy, np.Float
LubDouble
).źródło
Rubin,
605953 bajtówI wersja bez golfa
źródło
->a,b,c{...}
. Są też szanse,insert
że nie trzeba nawiasów.CJam,
342318 bajtówMoje pierwsze zgłoszenie do CJam. Porady są mile widziane, jestem pewien, że jest wiele do golfa.
16 bajtów zapisanych przy pomocy @ MartinBüttner i @Dennis.
Funkcja oczekuje wejścia na stosie w kolejności
B V I
(I jest najwyższa).Przykładowe użycie:
Metoda:
i
zi+0.5
źródło
q~.5fm.\2/\ee+$1f=p
pomocą anonimowej funkcji można uzyskać do 19 bajtów zi do 18 bajtów:{.5fm.\2/\ee+$1f=}
{.\2/\ee+{0=}$1f=}
(wciąż 18 bajtów)get array element
operatora1f=
. Pozostawię to jako pełny program.K,
2221 bajtówDefiniujemy funkcję 3 argumentów
{…}
ze zmiennymi ukrytymix
,y
az
reprezentujący listę startową, na liście wartości i listę indeksu odpowiednio. Operator „cut” (_
) służy do podziału listy początkowej na posortowaną listę podanych indeksów ((z@<z)
). Przeplatamy wartości (po odpowiednim sortowaniu) z podzielonymi częściami oryginalnej tablicy, tworząc listę ((a;b)
), przyjmując jej transpozycję (+
) i spłaszczając wynik (,//
).Przykład użycia:
Spacje wokół znaku podkreślenia są konieczne, ponieważ K pozwala na podkreślenia w identyfikatorach. K5 usuwa tę potencjalną dwuznaczność. Gdybyśmy mogli liczyć na indeksy rosnące w porządku rosnącym, a podkreślenia nie były prawidłowymi identyfikatorami, moglibyśmy użyć znacznie ładniejszego 13-bajtowego programu:
(westchnienie.)
edytować:
Łamie symetrię, ale możemy zaoszczędzić bajt za pomocą bracketing-indexing (
[…]
) zamiast@
operatora indeksowania infix . Zwykle powoduje to, że programy są dłuższe, ale w tym przypadku potrzebowaliśmy parens do posortowaniaz
przed wykonaniem cięcia.źródło
Pyth, 17 bajtów
@isaacg pokonał już moje rozwiązanie. Ale skoro skończyłem dokumentację, i tak ją opublikuję.
To pobiera dane wejściowe w formacie
B, I, V
. Możesz spróbować tutaj: Demonstration lub Test SuiteWyjaśnienie:
Korzystam z przykładu
B = [5,1,4,1,3], I = [5,0,3], V = [0,0,7]
z OP.źródło
JavaScript (ES6), 75
Funkcja z 3 parametrami tablicy, zwracająca tablicę. Dziwnie, ta funkcja modyfikuje swój
i
parametr (na co pozwala OP)Testuj uruchamianie fragmentu, Firefox tylko jak zwykle.
źródło
fat arrow function
nie jest zaimplementowany nawet w wersji dla programistów Chrome (AFAIK)Mathematica,
5251 bajtówPrzykład:
Wyjaśnienie:
Korzystając z powyższego przykładu.
Tr@#2->#&~MapIndexed~#
=>{1 -> 5, 2 -> 1, 3 -> 4, 4 -> 1, 5 -> 3}
Thread[#3+.5->#2]
=>{5.5 -> 0, 0.5 -> 0, 3.5 -> 7}
{0.5 -> 0, 1 -> 5, 2 -> 1, 3 -> 4, 3.5 -> 7, 4 -> 1, 5 -> 3, 5.5 -> 0}
){0, 5, 1, 4, 7, 1, 3, 0}
)źródło
CJam,
3029 bajtówTo za długo. Wydaje mi się, że to nie jest przesłanie w golfa: |
Wypróbuj online tutaj
źródło
R, 75 bajtów
To tworzy funkcję bez nazwy. Aby to nazwać, nadaj mu nazwę, np
f=function...
. Zauważ, że tablice muszą być indeksowane 1, ponieważ tak właśnie się dzieje R.Niegolfowane + wyjaśnienie:
Przykłady:
Sugestie są jak zawsze mile widziane!
źródło
CJam, 19 bajtów
Jest to pełny program, który odczytuje tablice B , I i V (jeden na linię, w tej kolejności) ze STDIN.
Wypróbuj online w interpretatorze CJam .
Jak to działa
CJam, 20 bajtów
Jest to anonimowa funkcja, która wyskakuje B , V i I (od góry do dołu) ze stosu i pozostawia w zamian pojedynczą tablicę na stosie.
Wypróbuj online w interpretatorze CJam .
Jak to działa
źródło
Rubinowy, 48 bajtów
Myślę, że jest to zgodne z zasadami, ale proszę sprawdzić.
Nienazwana funkcja przyjmująca trzy tablice jako dane wejściowe. Zwraca ciąg znaków, który można jednoznacznie przeanalizować w tablicę liczb z wyrażeniem ruby
x.split(/:+/).map(&:to_i)
.Testuj przypadki na ideone .
Mógłbym zapisać jeszcze 3 bajty, ale format wyjściowy
[1,2,[nil,5]]
nieco przesuwa reguły zbyt mych imo, chociaż jest to jednoznaczne.źródło
nil
wartościami przeplotu są nieco rozciągnięte. Ale w obu przypadkach nie wygrywa to konkursu, więc tak naprawdę nie martwię się o to.R 60
Jako nienazwana funkcja, która przyjmuje b, v i i
Rozszerza b za pomocą NA Wypełnia luki tam, gdzie jest to wymagane za pomocą v Zwraca wektor bez NA
źródło
Java,
253, 226, 219,209nie do końca zwycięzca, ale no cóż.
Zakładając, że B, V i ja nie są zerowe. v (małe litery v) to długość tablic Wartości / Wskaźników. R jest zwróconą tablicą. r jest długością zwracanej tablicy. x, y i ja są tymczasowymi ints.
rozszerzony:
źródło
APL, 22 bajty
W ⎕IO ← 0, aby dopasować przypadki testowe.
Jest to standardowy algorytm: wektor indeksu pierwszego argumentu jest dołączany do podanych indeksów (trzeci argument).
⍋
oblicza permutację, która posortowałaby indeksy w porządku rosnącym. Ponieważ algorytm sortowania APL jest z definicji stabilny, obliczona permutacja umieszcza element catenacji drugiego i pierwszego argumentu we właściwym miejscu.Na przykład :
źródło