Znajdź i ^ n, biorąc pod uwagę n

27

Wyzwanie

W jak najmniejszej liczbie znaków znajdź wartość i ^ n, dla której n, dodatnia liczba całkowita większa niż 0. Powinien być wyprowadzony jako ciąg.

Dla tych, którzy nie wiedzą, i jest zdefiniowane tak, że i ^ 2 = -1. Więc:

  • i ^ 1 = i
  • i ^ 2 = -1
  • i ^ 3 = -i
  • i ^ 4 = 1

To się powtarza ...

Zasady

  • Jeśli twój język obsługuje liczby zespolone, nie używaj żadnych funkcji ani arytmetyki, które mogłyby to rozwiązać.
  • Niedokładności zmiennoprzecinkowe są odpowiednie dla odpowiedzi, które i tak zwracałyby ułamki dziesiętne, ale dane liczbowe całkowite powinny dawać dokładne wyniki

Punkty bonusowe

-5, jeśli możesz wypracować wartość, gdzie n jest również ujemne

-15, jeśli możesz obliczyć wartość dla dowolnej liczby rzeczywistej (ta premia obejmuje -5 z powyższej premii)

Powodzenia!

Kezz101
źródło
1
W jakim formacie zwracamy dokładnie? Poprzez wyjście funkcji czy standardowe wyjście?
dumny haskeller
@proudhaskeller Znacznik wiki wymienia wartości domyślne. O ile nie określono inaczej, funkcje i programy są w porządku, wprowadzanie za pomocą argumentu funkcji, STDIN lub argumentu wiersza poleceń i wyprowadzanie za pomocą STDOUT lub zwracanej wartości funkcji. Funkcje nie muszą być nazwane.
Martin Ender
1
@ MartinBüttner, ale jeśli wybiorę dane wyjściowe funkcji, w jaki sposób dane wyjściowe powinny być sformatowane / przechowywane bez natywnych liczb zespolonych w moim języku?
dumny haskeller
16
@BetaDecay Co to są liczby zmiennoprzecinkowe? oO
Martin Ender
2
@ MartinBüttner Haha niepoprawne słowo: / Liczba zmiennoprzecinkowa wtedy
Beta Decay

Odpowiedzi:

15

Rubinowy, wynik -2

(13 bajtów, premia -15)

->n{[1,90*n]}

Funkcje obejmują: brak błędów zaokrąglania! (jeśli przekażesz dane wejściowe jako wymierne)


opublikowane przez autora, Kezz101

Jeśli popierasz dowolną liczbę rzeczywistą, możesz wyprowadzać dane w dowolnej poprawnej złożonej formie.

Negatywne wyniki powodują, że moja adrenalina przyspiesza. W ten sposób nadużywane zasady są wykorzystywane do osiągnięcia tego szlachetnego celu.

Tworzy anonimową funkcję i wyświetla tablicę z 2 pozycjami reprezentującymi liczbę zespoloną w postaci biegunowej (jednostka kątowa: stopnie).

blutorange
źródło
4
„Ruby, -2 bajty” .....
FantaC,
3
Czy pobieranie tego 1 000 000 000 000 razy daje mi 2 TB wolnego miejsca na dysku twardym? Brzmi dla mnie jak dobry interes.
Programy Redwolf
^ Moja przeglądarka uległa awarii, zanim udało mi się to zrobić. Może wypróbujesz „bombę zip” z plikiem w środku? (Wyodrębnianie oszczędza przestrzeń.)
A
15

CJam, 12 znaków - 5 = 7

1'iW"-i"]li=

Sprawdź to tutaj.

Obsługuje negatywne dane wejściowe.

1              "Push 1.";
 'i            "Push the character i.";
   W           "Push -1.";
    "-i"       "Push the string -i.";
        ]      "Wrap all four in an array.";
         li    "Read STDIN and convert to integer.";
           =   "Access array. The index is automatically taken module the array length.";

Wynik jest drukowany automatycznie na końcu programu.

Mathematica, 22 20 19 znaków - 15 = 4

