Find i ^ n, gegeben n

27

Die Herausforderung

Suchen Sie in möglichst wenigen Zeichen den Wert von i ^ n, wobei n eine positive Ganzzahl größer als 0 ist. Dies sollte als Zeichenfolge ausgegeben werden.

Für diejenigen, die es nicht wissen, ist i so definiert, dass i ^ 2 = -1 ist. So:

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

Dies wiederholt sich dann ..

Regeln

  • Wenn Ihre Sprache komplexe Zahlen unterstützt, verwenden Sie keine Funktionen oder Arithmetik, die dies bewirken könnten.
  • Gleitkomma-Ungenauigkeiten sind in Ordnung für Antworten, die ohnehin Dezimalstellen zurückgeben würden, aber Ganzzahleingaben sollten genaue Ergebnisse liefern

Bonuspunkte

-5, wenn Sie den Wert berechnen können, bei dem n ebenfalls negativ ist

-15 wenn Sie den Wert für eine reelle Zahl berechnen können (dieser Bonus beinhaltet den -5 aus dem obigen Bonus)

Viel Glück!

Kezz101
quelle
1
In welchem ​​Format geben wir genau zurück? Durch Funktionsausgabe oder stdout?
stolzer Haskeller
@proudhaskeller Das Tag-Wiki listet die Standardeinstellungen dafür auf. Sofern nicht anders angegeben, sind Funktionen und Programme in Ordnung. Sie werden über Funktionsargument, STDIN oder Befehlszeilenargument eingegeben und über STDOUT oder Funktionsrückgabewert ausgegeben. Funktionen müssen nicht benannt werden.
Martin Ender
1
@ MartinBüttner aber wenn ich Funktionsausgabe wähle, wie soll die Ausgabe ohne native komplexe Zahlen in meiner Sprache formatiert / gespeichert werden?
stolzer Haskeller
16
@BetaDecay Was sind Gleitkommazahlen? oO
Martin Ender
2
@ MartinBüttner Haha falsches Wort: / Gleitkommazahl dann
Beta Decay

Antworten:

15

Ruby, Gäste -2

(13 Bytes, -15 Bonus)

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

Eigenschaften umfassen: keine Rundungsfehler! (Wenn Sie die Eingabe als Rational übergeben)


Gepostet vom Autor, Kezz101

Wenn Sie eine reelle Zahl unterstützen, können Sie diese in einer beliebigen gültigen komplexen Form ausgeben.

Negative Werte bringen mein Adrenalin in die Höhe. So werden die Regeln missbraucht , um dieses edle Ziel zu erreichen.

Erstellt eine anonyme Funktion und gibt ein Array mit 2 Einträgen aus, die eine komplexe Zahl in polarer Form darstellen (Winkeleinheit: Grad).

blutorange
quelle
4
"Ruby, -2 Bytes" .....
FantaC
3
Gibt mir das 1.000.000.000.000-fache Herunterladen 2 TB freien Festplattenspeicherplatz? Klingt für mich nach einem guten Geschäft.
Redwolf-Programme
^ Mein Browser ist kaputt gegangen, bevor ich das geschafft habe. Vielleicht versuchen Sie eine "Zip-Bombe" mit der Datei im Inneren? (Extrahierung es Platz spart.)
A
15

CJam, 12 Zeichen - 5 = 7

1'iW"-i"]li=

Teste es hier.

Unterstützt negative Eingänge.

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.";

Das Ergebnis wird am Ende des Programms automatisch ausgedruckt.

Mathematica, 22 20 19 Zeichen - 15 = 4

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

Dies ist eine anonyme Funktion, die Sie gerne nutzen können

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

(Oder weisen Sie es zu f, um zu sagen und dann zu tun f[15].)

Unterstützt Real und liefert exakte Ergebnisse für die Ganzzahleingabe.

Beachten Sie, dass das iist nicht Mathematicas Komplex i (das ist I). Es ist nur eine undefinierte Variable.

Trotz der Reihenfolge des Ausdrucks ordnet Mathematica die Ausgabe in eine neue R+CiForm.

