Wyzwanie:
Biorąc pod uwagę dodatnią liczbę całkowitą n , utwórz wektor zgodny z tym wzorem:
0 1 0 -1 -2 -1 0 1 2 3 2 1 0 -1 -2 -3 -4 -3 -2 -1 ... ±(n-1) ±n
Lub wyjaśnione słowami: wektor zaczyna się od 0
i dokonuje przyrostów, 1
aż osiągnie najmniejszą nieparzystą liczbę całkowitą dodatnią, która nie jest częścią sekwencji, a następnie dokonuje dekrecji, aż osiągnie najmniejszą (pod względem wielkości) parzystą liczbę całkowitą ujemną, która nie jest To część sekwencji. Kontynuuje w ten sposób, aż n
zostanie osiągnięty. Sekwencja zakończy się na wartości dodatniej, n
jeśli n
jest nieparzysta, a ujemnej, n
jeśli n
jest nieparzysta .
Format wyjściowy jest elastyczny.
Przypadki testowe:
n = 1
0 1
-----------
n = 2
0 1 0 -1 -2
-----------
n = 3
0 1 0 -1 -2 -1 0 1 2 3
-----------
n = 4
0 1 0 -1 -2 -1 0 1 2 3 2 1 0 -1 -2 -3 -4
-----------
n = 5
0 1 0 -1 -2 -1 0 1 2 3 2 1 0 -1 -2 -3 -4 -3 -2 -1 0 1 2 3 4 5
Możesz wybrać n -zindeksowane. n = 1
dałby wtedy 0 1 0 -1 -2
.
To jest golf golfowy , więc wygrywa najkrótszy kod w każdym języku! Objaśnienia zachęcamy jak zawsze!
Odpowiedzi:
R ,
5854504843 bajtów-2 bajty dzięki MickyT
Wypróbuj online!
źródło
Perl 6 ,
6026 bajtówSpróbuj
Spróbuj
Rozszerzony:
(-1,-*...*)Z*0..$_
generuje sekwencję0 1 -2 3 -4 5
źródło
Python 2 ,
695756 bajtówWypróbuj online!
Dla każdego
n
odpowiednie rozwiązanie dla (włącznie), obliczana jest odwrócony, kiedy jest to liczba parzysta, ma pięści dwóch cyfr (po odwróceniu) usuwa się, a następnie dołączana do wyjścia.input
range(-n,n)
n
źródło
05AB1E ,
97 bajtówZaoszczędź 2 bajty dzięki @Emigna
Wypróbuj online!
Moja pierwsza odpowiedź 05AB1E (tak myślę), więc może brakuje mi trików ...
Wyjaśnienie
Muszę podziękować @Dennis do pierwotnego użytkowania
Ÿ
, w przeciwnym raziemoże nieprawdopodobnie nigdy nie wiadomo o tym ...źródło
ÝεDÈi®*}}Ÿ
bez sprawdzania,ā®sm
to szalone mądre haha.05AB1E ,
1514 bajtówWypróbuj online!
Wyjaśnienie
źródło
JavaScript (ES6), 56 bajtów
Wypróbuj online!
Skomentował
źródło
Haskell , 43 bajty
Wypróbuj online!
Oblicza zanegowane skumulowane sumy listy
[(-1)^k|k<-[1..n],_<-[2..2*k]]
, która jest pierwszymin
wierszamiźródło
Galaretka ,
119 bajtówWypróbuj online!
Jak to działa
źródło
Haskell ,
4842 bajtówWypróbuj online!
Dzięki Οurous za -1 bajt
Nawet jeśli jest to raczej oczywiste z perspektywy czasu, zajęło mi trochę czasu, aby dojść
(-1)^i*x
co jestx
, gdyi
jeszcze jest i-x
kiedyi
jest nieparzysta. Poprzednie iteracje, w których:źródło
1-i
zamiast-i+1
w..
wyrażeniu.C # (.NET Core) ,
300167 bajtówNigdy wcześniej tego nie robiłem, ale ten wydawał się zabawny. Rozumiem, dlaczego ludzie używają tych „golfowych” języków, ponieważ 167 wydaje się znacznie wyższa niż niektóre inne odpowiedzi. Ale musisz iść z tym, co wiesz.
Wypróbuj online!
źródło
using
instrukcje i funkcję. Jest to domyślnie dozwolone, chyba że wyzwanie określa, że musi to być pełny program (nawet jeśli tak, można skrócić nazwę zawierającą klasę).[](){};.
)(n-1)*2
jest po prostu2*n-2
iz jakiegoś przegrupowania nie można usunąć nawiasy.!=
ma pierwszeństwo mniej niż,%
więc możesz usunąć parę parenów. I możesz użyć>0
zamiast `! = 0, zapisuje bajt.static int[] f(int n)
może stać sięf=n=>
za pomocą (rekurencyjne lambda), i(n-1)*2
może stać się~-n*2
zapisać na nawiasach. Sprowadziłem to do 155 (137 + 18) bajtów: Wypróbuj online . 18 bajtów jestusing System.Linq;
, ponieważ wymagany import jest obowiązkowy dla liczby bajtów. Miłego pobytu!J , 25 bajtów
-5 bajtów dzięki FrownyFrog!
Wypróbuj online!
J , 30 bajtów
Wyjaśnienie:
i.,]
tworzy listę 0..n&.>
dla każdej liczby na liście wykonaj czasownik w (...) i wstaw wynik (potrzebuję boksu, ponieważ wyniki mają inną długość)[:( _1&^)
znajdź -1 doi
potęgi (-1 lub 1)i:@*
stwórz listę -n..n lub n ..- n, w zależności od znaku powyższego;@
rozpakuj>:@*:
znajdź n ^ 2 + 1}.
i wziąć tyle liczb z listyWypróbuj online!
źródło
n
wersja zerowa ? np*:{.;@([:(i:@*_1&^)&.>i.)
. specyfikacja na to pozwala$
do odcięcia, nie ma takiej potrzeby,&.>
ponieważ*
jest na poziomie 0.Python 2 ,
6556 bajtówFormat wyjściowy jest nieco brzydki. : /
Wypróbuj online!
źródło
Java 8,
858379 bajtów-6 bajtów dzięki @ OlivierGrégoire .
Wypróbuj online.
Wyjaśnienie:
źródło
j
).i
iść w górę zamiast w dół, aby usunąć zbędnen*n
.R ,
48 4642 bajtówWypróbuj online!
Port odpowiedzi Ruby autorstwa Kirill L. - i zaoszczędził 6 bajtów dzięki temu samemu Kirill L.! Teraz krótszy niż rozwiązanie Giuseppe ;)
Część tej odpowiedzi Octave autorstwa Luisa Mendo
approx
jest mniej golfowa.n=n^2+1
można zastąpić przez,,n^2+1
; lub przez0:n^2+1
(argument pozycyjnyxout
) dla tej samej liczby bajtów:R , 56 bajtów
Wypróbuj online!
źródło
approx
będzie działać tutaj podobnie do rozwiązania Octave Luisa Mendo.diffinv
iapprox
z tego pytania ...~
nie działa jako operator uzupełniający :(), możesz jednak zapisać kolejne 2 bajty , przełączając się na pełny program.APL (Dyalog Unicode) , 17 bajtów
Wypróbuj online!
Grał w golfa 2 bajty dzięki @FrownyFrog, przechodząc na pociąg. Zobacz starszą odpowiedź i jej wyjaśnienie poniżej.
APL (Dyalog Unicode) , 19 bajtów
Wypróbuj online!
(Wykorzystuje
⎕IO←0
)Moje pierwsze podejście polegało na konstruowaniu wielu zakresów i łączeniu ich ze sobą, co z łatwością przekroczyło 30 bajtów. Potem zacząłem analizować sekwencję
+\⍣¯1
oznacza odwrotną sumę skumulowanąIstnieje powtarzający się wzór 1s i ¯1s, gdzie długość każdej kolejnej sekwencji 1s lub ¯1s wynosi 1 + 2 × n. I każda podsekwencja występuje naprzemiennie między 1 a ¯1. Teraz mogę utworzyć listę 1 i 1, a następnie skanować według +
źródło
+\0,¯1*⍳(/⍨)1+2×⍳
ma 17 latHaskell , 47 bajtów
Wypróbuj online!
źródło
Java (JDK 10) , 98 bajtów
Wypróbuj online!
źródło
MATL ,
1715 bajtów-2 bajty dzięki Luisowi Mendo!
Wypróbuj online!
Wyjaśnienie dla
n=3
:źródło
Oktawa ,
444241 bajtów2 bajty usunięte dzięki @StewieGriffin , a 1 bajt dalej usunięty dzięki @Giuseppe!
Wypróbuj online!
źródło
Rubin ,
5247 bajtówWypróbuj online!
Poniżej znajduje się oryginalna 52-bajtowa wersja z wyjaśnieniem:
Wypróbuj online!
Przewodnik
źródło
map(&:-@)
część?-r
.Prolog (SWI) , 113 bajtów
Wypróbuj online!
źródło
Python 3, 83 bajty
źródło
łuska ,
1817 bajtówWypróbuj online!
źródło
Węgiel drzewny , 19 bajtów
Wypróbuj online!Link jest do pełnej wersji kodu. Wyjaśnienie:
Alternatywne wyjaśnienie:
Pętla nad liczbami całkowitymi od
0
do wejścia włącznie.Rzuć wyniki na ciąg przed drukowaniem.
Neguj alternatywne zestawy wyników.
Utwórz listę od poprzedniego indeksu do bieżącego indeksu, z wyłączeniem poprzedniego indeksu.
źródło
Galaretka ,
1112 bajtówBah, myślałem, że mam 11 wih
_2+ỊrN)N;¥/
Wypróbuj online!
W jaki sposób?
źródło
Stax , 10 bajtów
Uruchom i debuguj
źródło
Scala, 119 bajtów
Nie golfowany:
Prawdopodobnie można to grać w golfa znacznie lepiej, ale chciałem rozwiązania wykorzystującego leniwe strumienie.
źródło
APL (Dyalog Unicode) ,
3432 bajtyWypróbuj online!
Wymaga
⎕IO←0
-2 bajty dzięki @FrownyFrog
źródło
Skumulowane , 44 bajty
Wypróbuj online!Minęło trochę czasu, odkąd programowałem w Stacked, ale myślę, że nadal go mam.
Alternatywy
73 bajty:
[0\|>:2%tmo*2 infixes[:...|>\rev...|>rev#,$#'sortby 1#behead]flatmap 0\,]
Jest to zgodne z podejściem „zakresy od wygenerowanych indeksów” zastosowanym w mojej odpowiedzi Attache. Okazało się to dość długie, ponieważ Stacked nie ma wbudowanego odwróconego zakresu ani zwijania. (To właśnie
:...|>\rev...|>rev#,$#'sortby 1#behead
robi.)53 bajty:
[0\|>:2%tmo _\tpo#,tr[...rep]flatmap 0\,inits$summap]
... więc postanowiłem pójść na podejściu, które zamiast znajdzie skumulowaną sumę (
inits$summap
) nad1
i-1
powtarzane przez nieparzystych liczb całkowitych, jak w odpowiedzi R .46 bajtów:
[~>0\:2%\#,2*1-tr[...rep]flatmap,inits$summap]
... ale zdałem sobie sprawę, że ujemne liczby całkowite i nieparzyste liczby całkowite można wykonać za jednym razem, mnożąc obie wygenerowane tablice (wartości mod 2 zakresu i samego zakresu),
2
a następnie odejmując1
. Daje to naprzemiennie1
s i-1
dla pierwszego zakresu i nieparzyste liczby całkowite dla drugiego!44 bajty:
[~>0\:2%\#,2*1-tr[...rep]flatmap,$sumonpref]
... a potem przypomniałem sobie, że mam wbudowane prefiksy mapowania. ^ - ^
źródło
Julia 0.6 , 44 bajty
Wypróbuj online!
Ponieważ OP wspomina o „formacie wyjściowym jest elastyczny”, drukuje tablicę podtablic, np. U (3) =>
[[0, 1], [0, -1, -2, -1], [0, 1, 2, 3]]
.i%2*2-1
decyduje o znaku bieżącej podtablicy - ujemna dla liczb parzystych, dodatnia dla nieparzystych.[0:i;(n>i)*~-i:-1:1]
jest w dwóch częściach. 0: i jest proste, zakres wartości od 0 do bieżącego i. W następnej części ~ -i: -1: 1 to malejący zakres od i-1 do 1. Ale chcemy dołączyć to tylko wtedy, gdy nie jesteśmy jeszcze w końcowej wartości, więc pomnóż górną granicę zakresu przez (n> i), więc gdy n == i, zakres wyniesie 0: -1: 1, co kończy się pustą (więc tablica zatrzymuje się na n poprawnie).A oto wersja, która może obsługiwać dostęp losowy - wewnętrzna lambda zwraca tutaj i-ty termin sekwencji bez konieczności zapisywania któregokolwiek z terminów przed nim. Ten daje również wyjście jako pojedynczą, czystą tablicę.
4947 bajtówWypróbuj online!
źródło