Sin[t=π#/2]i+Cos@t&

Jest to anonimowa funkcja, z której możesz korzystać podobnie jak

Sin[t=π#/2]i+Cos@t&[15]

(Lub przypisz to do fpowiedzenia, a następnie zrób f[15].)

Obsługuje wartości rzeczywiste i daje dokładne wyniki dla wprowadzania liczb całkowitych.

Zauważ, że niei jest to kompleks Mathematica i (który jest ). To tylko niezdefiniowana zmienna.I

Ponadto, pomimo kolejności wyrażenia, Mathematica ponownie uporządkuje dane wyjściowe w R+Ciformę.

Martin Ender
źródło
Nie potrzebujesz 4%. Można to zrobić automatycznie.
jimmy23013
@ user23013 nifty :)
Martin Ender
8
Czy te dwie odpowiedzi nie powinny być osobne?
Justin
@Quincunx Może ... pierwotnie obaj byli w CJam, dlatego też umieściłem je w tej samej odpowiedzi. Ale drugi nie był ważny, więc przeniosłem go do Mathematica, ale zostawiłem tam, gdzie był. Jeśli ludzie nalegają, mogę je rozdzielić.
Martin Ender
I możesz zapisać postać, używając jej f@15zamiast f[15].
orome
14

Python 2 - (24-5) = 19

lambda n:'1i--'[n%4::-2]

Najwięcej zasług należy do @ user2357112, po prostu grałem w golfa jego odpowiedź z komentarzy do tej odpowiedzi .

Objaśnienie: Zaczyna się od indeksu n%4w ciągu '1i--'. Następnie iteruje wstecz w krokach co dwa po każdej literze ciągu. Na przykład n=6zaczynałby się od indeksu 2, pierwszy -, a następnie pomija ii bierze 1, aby wrócić -1.

@xnor wskazał rozwiązanie o tej samej długości:

lambda n:'--i1'[~n%4::2] 

Pyth - ( 14-5 ) = 9

Wydaje mi się, że dostaję tylko 14, bez względu na to, jak próbuję odwrócić / wyciąć / itp. : „(

%_2<"1i--"h%Q4

Który jest zasadniczo taki sam jak powyższa odpowiedź na python, ale w 2 krokach, ponieważ pyth nie obsługuje pełnych opcji indeksowania Pythona. Wypróbuj online.

Idę porozmawiać z isaacgiem na temat indeksowania Pyth;)

FryAmTheEggman
źródło
Czy python nie lambdamusi być przypisany do zmiennej? Przynajmniej, aby go nazwać, musisz go otoczyć nawiasami, dodając dwa bajty, aby można go było wywołać (lambda...)(n).
mbomb007
@ mbomb007 Według meta jest to dopuszczalne. Kod tutaj tworzy funkcję, która wykonuje wymagane zadanie. Anonimowe lambdy są stosunkowo często używane w pythonie dla funkcji takich jak mapi sorted.
FryAmTheEggman
11

TI-BASIC (NSpire) - 5 (20 znaków-15)

cos(nπ/2)+sin(nπ/2)i

Jeśli chcesz otrzymać złożoną wartość zwracaną, zamień ina końcu na (kompleks i).

Shujal
źródło
@ MartinBüttner TI-Basic wydaje się używać pewnego rodzaju typu „Wyrażenie”, a wbudowane metody zwracają dla nich dokładne wyniki.
Shujal
Rozumiem, więc wszystko dobrze. ;)
Martin Ender
Co z zasadą „Jeśli twój język obsługuje liczby zespolone, nie używaj żadnych funkcji ani arytmetyki, które mogłyby to rozwiązać”. + i jest arytmetykiem
edc65
@ edc65 + jest właściwie złożoną operacją. Jeśli jednak ci się to nie podoba, zamień na normalny i. Jeśli zmienna inie jest zdefiniowana, otrzymasz liczbę zespoloną, tylko z izamiast . Po prostu osobno obliczam rzeczywistą i wymyśloną część.
Shujal
1
@Shujal W takim przypadku myślę, że i tak powinieneś użyć i. Złożone „ja” nie jest nawet postacią, o którą pyta pytanie, i pozwoli ci zaoszczędzić dwa bajty, więc przynajmniej powiążesz ze mną;).
Martin Ender
7

Cudowny , 43 bajty

Naprawdę nie jest zwycięzcą, ale Marbelous jest fajny. :)

}0
^0
=0&2
&1
}0
^1\/
=0&02D3169
\/\/&0&1&2