Martin Ender
quelle
Das brauchst du nicht 4%. Dies kann automatisch erfolgen.
Jimmy23013
@ user23013 geschickt :)
Martin Ender
8
Sollten die beiden Antworten nicht getrennt sein?
Justin
@Quincunx Vielleicht ... ursprünglich waren sie beide in CJam, weshalb ich sie in die gleiche Antwort gesteckt habe. Aber der zweite war nicht gültig, also habe ich ihn nach Mathematica portiert, aber dort belassen, wo er war. Wenn die Leute darauf bestehen, kann ich sie aufteilen.
Martin Ender
Und Sie können ein Zeichen speichern, indem Sie es mit f@15anstelle von verwenden f[15].
Orome
14

Python 2 - (24-5) = 19

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

Das meiste Lob gehört @ user2357112, ich habe gerade seine Antwort aus den Kommentaren zu dieser Antwort etwas mehr herausgespielt.

Erläuterung: Beginnt am Index n%4in der Zeichenfolge '1i--'. Anschließend wird über jeden Buchstaben in der Zeichenfolge in Zweierschritten rückwärts iteriert. So n=6würde zum Beispiel bei Index 2 der erste beginnen -, dann den überspringen iund den nehmen 1, um zurückzukehren -1.

@xnor wies auf eine Lösung gleicher Länge hin:

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

Pyth - (14-5) = 9

Ich kann nur scheinen, 14 zu erhalten, egal wie ich versuche, / slice / etc. umzukehren. : '(

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

Dies ist im Wesentlichen dasselbe wie die obige Python-Antwort, jedoch in zwei Schritten, da Pyth nicht die vollständigen Indizierungsoptionen von Python unterstützt. Probieren Sie es online aus.

Ich werde mit isaacg über Pyth-Indizierung sprechen;)

FryAmTheEggman
quelle
Muss der Python nicht lambdaeiner Variablen zugewiesen werden? Um es aufzurufen, müssen Sie es mindestens mit Klammern umgeben und zwei Bytes hinzufügen, damit es aufgerufen werden kann (lambda...)(n).
mbomb007
@ mbomb007 Laut Meta ist das akzeptabel. Der Code hier erstellt eine Funktion, die die erforderliche Aufgabe ausführt. Anonyme Lambdas werden in Python relativ häufig für Funktionen wie mapund verwendet sorted.
FryAmTheEggman
11

TI-BASIC (NSpire) - 5 (20 Zeichen - 15)

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

Wenn Sie einen komplexen Rückgabewert erhalten möchten, ersetzen Sie den iam Ende durch (complex i).

Shujal
quelle
@ MartinBüttner TI-Basic scheint eine Art 'Ausdruck' zu verwenden, und die eingebauten Methoden geben für diese exakte Ergebnisse zurück.
Shujal
Ich verstehe, dann ist alles gut. ;)
Martin Ender
Was ist mit der Regel "Wenn Ihre Sprache komplexe Zahlen unterstützt, verwenden Sie keine Funktionen oder Arithmetik, die dies bewirken könnten." + i is arithmetic
edc65
@ edc65 Das + ist eigentlich eine komplexe Operation. Wenn Ihnen das nicht gefällt, ersetzen Sie das durch ein normales i. Wenn die Variable inicht definiert ist, erhalten Sie die komplexe Zahl nur mit ianstelle von . Ich berechne nur den Realteil und den Imaginärteil getrennt.
Shujal
1
@Shujal In diesem Fall sollte man meiner Meinung nach isowieso verwenden. Der Komplex, den ich habe, ist nicht einmal der Charakter, den die Frage verlangt, und es spart dir zwei Bytes, also würdest du wenigstens mit mir binden;).
Martin Ender
7

Marbelous , 43 Bytes

Nicht wirklich ein Gewinner, aber Marbelous macht Spaß. :)

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

Dies ist ein Programm, das die Eingabe als einzelne Ganzzahl aus dem ersten Befehlszeilenargument liest. Beachten Sie, dass die Eingabe modulo 256 verwendet wird, dies wirkt sich jedoch nicht auf die Gültigkeit des Ergebnisses für Eingaben über 255 aus, da 256 durch 4 teilbar ist.

Erläuterung

Marbelous ist eine 2D-Programmiersprache, die "Marmor" (Byte-Werte) simuliert, die durch eine Reihe von Geräten fallen. Die Tafel besteht aus 2 Zeichen breiten Zellen (den Geräten), die die Murmeln verarbeiten können. Alles, was von der Unterseite einer Platine fällt, wird auf STDOUT gedruckt.

