Zainspirowany przez tym
W połączonym wyzwaniu jesteśmy proszeni o zastosowanie dodatku do elementów oryginału i rewersu tablicy wejściowej. W tym wyzwaniu nieco utrudnimy, wprowadzając inne podstawowe operacje matematyczne.
Biorąc pod uwagę tablicę liczb całkowitych, przechodź przez +, *, -, //, %, ^
, gdzie //
jest dzielenie liczb całkowitych i ^
wykładnik, jednocześnie stosując je do odwrotnej strony tablicy. Lub innymi słowy, zastosuj jedną z powyższych funkcji do każdego elementu tablicy, przy czym drugi argument jest odwrotnością tablicy, a funkcja zastosowana przewija się przez powyższą listę. Może to nadal być mylące, więc przejrzyjmy przykład.
Input: [1, 2, 3, 4, 5, 6, 7, 8, 9]
Reverse: [9, 8, 7, 6, 5, 4, 3, 2, 1]
[ 1, 2, 3, 4, 5, 6, 7, 8, 9]
Operand: + * - / % ^ + * -
[ 9, 8, 7, 6, 5, 4, 3, 2, 1]
Result: [10, 16, -4, 0, 0, 1296, 10, 16, 8]
więc wyjściem [1, 2, 3, 4, 5, 6, 7, 8, 9]
byłoby[10, 16, -4, 0, 0, 1296, 10, 16, 8]
Aby uwzględnić przypadki narożne, dane wejściowe nigdy nie będą zawierać 0, ale mogą zawierać dowolną liczbę całkowitą z zakresu od ujemnej nieskończoności do dodatniej nieskończoności. Jeśli chcesz, możesz wprowadzić dane jako listę ciągów znaków reprezentujących cyfry.
Przypadki testowe
input => output
[1, 2, 3, 4, 5, 6, 7, 8, 9] => [10, 16, -4, 0, 0, 1296, 10, 16, 8]
[5, 3, 6, 1, 1] => [6, 3, 0, 0, 1]
[2, 1, 8] => [10, 1, 6]
[11, 4, -17, 15, 2, 361, 5, 28] => [39, 20, -378, 7, 2, 3.32948887119979e-44, 9, 308]
To jest golf golfowy, więc wygrywa najkrótszy kod (w bajtach)!
źródło
Odpowiedzi:
Galaretka, 10 bajtów ( widelec )
Pracowałem nad szybkim wdrożeniem tego drugiego dnia, więc dość zaskakujące jest, że tak szybko go wykorzystam. Nadal istnieje tylko jako widelec, więc nie możesz wypróbować go online.
Próbka wyjściowa
Wyjaśnienie
źródło
ƭ
o obsługę nilad (zastąp wartość) i monad (zastosuj do lewego argumentu)2 1”q3ƭ€
dotyczący[7,4,9,0]
powrotów[2, 1, 'q', 2]
Łuska , 16 bajtów
To wyzwanie preferuje języki, które mogą tworzyć nieskończone listy funkcji.Może nie,eval
FTWWypróbuj online!
W jaki sposób?
Alternatywne rozwiązanie 17-bajtowe:
źródło
ë+*-÷%^
? Dlaczegoe
konieczne?ë
bierze 4 argumenty,e
bierze 2. Nie ma jednego na 605AB1E , 18 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Ig∍
jeśli chcesz użyć polecenia „newish” (nie widziałem wiele∍
tutaj).Narzędzia Bash + GNU, 53
Ten skrypt przyjmuje nazwę pliku jako parametr wiersza polecenia.
Wypróbuj online .
Dobrą rzeczą jest to, że
paste -d
pozwala podać listę separatorów, które są używane cyklicznie. Reszta po prostu wprowadza dane wejściowe we właściwym formacie, aby to zrobić.źródło
Galaretka , 15 bajtów
Wypróbuj online! lub zobacz zestaw testowy .
W jaki sposób?
źródło
ż“+×_:%*”;"ṚV
ż“+×_:%*”ṁ$;"ṚV
która również ma 15 bajtów.Python 2 , 67 bajtów
-3 bajty dzięki ovs.
Wypróbuj online!
Python 2 , 95 bajtów
Wypróbuj online!
eval
jest zły ... ale może bardziej golfowy. : Pźródło
JavaScript (ES7),
6867 bajtówPokaż fragment kodu
źródło
o
w nawiasach,.pop()
aby zaoszczędzić kilka bajtów.o
jest również używane jako warunek operatora trójskładnikowego. To złamałoby ten schemat.Perl 6 ,
6766 bajtówZaoszczędzono 1 bajt dzięki @nwellnhof.
Wypróbuj online!
Bardzo niewyobrażalne (i prawdopodobnie złe) rozwiązanie. Zamyka argument z samym sobą. Wynikowa lista jest następnie odwzorowywana na blok, który
EVAL
jest ciągiema (operator) b
. Operator jest wybierany z listy ciągów<+ * - div % **>
za pomocą zmiennej freestate
(pomyślstatic
w C - wartość utrzymuje się w wywołaniach bloku)$
. Jest on tworzony dla każdego bloku osobno i ustawiany na 0. Możesz z nim robić, co tylko chcesz, ale możesz odwoływać się do niego tylko raz (w rzeczywistości każde wystąpienie$
odnosi się do innej zmiennej). Tak$++%6
naprawdę wynosi 0 podczas pierwszego połączenia, 1 podczas drugiego, ... 5 podczas 6, 0 podczas 7 i tak dalej.Na początku próbowałem obejść się bez
EVAL
. Operatory to w rzeczywistości tylko napisy (= funkcje), ale ich nazwy są tak bardzo nieżyczliwe (&infix:<+>
i tak dalej), że musiałem zrezygnować z takiego podejścia.źródło
map {EVAL ".[0] ... .[1]"},zip $_,.reverse
jest o 1 bajt krótszy.Haskell ,
74117105 bajtówWypróbuj online!
Zaoszczędzono 12 bajtów dzięki @nimi
Jest na pewno lepszy sposób na osiągnięcie tego.
EDYCJA 1. Naprawiono wykładnik liczb całkowitych; 2. Jest zdecydowanie lepszy sposób, patrz komentarz poniżej:
9591 bajtówWypróbuj online!
źródło
zipWith3($)(cycle[(+),(*),(-),div,mod,(^)])<*>reverse
To krótsza, teraz usunięta wersja.h
połączeniao
:o a b
a bez tego można inlineh
( TIO ).Python 2 , 71 bajtów
Wypróbuj online!
Zaoszczędzono 2 bajty dzięki ovs!
źródło
J,
4442 bajtyPrzekreślony 44, yada yada ...
-2 bajty dzięki @ ConorO'Brien
Wypróbuj online!
Tyle paren i wkładek ... Z pewnością jest lepszy sposób na zrobienie tego (być może zamiast wstawiania zamiast wstawiania?)
Wyjaśnienie
Niektóre uwagi:
J nie ma podziału na liczby całkowite, więc komponujemy
%
-division z -floor>.
. J's mod (|
) wykonuje odwrotną kolejność, niż byśmy się spodziewali, więc musimy odwrócić jego kolejność używając~
-reflexive.Mimo że poruszamy się w odstępach 2, musimy użyć opcji
/
-insert, aby wstawić czasowniki, aby były używane w sposób dyadyczny, ponieważ tak\
działa -infix.źródło
()
i powtórzyłem/
- nie byłem w stanie tego rozgryźć .../
odwróconej tablicy (ponieważ działa odwrotnie ...) z czasownikami takimi jak,(,+)`(,*)
ale to niewiele pomaga ... (również nie działa)+/`(*/)`...
Rubin ,
6357 bajtówNaprawdę nic szczególnego. Wystarczy wykonać iterację w tablicy, użyć indeksu jako iteratora wstecznego, połączyć w ciąg za pomocą odpowiedniego operatora, ocenić, przepłukać i powtórzyć.
Wypróbuj online!
źródło
k , 40 bajtów
Wypróbuj online!
źródło
MATL ,
2723 bajty-4 bajty dzięki @LuisMendo
Wypróbuj online!
Wyjaśnienie:
źródło
Perl 5 , 68 + 1 (-p) = 69 bajtów
Wypróbuj online!
Pobiera dane wejściowe jako listę liczb oddzieloną spacjami.
źródło
R , 74 bajty
Wypróbuj online!
To jest ostatnia odpowiedź, na którą wpadłem. Zwraca listę długości,
length(l)
gdzie każdy element jest listą zawierającą odpowiedni element. Trochę kiepski, ale wszyscy tam są. Jeśli jest to niedopuszczalne, jeden z nichMap
można zastąpićmapply
znakiem +3 bajtów.Ponieważ operatory R są wszystkimi funkcjami (notacja infiksowa jest po prostu cukrem syntaktycznym), próbowałem wybrać jedną z listy; na przykład 94 bajtowe rozwiązanie poniżej.
Aby spróbować pozbyć się pętli, próbowałem
sapply
, ale działa to tylko z jedną funkcją i listą wejść. Potem przypomniałem sobie formę wielowymiarowąmapply
, która przyjmujen-ary
funkcjęFUN
in
kolejne argumenty, odnoszącFUN
się do pierwszego, drugiego ... elementów każdego z argumentów, w razie potrzeby poddając recyklingowi . Istnieje również funkcja otokimapply
,Map
która „nie próbuje uprościć wyniku” . Ponieważ jest o trzy bajty krótszy, jest to dobra okazja do gry w golfa.Zdefiniowałem więc funkcję trójrzędną (jak w poniższym 80-bajtowym rozwiązaniu), która bierze funkcję za swój pierwszy argument i stosuje ją do drugiej i trzeciej. Jednak zdałem sobie z tego sprawę
Map
jest to funkcja, która przyjmuje funkcję jako pierwszy argument i stosuje ją do kolejnych. Schludny!Na koniec dokonujemy podzbioru na końcu, aby upewnić się, że zwracamy tylko pierwsze
length(l)
wartości.R , 80 bajtów
Wypróbuj online!
Ten nie działa, ponieważ zwróci 6 wartości dla list zawierających mniej niż 6 elementów.
R , 94 bajty
Wypróbuj online!
Objaśnienie (lekko nie golfa):
Ponieważ każda z funkcji jest wektoryzowana, możemy indeksować na końcu (
res[i]
). Jest to lepsze niżeval
poniższe podejście.R , 100 bajtów
Wypróbuj online!
To jest najkrótsze
eval
podejście, jakie udało mi się znaleźć; ponieważ musimy zebrać wyniki w jeden wektor, musimy rozejrzećpaste
sięc( )
wokół wszystkich wyrażeń, co dodaje tonę niepotrzebnych bajtówźródło
Casio-Basic, 108 bajtów
To było bolesne. Zwłaszcza, że
mod(x,y)
powraca,x
gdy tak naprawdę nie powinno, co oznaczało, że musiałem stworzyć własną funkcję mod: stądx-int(x/y)y
.Pętle
i
od 0 dolength(l)-1
, biorąc kolejne elementy nao
liście i ubiegając sięl[i]
ox
il[-i]
dlay
. (indeksy ujemne nie działają, więc zamiast tego odejmujęi
od długości listy i biorę ten indeks).107 bajtów dla funkcji, +1 bajt do dodania
l
w polu parametrów.źródło
Java 8, 336 bajtów
Wypróbuj tutaj.
Westchnienie.
Wejście jako
int[]
, wyjście jakojava.math.BigInteger[]
.Bez reguły „ Aby uwzględnić przypadki narożne, dane wejściowe nigdy nie będą zawierać 0, ale mogą zawierać dowolną liczbę całkowitą z zakresu od ujemnej nieskończoności do dodatniej nieskończoności. ”, Przy użyciu liczb całkowitych z zakresu
-2147483648
do2147483647
, będzie to 186 bajtów (dane wejściowe asint[]
i brak danych wyjściowych, ponieważ zamiast tego modyfikuje tablicę wejściową, aby zapisać bajty):Wypróbuj tutaj.
Wyjaśnienie:
źródło