Jest to program, który odczytuje dane wejściowe jako jedną liczbę całkowitą z pierwszego argumentu wiersza poleceń. Zauważ, że dane wejściowe są pobierane modulo 256, ale nie wpływa to na ważność wyniku dla danych wejściowych większych niż 255, ponieważ 256 można podzielić przez 4.

Wyjaśnienie

Marbelous to język programowania 2D, który symuluje „kulki” (wartości bajtów) wpadające przez wiele urządzeń. Tablica składa się z 2-znakowych komórek (urządzeń), które mogą przetwarzać kulki. Wszystko, co spada z dołu planszy, jest drukowane do STDOUT.

Przejrzyjmy używane urządzenia:

  • }0jest tam, gdzie idzie pierwszy argument wiersza poleceń. Użyłem dwóch wystąpień tego urządzenia, więc otrzymuję dwie kopie wartości wejściowej (jednocześnie).
  • ^nsprawdza, czy nbit wejściowego marmuru (gdzie n=0jest najmniej znaczący), produkuje 1lub w 0zależności od bitu.
  • =0sprawdza równość z 0. Jeśli marmur wejściowy jest równy, po prostu spada prosto, jeśli nie, jest przesuwany w prawo.
  • \/ to kosz na śmieci, więc połyka marmur wejściowy i nigdy nic nie wytwarza.
  • 2Djest kodem ASCII dla -, 31jest kodem ASCII dla 1i 69jest kodem ASCII dla i.
  • &nSą synchronizatory. Synchronizatory zatrzymują marmur, dopóki wszystkie synchronizatory z tym samym nie nutrzymają marmuru, w którym to momencie wszyscy przepuszczą przechowywany marmur.

W efekcie chcę zachować trzy odpowiednie znaki w trzech synchronizatorach i zwolnić je w zależności od ustawienia najmniej znaczących bitów na wejściu.

Aby uzyskać więcej informacji, zobacz wersję roboczą specyfikacji .

Martin Ender
źródło
1
Naprawdę podoba mi się ten! Cudowne brzmi super Będę musiał to wkrótce sprawdzić :)
Kezz101
3
@ Kezz101 Mamy tutaj
Martin Ender
Och, miło! Wygląda naprawdę interesująco
Kezz101
Nie zapominaj, że możesz podawać dane wejściowe do płyty głównej w wierszu poleceń, aby można było używać tej płyty w niezmienionej postaci.
Sparr
1
@overactor Hm, nie wiem ... wypisywanie dodatkowych znaków (nawet jeśli nie można ich wydrukować) nadal wydaje mi się naruszać format wyjściowy. Może być warte meta pytania.
Martin Ender
6

JavaScript (ES6) 29-5 = 24

Obsługuje moc ujemną.

f=n=>(n&2?'-':'')+(n&1?'i':1)

ES5:

function f(n){return (n&2?'-':'')+(n&1?'i':1)}
Michael M.
źródło
Tak, krótsze ( f=n=>[1,'i',-1,'-i'][n%4]). Ale jest mniej seksowny i nie będzie obsługiwał negatywnych mocy. To chyba zależy od premii.
Michael M.
Nie, 29 bajtów. Negatywne są obsługiwane przez ten kod.
Michael M.
Czy JS ma &operator bitowy ? Jeśli tak, możesz zrobić &3dla prawdziwej operacji modułu 4. Edycja: wygląda tak, jak ma &2to miejsce w twojej odpowiedzi ...
feersum
5

Python 28 bajtów - 5 = 23

Obsługuje wejścia -ve.

Zakładając, że funkcje lambda są dopuszczalne (dzięki FryAmTheEggman!):

lambda n:n%4/2*'-'+'1i'[n%2]

w przeciwnym razie 31 bajtów - 5 = 26