Lassen Sie uns die verwendeten Geräte durchgehen:

  • }0Hier setzt das erste Befehlszeilenargument an. Ich habe zwei Instanzen dieses Geräts verwendet, sodass ich (gleichzeitig) zwei Kopien des Eingabewerts erhalte.
  • ^nprüft , ob das ndritte Bit der Eingabemurmel (wobei n=0das niedrigstwertige Bit ist) und erzeugt 1oder 0hängt vom Bit ab.
  • =0prüft auf Gleichheit mit 0. Wenn die Eingabemurmel gleich ist, fällt sie gerade durch, wenn nicht, wird sie nach rechts gedrückt.
  • \/ Ist ein Mülleimer, so schluckt er nur den Eingabemarmor und produziert nie etwas.
  • 2Dist der ASCII-Code von -, 31ist der ASCII-Code von 1und 69ist der ASCII-Code von i.
  • Das &nsind Synchronisierer. Synchronisierer blockieren eine Kugel, bis alle Synchronisierer mit derselben nKugel eine festhalten. An diesem Punkt lassen sie alle ihre gelagerte Kugel fallen.

Eigentlich muss ich also die drei relevanten Zeichen in drei Synchronisierern halten und diese freigeben, je nachdem, wie die niedrigstwertigen Bits in der Eingabe gesetzt sind.

Weitere Informationen finden Sie im Spezifikationsentwurf .

Martin Ender
quelle
1
Ich mag dieses wirklich! Marbelous klingt fabelhaft Ich muss es irgendwann mal
ausprobieren
3
@ Kezz101 Wir haben einen spec Entwurf bekam hier
Martin Ender
Oh schön! Es sieht wirklich interessant aus
Kezz101
Vergessen Sie nicht, dass Sie der Hauptplatine über die Befehlszeile Eingaben geben können, damit diese Platine unverändert verwendet werden kann.
Sparr
1
@overactor Hm, ich weiß nicht ... die Ausgabe zusätzlicher Zeichen (auch wenn sie nicht druckbar sind) scheint immer noch das Ausgabeformat für mich zu verletzen. Könnte aber eine Meta-Frage wert sein.
Martin Ender
6

JavaScript (ES6) 29-5 = 24

Unterstützt negative Kraft.

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

ES5:

function f(n){return (n&2?'-':'')+(n&1?'i':1)}
Michael M.
quelle
Ja, kürzer ( f=n=>[1,'i',-1,'-i'][n%4]). Aber es ist weniger sexy und unterstützt keine negativen Kräfte. Es kommt auf den Bonus an, denke ich.
Michael M.
Nein, 29 Bytes. Negative werden mit diesem Code unterstützt.
Michael M.
Hat JS eine bitweise & Operator? Wenn ja, können Sie &3eine echte Modul-4-Operation durchführen. Bearbeiten: Es sieht so aus, als würde &2es in Ihrer Antwort verwendet ...
Feersum
5

Python 28 Bytes - 5 = 23

Unterstützt -ve Eingänge.

Vorausgesetzt, Lambda-Funktionen sind akzeptabel (Danke FryAmTheEggman!):

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

ansonsten 31 Bytes - 5 = 26

print[1,"i",-1,"-i"][input()%4]
Digitales Trauma
quelle
1
Man kann es nicht genau nennen. Sie müssen es an einem Ort aufbewahren, auf den Sie zugreifen können. Sie könnten also tun foo=..., oder Sie könnten tun map(<your lambda>,range(10)), um eine Liste der Werte i^nvon zu erhalten 0-9.
FryAmTheEggman
2
Grundsätzlich machen Sie einen Funktionszeiger, wenn das klarer ist: P
FryAmTheEggman
3
@DigitalTrauma: Ja, obwohl Sie mit Tricks zum Schneiden von Strings möglicherweise bessere Ergebnisse erzielen können. Zum Beispiel lambda n:'--1i'[n%4-2::2].
user2357112 unterstützt Monica
2
So übersetzen Sie den Beitrag von user2357112: Nehmen Sie alle anderen Zeichen '--1i'ab dem Index n%4-2. Wenn Python einen negativen Index erhält, werden so viele Positionen vom Ende des Arrays übrig gelassen, und es wird nach oben gegangen 0. Auf diese Weise 0und 1nie die -Zeichen treffen , während 3und zu 4tun.
FryAmTheEggman
1
lambda n:n%4/2*'-'+'1i'[n%2]Entfernt das Leerzeichen und ist kürzer :)
FryAmTheEggman
4

