Zainspirowany tym pytaniem:
Utwórz funkcję (lub pełny program), która odbiera listę liczb i wysyła listę na nowo, tak aby liczby o indeksach parzystych pojawiały się jako pierwsze, a następnie liczby o indeksach nieparzystych. Wartości samych liczb nie wpływają na kolejność - wpływają tylko ich indeksy. Wszystkie indeksy są zerowe.
Na przykład:
Wkład: [0, 1, 2, 3, 4]
Wydajność: [0, 2, 4, 1, 3]
Inny przykład:
Wkład: [110, 22, 3330, 4444, 55555, 6]
Wydajność: [110, 3330, 55555, 22, 4444, 6]
Użyj najbardziej naturalnej reprezentacji dla list, które ma Twój język. Nie ma ograniczeń dotyczących złożoności (np. Przydzielenie tymczasowej listy jest w porządku - nie trzeba tego robić w miejscu).
PS Powinno działać dla pustej listy (puste wejście => puste wyjście).
źródło
Odpowiedzi:
Japt , 1 bajt
Wypróbuj online!
źródło
Python, 23 bajty
Wypróbuj online
źródło
lambda
? Dlaczego niemu
czynu
? : Plambda
przezλ
i zmniejszyć liczbę bajtów przez 5! : PPyth, 5
Wypróbuj online lub uruchom pakiet testowy
Wyjaśnienie
źródło
CJam, 7 bajtów
Przesuwa blok (najbliższy funkcji bez nazwy), który przekształca element stosu górnego zgodnie z wymaganiami.
Sprawdź to tutaj.
Wyjaśnienie
Wyjaśnienie zakłada, że górną częścią stosu jest tablica
[0 1 2 3 4]
. Rzeczywiste wartości nie wpływają na obliczenia.źródło
Labirynt ,
2825242322 bajtówTo była szalona zabawa! :) To zdecydowanie najgęściej skompresowany program Labiryntu, jaki do tej pory napisałem. Miałem tak wiele wersji o wielkości 20 i 21 bajtów, które prawie działały, że wciąż wątpię, czy jest to optymalne ...
Pobiera to dane wejściowe jako listę liczb całkowitych dodatnich (z dowolnym ogranicznikiem) i wypisuje wynik do STDOUT jako liczby całkowite rozdzielane przez linię.
Polowanie na 20/21 bajtów: sprawdziłem wszystkie programy formularza
gdzie
X
jest jakikolwiek rozsądny charakter brutalnej siły, ale nie znalazł żadnych ważnych rozwiązań. Oczywiście nie oznacza to, że krótsze rozwiązanie nie istnieje, ale nie można narzucać 20-bajtowych programów bez sporej liczby założeń dotyczących jego struktury.Wyjaśnienie
(Wyjaśnienie jest nieco nieaktualne, ale nadal nie jestem przekonany, że rozwiązanie jest optymalne, więc poczekam z aktualizacją).
Zatem normalnie programy Labiryntu powinny wyglądać jak labirynty. Gdy wskaźnik instrukcji znajduje się w korytarzu, podąży za nim. Kiedy IP trafia na jakiekolwiek połączenie, kierunek jest określany na podstawie najwyższej wartości głównego stosu Labiryntu (Labirynt ma dwa stosy, z nieskończoną liczbą zer na dole). Zwykle oznacza to, że każda nietrywialna pętla będzie dość droga, ponieważ jeśli masz komórki nieścienne w całym miejscu, wszystko jest skrzyżowaniem, aw większości przypadków górna część stosu nie będzie miała właściwej wartości dla adresu IP podążać ścieżką, którą chcesz. Więc powiększasz pętle, tak aby miały całość w środku z tylko jednym dobrze zdefiniowanym punktem wejścia i wyjścia.
Ale tym razem miałem naprawdę szczęście i wszystko tak dobrze do siebie pasowało, że mogłem wszystko to zmiażdżyć. :)
Przepływ kontrolny zaczyna się w
_
kierunku południowym._
Popycha zero na głównym stosie. Może to wydawać się brakiem operacji, ale zwiększa to (niejawną) głębokość stosu, do1
której będziemy potrzebować później.?
odczytuje liczbę całkowitą ze STDIN. Jeśli nie ma więcej liczb całkowitych do odczytania, przesuwa to zero. W takim przypadku adres IP przesuwa się na południe i@
natychmiast kończy program (ponieważ lista wejść jest pusta). W przeciwnym razie IP zmienia się na Wschód.Wchodzimy teraz w bardzo ciasną pętlę z dwoma punktami wyjścia:
!
wypisuje liczbę całkowitą z powrotem do STDOUT, pozostawiając tylko zero na stosie. Adres IP przesuwa się na wschód i?
odczytuje następną liczbę całkowitą. Jeśli to nie jest zero, skręcamy w prawo i ruszamy na południe.?
odczytuje inny (następny parzysty indeks). Ponownie, jeśli nie jest to zero, skręcamy w prawo i ruszamy na zachód.Następnie
\
drukuje wysuw linii bez zmiany stosu, więc skręcamy w prawo, przesuwając się na północ.!
wypisuje następną liczbę całkowitą z indeksem parzystym. Ponieważ teraz na stosie znajduje się co najmniej jedna (dodatnia) liczba całkowita o nieparzystym indeksie, skręcamy w prawo i pętla się powtarza.Gdy któryś z nich
?
trafi na koniec listy, naciska zero i przesuwa się prosto na odpowiedni;
, który odrzuca to zero.W przypadku, gdy na liście znajdował się tylko jeden element, skończyliśmy (ponieważ wydrukowaliśmy to od razu), więc adres IP przesuwałby się na wschód aż do
@
, ponownie kończąc program (drukując końcowy po drodze).W przeciwnym razie musimy również wydrukować liczby całkowite o nieparzystym indeksie. W takim przypadku dwie ścieżki (z dwóch punktów wyjścia pierwszej pętli) łączą się na środku
"
, w obu przypadkach kierując się na wschód._
naciska zero, aby uniknąć skrętu w lewo@
, i;
odrzuca to zero. Teraz wchodzimy w nową pętlę:IP wchodzi do tego w lewej dolnej komórce, poruszając się na północ, omijając pętlę zgodnie z ruchem wskazówek zegara.
}
Przenosi góry głównego stosu nad do stosu pomocniczego. Podczas gdy na stosie nadal znajduje się element, adres IP nadal działa. Po przeniesieniu wszystkiego do stosu pomocniczego (i odwróceniu w tym procesie) IP przesuwa się na wschód, wchodząc w ostatnią pętlę:\
wypisuje ponownie linię,{
przenosi element ze stosu pomocniczego z powrotem na główny. Jeśli nadal był to element na liście, będzie dodatni, a adres IP skręca na południe, gdzie element jest drukowany!
. Następnie#
przesuwa głębokość stosu (a teraz jest to miejsce, w którym_
ważna jest wartość początkowa , ponieważ#
zapewnia to dodatnią głębokość stosu), dzięki czemu adres IP nadal skręca w prawo, przez\
i{
ponownie.Po wydrukowaniu wszystkiego,
{
wyciąga zero z dolnej części stosu pomocniczego, IP kontynuuje Wschód i@
kończy program.źródło
MATLAB, 24
podobny do pythonowego.
Dzięki @LuisMendo za uratowanie 2 bajtów!
źródło
@(x)x([1:2:end 2:2:end])
Haskell , 37 bajtów
Wypróbuj online!
foldr
Rekurencyjnie buduje listę parzystych i nieparzystych listę. Przygotowywanie elementu do listy jest aktualizowane przez dodanie go do listy nieparzystych i nazwanie jej nową listą parzystą, a wywołanie poprzedniej listy parzystej nowej listy nieparzystej. Następnie para[l,r]
konkaternujel++r
.Dzięki Ørjan Johansen za uratowanie 5 bajtów przy użyciu list dwuelementowych zamiast krotek.
42 bajty:
Dodaje indeksy do listy
l
i filtruje parzyste lub nieparzyste.Jeszcze inny format, dla 44. Funkcja
g
przyjmuje każdy element z indeksem parzystym. Wskaźniki nieparzyste są pobierane najpierw przez upuszczenie elementu, a następnie zastosowanieg
. Gdybyl
zagwarantowano, że nie będzie pusta, moglibyśmy bezpiecznie zrobićtail
za 41źródło
l#(a:b:c)=a:(l++[b])#c;l#x=x++l;f=([]#)
przyf
czym główną funkcją.concat
zamiast krotek iuncurry(++)
.PowerShell v3 +,
75674947 bajtówWypróbuj online!
Oczekuje wprowadzania przez rozpryskiwanie, jak pokazano na łączu TIO.
Tworzy macierz
$l
jako tablicę tablic, a następnie przesyła dane wejściowe$args
do pętli|%{}
. Za każdym razem przez pętlę dodajemy element do jednej z dwóch podrzędnych tablic$l
poprzez przerzucanie$f
zmiennej za pomocą logiki boolowskiej. Za pierwszym razem$f
jest to$null
,!
które jest$true
lub1
podczas indeksowania do tablicy. Oznacza to, że pierwszy element jest umieszczany w drugiej tablicy$l
, dlatego właśnie jako$l[1]
pierwszy pobiera dane wyjściowe.Rekwizyty dla TessellatingHeckler za pomoc w grze w golfa i tę odmianę.
-2 bajty dzięki mazzy.
Ostrzeżenia
Mówiąc ściśle, pytanie jest technicznie nieważne, ponieważ PowerShell nie ma pojęcia „list” jako pseudo-niezmiennych obiektów, tylko tablice lub tabele skrótów (inaczej słowniki). Tak więc traktuję wiersz pytania „ Używaj najbardziej naturalnej reprezentacji dla list, które ma twój język ”, jako pytanie o tablice, ponieważ jest to najbliższy PowerShell. Ponadto dane wyjściowe to jeden element w wierszu, ponieważ jest to domyślny sposób zapisywania tablicy w programie PowerShell. Oznacza to wejście wartości
(0,1,2,3,4)
wyjściowej0\r\n2\r\n4\r\n1\r\n3\r\n
.źródło
$args
+ splatting zamiast$input
i,@()*2
zamiast@(),@()
F #,
797756Na podstawie jednej z odpowiedzi Haskell
Najpierw indeksujemy listę, a następnie dzielimy ją według kryteriów: pierwsza pozycja (indeks) i 1 równa 0.
Daje nam to parę par; pierwsza lista będzie zawierała wszystkie indeksowane evens, a druga indeksowane kursy.
Następnie składamy dwie listy za pomocą operatora dołączania i ostatecznie odrzucamy indeks.
Edycja: pominięto oczywistą, że nie ma potrzeby nazywania arg „xs” (nawyki), więc można zredukować do 1-literowej nazwy
Mam również potencjał 76 bajtów, który jest w zasadzie taki sam, ale zdefiniowany jako skład funkcji. Problem polega na tym, że nie kompiluje się jako wartość, ale skutecznie działa z dowolnym argumentem listy podanym tak niepewnie, czy jest w porządku, czy nie:
Uwaga: List.indexed jest dostępny tylko w wersji F # 4.0, mimo że nie został jeszcze udokumentowany w MSDN
źródło
fun
prawda?-> \xs { xs.pairs.classify( *.key%%2, :as( *.value ) ).map( *.value.Slip ) }
Zakładając, że|>
F # odpowiada mniej więcej prawemu operatorowi feeda==>
w Perlu 6. Zgaduję również, cofst>>(&&&)1>>(=)0
robiJavaScript (ES6), 52 bajty
Robi to również w jednym przejściu
Pokaż fragment kodu
źródło
F=
od początku; możesz zapisać bajt, używając:(i*=2)>=(z=x.length)?i-z+--z%2:i
Julia, 23 bajty
źródło
J, 8 bajtów
Jest to czasownik monadyczny (jednoargumentowy), używany w następujący sposób:
Wyjaśnienie
źródło
/:0:`1:\
także 8 bajtów.Galaretka , 4 bajty
Wypróbuj online!
Na podstawie odpowiedzi Martina na CJam
źródło
Mathematica, 40 bajtów
{}[[2;;;;2]]
wyrzuci błąd.źródło
Burleska, 12 bajtów
Zastosowanie jak w:
Wyjaśnienie:
Chociaż po wydaniu nowej aktualizacji możesz to zrobić za pomocą nowej wbudowanej funkcji Unmerge (która działa odwrotnie niż
**
wbudowana funkcja scalania ):źródło
Perl,
3533 bajtów31 bajtów + 2 bajty dla
-ap
. Odczytuje ciąg STDIN rozdzielany spacjami:Gdy dane wejściowe są puste, wypisuje pojedynczą spację, którą uważam za równoważną pustej liście. Jeśli nie, można to naprawić kosztem 4 bajtów za pomocą:
(wymaga Perla 5.10+, drukuje końcowy znak nowej linii)
lub w cenie 5 bajtów z:
(brak spacji końcowych)
Jak to działa
To rozwiązanie wykorzystuje
-a
flagę, która dzieli dane wejściowe na białe znaki i umieszcza wyniki w@F
tablicy.Prawdziwa magia dzieje się w
push
:$|
Zmienna jest zwykle używany do siły wyjściowej zaczerwienienie, ale ma inną ciekawą właściwość: gdy zmniejszany wielokrotnie, jego przełączanie wartości między 0 i 1.Korzystając z faktu, że nie ma żadnych ograniczeń dotyczących identyfikatorów określonych przez dereferencję symboliczną , naprzemiennie wypychamy elementy tablicy na tablice
@0
i@1
, dzięki czemu uzyskujemy@0
wszystkie elementy o indeksie parzystym i@1
szanse. Następnie po prostu konkatenujemy zestawione tablice, aby uzyskać wynik.źródło
C 70
Nic specjalnego, tylko funkcja mapowania indeksu.
Mniej golfa
źródło
Pyth, 8 bajtów
Stosunkowo proste
źródło
Vitsy, 22 bajtów
Vitsy naprawdę nie został stworzony do tego ...
źródło
Perl 6 , 25 bajtów
To najkrótsza lambda, jaką mogłem wymyślić.
źródło
Minkolang 0,12 , 15 bajtów
Wypróbuj tutaj.
Wyjaśnienie
źródło
R, 49 bajtów
Nazwij to q (bla). Lub, jeśli x zawiera już listę do zmiany, to
ma tylko 35 bajtów.
źródło
F #, 64
Zainspirowany odpowiedzią Sehnsuchta (ale za mało przedstawicieli, by móc komentować).
Odwzorowuje każdą wartość na krotkę, w której drugim wpisem jest modulo indeksu listy, sortuje według modulo, a następnie odwzorowuje z powrotem na pierwotną wartość.
źródło
Prolog, 103 bajty
Przykład
źródło
coreutils bash i GNU, 68 bajtów
Zakładamy, że lista jest oddzielona znakiem nowej linii i przekazana na standardowe wejście.
Niestety zignoruje to wszelkie dane wejściowe poza indeksem 1999, więc nie do końca spełnia specyfikację.
Blokuje również plik tymczasowy na stałe („x”), co może być problematyczne, jeśli jest uruchamiany równolegle, i nie usuwa go później. Przepraszam za to!
źródło
PHP,
7869 bajtówPHP może fragmentować i kroić, ale nie przeplatać tablic; co sprawia, że jest to trochę nieporęczne:
Zadzwoń przez referencję lub wypróbuj online .
pierwsze podejście (programy na 78 bajtów):
drukuje wiodący przecinek; włóż
[!$i]
przed pierwszym,$argv
aby go usunąć.Dwa inne 78-bajtowe rozwiązania (wydrukuj przecinek początkowy i końcowy):
Uruchom je
php -nr '<code>' <arguments>
lub wypróbuj onlineźródło
Japt , 3 bajty
Spróbuj
Spróbuj
źródło
Clojure / ClojureScript, 52 bajty
Napisany w ClojureScript REPL, powinien być również prawidłowym Clojure.
źródło
K, 10 bajtów
Na podstawie 5-bajtowej odpowiedzi Pyth.
źródło
Wapń , 191 bajtów
Ten był dość długi :(
Czyta tablicę z argumentów, więc uruchom to za pomocą
hassium file.has 0 1 2 3 4
Uruchom i zobacz rozwinięty z przypadkiem testowym tutaj
źródło