print[1,"i",-1,"-i"][input()%4]
Cyfrowa trauma
źródło
1
Nie możesz tego nazwać dokładnie. Musisz go przechowywać w miejscu, do którego masz dostęp. Więc możesz zrobić foo=...lub możesz map(<your lambda>,range(10))uzyskać listę wartości i^nod 0-9.
FryAmTheEggman
2
Zasadniczo tworzysz wskaźnik funkcji, jeśli jest to bardziej jasne: P
FryAmTheEggman
3
@DigitalTrauma: Tak, chociaż możesz lepiej radzić sobie z trikami do krojenia strun. Na przykład lambda n:'--1i'[n%4-2::2].
użytkownik2357112 obsługuje Monikę
2
Aby przetłumaczyć post użytkownika user2357112: Weź co drugą postać, '--1i'zaczynając od indeksu n%4-2. Gdy python otrzyma indeks ujemny, zacznie tyle pozycji pozostałych od końca tablicy, a następnie przejdzie do 0. W ten sposób 0i 1nigdy nie uderzaj w -znaki, póki 3i 4czyń.
FryAmTheEggman
1
lambda n:n%4/2*'-'+'1i'[n%2]Usuwa przestrzeń i jest krótsza :)
FryAmTheEggman
4

(Emacs) Lisp - 34

Dla zabawy w (Emacs) Lisp:

(lambda(n)(elt[1 i -1 -i](% n 4)))

Jeśli chcesz go użyć, użyj a defunlub użyj funcall:

(funcall
 (lambda (n) (elt [1 i -1 -i] (% n 4)))
 4) => 1

(mapcar
 (lambda(n)(elt[1 i -1 -i](% n 4)))
 [0 1 2 3 4 5 6 7 8])
 => (1 i -1 -i 1 i -1 -i 1)
Sean Allred
źródło
4

APL (Dyalog) , 8 znaków - 15 bonusów = wynik -7

Wbudowana (i dlatego zabroniona) funkcja jest 0J1*⊢, ale używa ona metody @ blutorange .

¯12○.5×○

Autor wyzwania, Kezz101, napisał :

Jeśli popierasz dowolną liczbę rzeczywistą, możesz wyprowadzać dane w dowolnej poprawnej złożonej formie.

Zwraca liczbę zespoloną w postaci, aJbktóra jest normalnym sposobem wyświetlania przez APL liczb zespolonych.

Wypróbuj online!

Wyjaśnienie

¯12○ znajdź wektor jednostki, który ma kąt w radianach

.5× pół razy

 argument pomnożony przez 𝜋 (stała koła)

Adám
źródło
3

Pure Bash, 29 bajtów - 5 = 24

Obsługuje wejścia -ve.

a=(1 i -1 -i)
echo ${a[$1%4]}
Cyfrowa trauma
źródło
3

Befunge-98, 41-5 = 36 35-5 = 30 32-5 = 27