(Emacs) Lisp - 34

Nur zum Spaß in (Emacs) Lisp:

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

Wenn du es benutzen willst, benutze a defunoder benutze 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
quelle
4

APL (Dyalog) , 8 Zeichen - 15 Bonus = Punktzahl -7

Die eingebaute (und damit verbotene) Funktion ist 0J1*⊢, aber dies verwendet die @ blutorange-Methode .

¯12○.5×○

Der Herausforderungsautor Kezz101 schrieb :

Wenn Sie eine reelle Zahl unterstützen, können Sie diese in einer beliebigen gültigen komplexen Form ausgeben.

Dies gibt eine komplexe Zahl in der Form zurück aJb, wie es für APL üblich ist, komplexe Zahlen anzuzeigen.

Probieren Sie es online!

Erläuterung

¯12○ Finden Sie den Einheitsvektor, der den Winkel im Bogenmaß von hat

.5× ein halbes mal

 das Argument multipliziert mit 𝜋 (die Kreiskonstante)

Adam
quelle
3

Pure Bash, 29 Bytes - 5 = 24

Unterstützt -ve Eingänge.

a=(1 i -1 -i)
echo ${a[$1%4]}
Digitales Trauma
quelle
3

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

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

Unterstützt negative ganze Zahlen. Mit dieser Lösung werden keine Preise gewonnen, aber was auch immer.

Es akzeptiert nur eine Zahl als Eingabe, verändert den Modul (was frustrierenderweise nicht wie der übliche Modul für negative Zahlen in dem Interpreter funktioniert, den ich zum Testen verwendet habe), damit Negative funktionieren, und führt dann einige alberne Bedingungen aus Entscheide, was jeder Charakter sein soll.

Ich bin sicher, das kann man noch viel weiter spielen. Im Moment gibt es eine andere Lösung, die keine Negative akzeptiert, aber den Verlust des Bonus durch Kürzung ausgleicht:

Befunge-98, 32 26 23

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

Bearbeiten - Nutzt nun die Tatsache, dass "-" 13 (0xd) Zeichen von "" entfernt ist.

Edit 2 - Nutzt nun wieder die Tatsache, dass "i" 56 (0x38 oder '8) Zeichen von "1" entfernt ist.

Kasran
quelle
3

Java 8 Ergebnis: 72

In Java die schlechteste Golfsprache aller Zeiten! Golf gespielt:

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

Erweitert:

class Complex{

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

}

Hinweis: Ich bin nicht an Java 8 gewöhnt. Ich habe auch noch nicht die Laufzeit dafür. Bitte teilen Sie mir mit, ob Syntaxfehler vorliegen. Dies ist auch mein erstes Golf.

Bearbeiten: entfernt import.

Bearbeiten: Klassendeklaration entfernt.

Eine weitere Antwort mit Punktzahl = 87 - 15 = 72

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

Erweitert:

class Complex{

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

}
Die Nummer eins
quelle
Sie können einige mit "import java.util. *"
Anubian Noob
@ Anubian Noob Class Function ist im Paket java.util.functionnicht java.util(oder irre ich mich?).
TheNumberOne
Aber wenn Sie tun java.util.*das .*Mittel Import alles unter dem Paket. Genauso, wie Sie derzeit alle Klassen im fuctionPaket importieren .
Anubian Noob
5
@ Anubian Noob importimportiert nur die Klassen in diesem Paket. Es werden keine Klassen aus Paketen in diesem Paket importiert. Zum Beispiel ist class Functionin package, java.util.functionaber nicht in package java.util.
TheNumberOne
Oh, tut mir leid.
Anubian Noob
3

MATLAB, 33 Bytes - 5 = 28

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

Obwohl es ein paar Bytes mehr sind (37-5 = 32), gefällt mir dieser Ansatz besser:

x='1i -';x((mod([n/2,n],2)>=1)+[3,1])
Stewie Griffin
quelle
i^3ist -i, anstatt zu iraten, dass es nur 1 Zeichen hinzufügt. - Hinweis für andere Leser: Ohne die erste Regel der Herausforderung wäre die Matlab-Lösung nur 3 Zeichen lang.
Dennis Jaheruddin
Ja, das war ein Tippfehler. Fest! Vielen Dank, dass Sie es bemerkt haben ... Zumindest der zweite (etwas interessantere) Ansatz ist richtig =)
Stewie Griffin
3

C 77

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

Dank Ruslan verbessert

C 74-5 = 69

Oh und natürlich der naheliegendste Ansatz

main(){unsigned n,*c[]={"1","i","-1","-i"};scanf("%d",&n);puts(c[n%4]);}
Rames
quelle
2
Sie können Klammern entfernen n%2und verwenden, ~anstatt zuerst zu !negieren n, und dann %mit 2 das gleiche Ergebnis zu erzielen, zumindest für n<(1<<32)-1. Und C muss den Rückgabetyp für die Funktion nicht explizit definieren, sodass Sie ihn int am Anfang entfernen können . Und 0stattdessen auch verwenden '\0'. Also -9 Zeichen.
Ruslan
3

OCaml 47

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

Keine preisgekrönte Lösung, aber dies ist mein erstes Mal, dass ich Code-Golf spiele, daher bin ich mir nicht ganz sicher, was ich tue. Ich habe versucht, Pattern Matching zu verwenden, aber das hat mich über 58 gebracht.

Benutzernummer
quelle
3

Pari / GP , 19 Bytes - 5 = 14

Wie ein Ring, C ist isomorph zu R[x]/(x2+1).

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

Das ihier ist nur ein Symbol, nicht die imaginäre Einheit (die Iin Pari / GP ist).

Probieren Sie es online!

Alephalpha
quelle
2

Rubin 32-5 = 27

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

Funktioniert für negative Kräfte!

MegaTom
quelle
Sie können dieses mehr mit trivial Golf spielen puts %w[1 i -1 i][gets.to_i % 4].
Histokrat
2

Perl, 26 - 5 = 21

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

Arbeitet als eigenständiges Programm (Argument in der Befehlszeile) oder als Hauptteil einer Funktion.

hobbs
quelle
2

Java: 151 131-5 = 126

Golf gespielt:

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");}}

Ungolfed:

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");
    }
}

Als eine Funktion: 72-5 = 67

Golf gespielt:

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

Ungolfed:

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

Ja, noch eine Java-Antwort - und golfen noch schlimmer als je zuvor. Aber Sie arbeiten mit dem, was Sie können ...

EDIT : Funktionsversion hinzugefügt.

EDIT 2 : Nach einigem Hin und Her ist hier eine Version, die versucht, dies anhand des Buches zu tun, ohne die Zykluslücke zu erkunden. So…

Java mit Wertberechnung: 146-15 = 131

Golf gespielt:

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");}}

Ungolfed:

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");
    }
}

(Zumindest glaube ich, dass ich den höchsten Bonus beanspruchen kann, korrigiere mich sonst)

Rodolfo Dias
quelle
Sie könnten Ihren Code reduzieren, wenn Sie ihn als Argument an main übergeben.
user902383
@ user902383 Ich könnte ja immer eine Funktion machen. Vermutlich werden auch beide Versionen gepostet.
Rodolfo Dias
Eigentlich habe ich darüber nachgedacht, es zu analysieren, also wirst du habenint n = Integer.parseInt(a[0])
user902383
@ user902383 Daaaaamn, habe mich nicht mal daran erinnert. Daumen hoch
Rodolfo Dias
2

Python - 31

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

Ich habe erst kürzlich angefangen, Python zu lernen. Auch wenn ich weiß, dass es nicht gut ist, ist es das Beste, was ich tun kann.

kukac67
quelle
2

Haskell GHCi, 29 Bytes - 15 = 14

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

Verwendung:

*Main> i 0
[1.0,0.0]
*Main> i pi
[0.22058404074969779,-0.9753679720836315]
*Main> i (-6.4)
[-0.8090169943749477,0.5877852522924728]
Miete
quelle
2

R , 29 - 5 = 24 Bytes

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

Probieren Sie es online!

Wie bei den meisten obigen Methoden wird ein Modulo von 4 verwendet und dieses um 1 erhöht, da die Arrays von R 1-indiziert sind. Funktioniert auch für negative ganze Zahlen.