&4%:01-`!4*+:2%'8*'1+\2/d*' +,,@

Obsługuje ujemne liczby całkowite. Nie zdobędziesz żadnych nagród dzięki temu rozwiązaniu, ale cokolwiek.

Po prostu akceptuje liczbę jako dane wejściowe, robi sztuczkę z modułem (który, frustrująco, nie działa jak zwykły moduł dla liczb ujemnych w interpreterie, którego testowałem), aby działały ujemne, a następnie robi głupie warunki zdecyduj, jaka powinna być każda postać.

Jestem pewien, że można to jeszcze bardziej pograć w golfa. Na razie oto inne rozwiązanie, które nie akceptuje negatywów, ale rekompensuje utratę premii, ponieważ jest krótsza:

Befunge-98, 32 26 23

&4%:2%'8*'1+\2/d*' +,,@

Edytuj - teraz wykorzystuje fakt, że „-” to 13 (0xd) znaków od „”.

Edycja 2 - Teraz ponownie wykorzystuje fakt, że „i” to 56 (0x38 lub '8) znaków od „1”.

Kasran
źródło
3

Wynik Java 8: 72

W Javie najgorszy język gry w golfa! Gra w golfa:

java.util.function.Function s=n->{new String[]{"i","-1","-i","1"}[n%4]};

Rozszerzony:

class Complex{

    java.util.function.Function s = n -> {new String[]{"i","-1","-i","1"}[n%4]};

}

Uwaga: Nie jestem przyzwyczajony do Java 8. Nie mam jeszcze dla niego środowiska uruchomieniowego. Poinformuj mnie, czy występują jakieś błędy składniowe. To także mój pierwszy golf.

Edycja: usunięto import.

Edycja: Usunięto deklarację klasy.

Kolejna odpowiedź z wynikiem = 87–15 = 72

java.util.function.Function s=n->{Math.cos(n*Math.PI/2)+"+"+Math.sin(n*Math.PI/2)+"i"};

Rozszerzony:

class Complex{

    java.util.function.Function s = n -> {Math.cos(n * Math.PI/2) + " + " + Math.sin(n * Math.PI/2) + "i"};

}
Numer jeden
źródło
Możesz zaoszczędzić trochę za pomocą „import java.util. *”
Anubian Noob
@Anubian Funkcja Noob klasa jest w opakowaniu java.util.functionnie java.util(czy się mylę?).
TheNumberOne
Ale jeśli tak java.util.*się .*wszystko środki na przywóz w ramach pakietu. Tak jak obecnie importujesz wszystkie klasy z fuctionpakietu.
Anubian Noob
5
@ Anubian Noob importimportuje tylko klasy z tego pakietu. Nie importuje żadnej klasy z pakietów w tym pakiecie. Na przykład klasa Functionjest w pakiecie, java.util.functionale nie w pakiecie java.util.
TheNumberOne
Przykro mi, przepraszam za to.
Anubian Noob
3

MATLAB, 33 bajty - 5 = 28

x={'i','-1','-i','1'};x(mod(n,4))

Chociaż jest to o kilka bajtów więcej (37-5 = 32), tak naprawdę podoba mi się to podejście:

x='1i -';x((mod([n/2,n],2)>=1)+[3,1])
Stewie Griffin
źródło
i^3oznacza -iraczej i, że dodaje tylko 1 znak. - Sidenote dla innych czytelników: bez pierwszej reguły wyzwania rozwiązanie Matlab miałoby tylko 3 znaki.
Dennis Jaheruddin
Tak, to była literówka. Naprawiony! Dzięki za zauważenie ... Przynajmniej drugie (nieco bardziej interesujące) podejście jest poprawne =)
Stewie Griffin
3

C 77

main(){int n;scanf("%d",&n);char c[]={n%4>1?'-':' ',~n%2?'1':'i',0};puts(c);}

Ulepszony dzięki Ruslanowi

C 74–5 = 69

No i oczywiście najbardziej oczywiste podejście

main(){unsigned n,*c[]={"1","i","-1","-i"};scanf("%d",&n);puts(c[n%4]);}
Rames
źródło
2
Możesz usunąć nawiasy wokół n%2i użyć ~zamiast tego, !ponieważ nnajpierw negowanie , a następnie %ing z 2 da ten sam wynik, przynajmniej dla n<(1<<32)-1. A C nie wymaga jawnego definiowania typu zwracanego dla funkcji, więc możesz usunąć go int na początku. A także użyj 0zamiast '\0'. Zatem -9 znaków.
Ruslan
3

OCaml 47

let m n=List.nth["1";"i";"-1";"-i"](n mod 4);;

Nie jest to nagradzane rozwiązanie, ale to mój pierwszy raz w golfa, więc nie jestem do końca pewien, co robię. Próbowałem użyć dopasowania wzorca, ale uzyskałem ponad 58.

numer użytkownika
źródło
3

Pari / GP , 19 bajtów - 5 = 14

CR[x]/(x2+1)

n->Str(i^n%(i^2+1))

To itylko symbol, a nie wyimaginowana jednostka (która jest Iw Pari / GP).

Wypróbuj online!

alephalpha
źródło
2

Rubin 32-5 = 27

puts(%w[1 i -1 -i][gets.to_i%4])

Działa dla negatywnych mocy!

MegaTom
źródło
Możesz w bardziej trywialny sposób grać w golfa puts %w[1 i -1 i][gets.to_i % 4].
histocrat
2

Perl, 26 - 5 = 21

say qw(1 i -1 -i)[pop()%4]

działa jako samodzielny program (argument w wierszu poleceń) lub treść funkcji.

Hobbs
źródło
2

Java: 151 131–5 = 126

Gra w golfa:

class A{public static void main(String[]a){int n=Integer.parseInt(a[0]);System.out.print(n%4==0?"1":n%4==1?"i":n%4==2?"-1":"-i");}}

Nie golfowany:

class A {
    public static void main(String[] a) {
        int n = Integer.parseInt(a[0]);
        System.out.print(n % 4 == 0 ? "1" : n % 4 == 1 ? "i" : n % 4 == 2 ? "-1" : "-i");
    }
}

W funkcji: 72-5 = 67

Gra w golfa:

void f(int n){System.out.print(n%4==0?"1":n%4==1?"i":n%4==2?"-1":"-i");}

Nie golfowany:

public void f(int n) {
    System.out.print(n % 4 == 0 ? "1" : n % 4 == 1 ? "i" : n % 4 == 2 ? "-1" : "-i");
}

Tak, jeszcze jedna odpowiedź Java - i grał jeszcze gorzej niż kiedykolwiek. Ale pracujesz z tym, co możesz ...

EDYCJA : dodano wersję funkcji.

EDYCJA 2 : więc po trochę prób i błędów, oto wersja, która próbuje to zrobić przy książce, bez eksploracji luki w cyklu. Więc…

Java z obliczeniem wartości: 146-15 = 131

Gra w golfa:

class B{public static void main(String[]a){float n=Float.parseFloat(a[0]);System.out.print(Math.cos((n*Math.PI)/2)+Math.sin((n*Math.PI)/2)+"i");}}

Nie golfowany:

class B {
    public static void main(String[] a) {
        float n = Float.parseFloat(a[0]);
        System.out.print(Math.cos((n * Math.PI) / 2) + Math.sin((n * Math.PI) / 2) + "i");
    }
}

(przynajmniej myślę, że mogę odebrać najwyższy bonus, popraw mnie inaczej)

Rodolfo Dias
źródło
możesz zmniejszyć swój kod, jeśli podasz go jako argument główny.
user902383
@ user902383 Rzeczywiście zawsze mógłbym wykonać jakąś funkcję. Prawdopodobnie opublikuje również obie wersje.
Rodolfo Dias
właściwie zastanawiałem się nad jego analizą, więc będziesz miećint n = Integer.parseInt(a[0])
user902383
@ user902383 Daaaaamn, nawet tego nie pamiętał. kciuki w górę
Rodolfo Dias
2

Python - 31

print[1,'i',-1,'-i'][input()%4]

Dopiero niedawno zacząłem uczyć się języka Python. Chociaż wiem, że to nie jest dobre, to najlepsze, co mogę zrobić.

kukac67
źródło
2

Haskell GHCi, 29 bajtów - 15 = 14

i p=[cos(p*pi/2),sin(p*pi/2)]

Stosowanie:

*Main> i 0
[1.0,0.0]
*Main> i pi
[0.22058404074969779,-0.9753679720836315]
*Main> i (-6.4)
[-0.8090169943749477,0.5877852522924728]
Wypożyczenie
źródło
2

R , 29 - 5 = 24 bajty

c(1,"i",-1,"-i")[scan()%%4+1]

Wypróbuj online!

Tak jak większość metod powyżej, przyjmuje moduł 4 i zwiększa go o 1, ponieważ tablice R są indeksowane 1. Działa również dla ujemnych liczb całkowitych.

Martwiłem się tutaj o mieszane wyjścia, ale Giuseppe wskazał, że R wymusza typy liczbowe na typy łańcuchowe, gdy są one mieszane.

Sumner18
źródło
29 - 5 = 24 bajty
Giuseppe,
@Giuseppe Całkowicie obojętnie na to. Martwię się o to, że dane wyjściowe są technicznie mieszane, pół łańcuchowe, pół numeryczne.
Sumner18
nie, R automatycznie wymusza numerictypy na charactermieszane! Książka Hadleya wyjaśnia to całkiem dobrze - wystarczy Ctrl + F na „Coercion” i zobaczysz ją, ale cała książka jest warta przeczytania (głównie do celów innych niż golfa, ale czasami bierzesz lewę lub dwie, heheh )
Giuseppe
1

Haskell, 29 bajtów - 5 = 24

f n=words"1 i -1 -i"!!mod n 4

Działa dla mocy ujemnych.

Rozpracowałem wersję bezcelową, ale okazuje się, że jest ona rzeczywiście dłuższa.

f=(words"1 i -1 -i"!!).(`mod`4)
colevk
źródło
1

Clojure ( 64 54 31 znaków)

(defn i2n[n](println(case(mod n 4) 1 "i" 2 "-1" 3 "-i" 0 "1")))

Edytować

Zgodnie z sugestią @ SeanAllred, oto wersja, która używa dosłownego wektora zamiast casefunkcji:

(defn i2n[n](println (["1" "i" "-1" "-i"] (mod n 4))))

Edytuj 2

Licząc na REPL, aby wydrukować wynikową kolekcję i zakodować funkcję za pomocą #()skrótu, możemy ją zredukować

#(["1" "i" "-1" "-i"](mod % 4))

(Co w rzeczywistości jest o wiele bardziej Clojure / Lisp-ish, ponieważ funkcja faktycznie zwraca teraz wygenerowany wynik, umożliwiając użycie funkcji map, jak w

(map #(["1" "i" "-1" "-i"](mod % 4)) [0 1 2 3 4 5 6 7 8])

który drukuje

("1" "i" "-1" "-i" "1" "i" "-1" "-i" "1")

Udostępnij i ciesz się.

Bob Jarvis - Przywróć Monikę
źródło
Czy zamiast używać struktury select nie możesz użyć jakiejś jawnej tablicy, jak w mojej odpowiedzi ?
Sean Allred
1

Groovy: 27-5 = 22

f={n->[1,'i',-1,'-i'][n%4]}
Armand
źródło
1

C 105 wynosił 117

char c[2];
int main()
{
int n,i,j=0;scanf("%d",&n);i=n%4;
i>1?c[j++]='-':c[j+1]='\0';
c[j]=i&1?'i':'1';
puts(c);
}
Bacchusbeale
źródło
To nawet nie skompilować, ponieważ trzeba brać w nawias przypisania po :w ?:sprawozdaniu w zwykły C. Ponadto, jaki jest sens używania 0==0, kiedy można użyć pojedynczego char 1? I nie ma potrzeby wcześniej w nawiasach ?. Ostatnie ?:oświadczenie można również skrócić c[j]=i&1?'i':'1';.
Ruslan
@ Ruslan W CodeBlocks Mingw jest tylko 1 ostrzeżenie wokół i & 0. i & 0 == 0 jest testem na parzyste, jeśli i jest parzyste, wynikiem jest 0, w przeciwnym razie jest to 1.
bacchusbeale
Tak, ale po co używać, 0==0kiedy jest identyczny 1? Zauważ, że ==ma wyższy priorytet niż &, w przeciwnym razie twój (przypuszczalny) test (i&0)==0zawsze byłby prawdziwy.
Ruslan
1

PARI / GP , 26 - 5 = 21

n->Str([1,I,-1,-I][n%4+1])

n->cos(t=Pi*n/2)+I*sin(t)jest o jedną postać krótszy, ale nie obsługuje dokładnych odpowiedzi. Oczywiście n->I^njest niedozwolone, i prawdopodobnie także PARI powIs.

Charles
źródło
1

Galaretka , 2-20 = -18 bajtów

ı*

Wypróbuj online!

Nie używa i ^ xwbudowanego, ale używa wbudowanego 1ji **dlatego nie jestem pewien, czy jest dozwolony.

Erik the Outgolfer
źródło
„Jeśli twój język obsługuje liczby zespolone, nie używaj żadnych funkcji ani arytmetyki, które mogłyby to rozwiązać”. Myślę, że to całkiem jasne ...
całkowicie ludzki,
@totallyhuman Cóż, nie jestem pewien, czy 1j dosłownie jest również zbanowany?
Erik the Outgolfer,
Tak, ale arytmetyka ( *) jest.
całkowicie ludzki,
1
@ totalniehuman Hm, może dodam inną wersję poniżej, chociaż „nie używaj żadnych funkcji ani arytmetyki, które mogłyby to rozwiązać” wydaje się sugerować, że nie mogę użyć wbudowanego do wykonania tego dokładnego zadania ... BTW w sposób, w jaki mówi, sprawia, że ​​myślę, że zachęca cię do używania 1jliterałów.
Erik the Outgolfer,
1

05AB1E , wynik 5 (10 bajtów - 5 bonusów)

'i®„-i1)Iè

Wypróbuj online lub sprawdź kilka innych przypadków testowych .

Wyjaśnienie:

'i         '# Push character "i"
  ®         # Push -1
   „-i      # Push string "-i"
      1     # Push 1
       )    # Wrap everything on the stack into a list: ["i", -1, "-i", 1]
        Iè  # Use the input to index into it (0-based and with automatic wrap-around)
            # (and output the result implicitly)
Kevin Cruijssen
źródło