Ich war besorgt über gemischte Ausgaben, aber Giuseppe wies darauf hin, dass R numerische Typen in Stringtypen umwandelt, wenn diese gemischt werden.

Sumner18
quelle
@ Giuseppe Völlig ausgeblendet. Mein Anliegen dabei ist, dass die Ausgabe technisch gemischt ist, halb String, halb Numerisch.
Sumner18
Nein, R zwingt numericTypen automatisch dazu , characterwenn sie gemischt werden! Hadleys Buch erklärt das ziemlich gut - nur Strg + F bis "Zwang" und Sie werden es sehen, aber das ganze Buch ist eine Lektüre wert )
Giuseppe
1

Haskell, 29 Bytes - 5 = 24

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

Funktioniert für negative Kräfte.

Ich hatte eine pointfree Version ausgearbeitet, aber es stellt sich heraus, dass es tatsächlich länger ist.

f=(words"1 i -1 -i"!!).(`mod`4)
colevk
quelle
1

Clojure ( 64 54 31 Zeichen)

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

Bearbeiten

Nach dem Vorschlag von @ SeanAllred ist hier eine Version, die einen Literalvektor anstelle einer caseFunktion verwendet:

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

Bearbeiten 2

Wenn Sie auf die REPL zählen, um die resultierende Sammlung auszudrucken, und die Funktion mit der #()Verknüpfung codieren, auf die wir sie reduzieren können

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

(Das ist eigentlich viel mehr Clojure / Lisp-ish, da die Funktion jetzt tatsächlich das generierte Ergebnis zurückgibt, sodass die Funktion mapwie in verwendet werden kann

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

welche druckt

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

Teile und genieße.

Bob Jarvis - Setzen Sie Monica wieder ein
quelle
Können Sie anstelle einer ausgewählten Struktur kein explizites Array wie in meiner Antwort verwenden ?
Sean Allred
1

Groovy: 27-5 = 22

f={n->[1,'i',-1,'-i'][n%4]}
Armand
quelle
1

C 105 war 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
quelle
Es wird nicht einmal kompiliert, da Sie die Zuweisungen nach :in ?:Anweisungen in Klammern setzen müssen. Was nützt es auch, 0==0wenn Sie einzelne Zeichen verwenden können 1? Und keine Notwendigkeit in Klammern vor ?. Auch die letzte ?:Aussage könnte auf gekürzt werden c[j]=i&1?'i':'1';.
Ruslan
@ Ruslan In CodeBlocks Mingw gibt es nur 1 Warnung um i & 0. i & 0 == 0 ist ein Test für gerade, wenn ich gerade ist, ist das Ergebnis 0, sonst ist es 1.
Bacchusbeale
Ja, aber wozu dient es, 0==0wenn es identisch ist mit 1? Beachten Sie, dass ==hat eine höhere Priorität als &, sonst wäre Ihr (vermuteter) Test von (i&0)==0immer wahr.
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)ist ein Zeichen kürzer, kann aber keine exakten Antworten verarbeiten. Natürlich n->I^nist nicht erlaubt, und vermutlich auch PARIs powIs.

Charles
quelle
1

Jelly , 2 - 20 = -18 Bytes

ı*

Probieren Sie es online!

Es wird kein i ^ xBuiltin verwendet, aber es werden Builtins für verwendet, 1jund **daher ist nicht sicher, ob dies zulässig ist.

Erik der Outgolfer
quelle
"Wenn Ihre Sprache komplexe Zahlen unterstützt, verwenden Sie keine Funktionen oder Arithmetik, die dies bewirken könnten." Ich denke, es ist ziemlich klar ...
totalhuman
@totallyhuman Nun, ich bin mir nicht sicher, ob das 1j Literal auch verboten ist?
Erik der Outgolfer
Ja, aber die Arithmetik ( *) ist.
Totalhuman
1
@totallyhuman Hm, vielleicht füge ich unten eine weitere Version hinzu, obwohl "Verwenden Sie keine Funktionen oder Arithmetik, die dies bewirken könnten" darauf hinzudeuten scheint, dass ich kein eingebautes Programm verwenden kann, um genau diese Aufgabe zu erledigen ... Übrigens, wie er es ausdrückt, lässt mich denken, dass Sie dazu ermutigt werden , 1jLiterale zu verwenden .
Erik der Outgolfer