Temukan i ^ n, diberikan n

27

Tantangan

Dalam sesedikit mungkin karakter, temukan nilai i ^ n, dengan n, bilangan bulat positif lebih besar dari 0. Ini harus dikeluarkan sebagai String.

Bagi mereka yang tidak tahu, saya didefinisikan sedemikian sehingga i ^ 2 = -1. Begitu:

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

Ini kemudian berulang ..

Aturan

  • Jika bahasa Anda mendukung bilangan kompleks, jangan gunakan fungsi atau aritmatika apa pun yang bisa menyelesaikan masalah ini.
  • Ketidaktepatan titik apung baik untuk jawaban yang akan mengembalikan desimal, tetapi input bilangan bulat harus memberikan hasil yang tepat

Poin Bonus

-5 jika Anda dapat menghitung n di mana n juga negatif

-15 jika Anda dapat menghitung nilai untuk bilangan real mana pun (bonus ini termasuk -5 dari bonus di atas)

Semoga berhasil!

Kezz101
sumber
1
Dalam format apa kita kembali dengan tepat? Melalui fungsi keluaran atau stdout?
haskeller bangga
@proudhaskeller Tag wiki mencantumkan default untuk itu. Kecuali ditentukan sebaliknya, fungsi dan program baik-baik saja, input melalui argumen fungsi, STDIN atau argumen baris perintah dan output melalui STDOUT atau nilai pengembalian fungsi. Fungsi tidak harus disebutkan namanya.
Martin Ender
1
@ MartinBüttner tetapi jika saya memilih fungsi output, bagaimana seharusnya output harus diformat / disimpan tanpa nomor kompleks asli dalam bahasa saya?
haskeller bangga
16
@ BetaDecay Apa itu bilangan bulat floating point? oO
Martin Ender
2
@ MartinBüttner Haha kata yang salah: / Nomor titik apung kemudian
Beta Decay

Jawaban:

15

Ruby, skor -2

(13 byte, -15 bonus)

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

Fitur termasuk: tidak ada kesalahan pembulatan! (jika Anda memasukkan input sebagai Rasional)


diposting oleh penulis, Kezz101

Jika Anda mendukung bilangan real apa pun, Anda dapat menampilkan dalam bentuk kompleks apa pun yang valid.

Skor negatif membuat adrenalin saya bergerak maju. Dengan demikian aturan yang disalahgunakan digunakan untuk mencapai tujuan mulia ini.

Menciptakan fungsi anonim dan menghasilkan array dengan 2 entri yang mewakili bilangan kompleks dalam bentuk kutub (unit sudut: derajat).

blutorange
sumber
4
"Ruby, -2 bytes" .....
FantaC
3
Jadi, apakah mengunduh 1.000.000.000.000 kali ini memberi saya ruang hard drive 2TB gratis? Kedengarannya bagus bagi saya.
Program Redwolf
^ Peramban saya mogok sebelum saya berhasil melakukannya. Mungkin mencoba "bom ritsleting" dengan file di dalamnya? (Mengekstraknya menghemat ruang.)
A̲̲
15

CJam, 12 karakter - 5 = 7

1'iW"-i"]li=

Uji di sini.

Mendukung input negatif.

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

Hasilnya dicetak secara otomatis di akhir program.

Mathematica, 22 20 19 karakter - 15 = 4

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

Ini adalah fungsi anonim, yang bisa Anda gunakan seperti

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

(Atau tetapkan untuk fmengatakan, lalu lakukan f[15].)

Mendukung real dan memberikan hasil yang tepat untuk input integer.

Perhatikan bahwa iini bukan kompleks Mathatica i (yang I). Itu hanya variabel yang tidak ditentukan.

Selain itu, terlepas dari urutan ekspresi, Mathematica akan menyusun ulang output menjadi R+Cibentuk.

Martin Ender
sumber
Anda tidak membutuhkannya 4%. Itu bisa dilakukan secara otomatis.
jimmy23013
@ user23013 nifty :)
Martin Ender
8
Bukankah kedua jawaban harus terpisah?
Justin
@ Quincunx Mungkin ... awalnya mereka berdua di CJam, itulah sebabnya saya menempatkan mereka dalam jawaban yang sama. Tapi yang kedua tidak valid, jadi saya porting ke Mathematica, tetapi meninggalkannya di tempat itu. Jika orang bersikeras saya dapat membaginya.
Martin Ender
Dan Anda dapat menyimpan karakter dalam menggunakannya dengan f@15sebagai gantinya f[15].
orome
14

Python 2 - (24-5) = 19

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

Sebagian besar kredit milik @ user2357112, saya baru saja menambahkan jawabannya dari komentar pada jawaban ini sedikit lebih banyak.

Penjelasan: Mulai dari indeks n%4dalam string '1i--'. Kemudian beralih mundur di langkah dua atas setiap huruf dalam string. Jadi, misalnya, n=6akan mulai dari indeks 2, yang pertama -, lalu lewati idan ambil 1, untuk kembali -1.

@xnor menunjukkan solusi dengan panjang yang sama:

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

Pyth - (14-5) = 9

Saya hanya bisa mendapatkan 14, tidak peduli bagaimana saya mencoba untuk membalik / mengiris / dll. : '(

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

Yang pada dasarnya sama dengan jawaban python di atas, tetapi dalam 2 langkah, karena pyth tidak mendukung opsi pengindeksan penuh python. Cobalah online.

Aku akan pergi berbicara dengan isaacg tentang pengindeksan Pyth;)

FryAmTheEggman
sumber
Bukankah python lambdaperlu ditugaskan ke variabel? Paling tidak bervariasi, untuk menyebutnya Anda harus mengelilinginya dengan tanda kurung, menambahkan dua byte sehingga bisa dipanggil (lambda...)(n).
mbomb007
@ mbomb007 Menurut meta ini dapat diterima. Kode di sini membuat fungsi yang melakukan tugas yang diperlukan. Lambdas Anonim digunakan relatif sering dalam python untuk fungsi seperti mapdan sorted.
FryAmTheEggman
11

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

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

Jika Anda ingin menerima nilai pengembalian yang kompleks, ganti idi akhir dengan (complex i).

Shujal
sumber
@ MartinBüttner TI-Basic tampaknya menggunakan semacam tipe 'Ekspresi', dan metode bawaan mengembalikan hasil yang pasti untuk ini.
Shujal
Begitu ya, semuanya baik-baik saja. ;)
Martin Ender
Bagaimana dengan aturan "Jika bahasa Anda mendukung bilangan kompleks, jangan gunakan fungsi atau aritmatika apa pun yang bisa menyelesaikan masalah ini." + i adalah hitung
edc65
@ edc65 + sebenarnya adalah operasi yang rumit. Namun, jika Anda tidak suka itu, ganti dengan yang normal i. Jika variabel itidak didefinisikan, Anda akan mendapatkan bilangan kompleks, hanya dengan ialih - alih . Saya hanya menghitung bagian nyata dan imajiner secara terpisah.
Shujal
1
@ Shujal Dalam hal ini, saya pikir Anda harus itetap menggunakan . Kompleks saya bahkan bukan karakter pertanyaan yang ditanyakan, dan itu akan menghemat dua byte, jadi Anda setidaknya akan mengikat saya;).
Martin Ender
7

Marbelous , 43 byte

Bukan pemenang, tapi Marbelous menyenangkan. :)

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

Ini adalah program yang membaca input sebagai integer tunggal dari argumen baris perintah pertama. Perhatikan bahwa input diambil modulo 256, tetapi ini tidak mempengaruhi validitas hasil untuk input yang lebih besar dari 255, karena 256 dapat dibagi dengan 4.

Penjelasan

Marbelous adalah bahasa pemrograman 2D, yang mensimulasikan "kelereng" (nilai byte) yang jatuh melalui banyak perangkat. Papan terdiri dari sel-sel lebar 2-karakter (perangkat), yang dapat memproses kelereng. Segala sesuatu yang jatuh dari bagian bawah papan dicetak ke STDOUT.

Mari kita lihat perangkat yang digunakan:

  • }0adalah tempat argumen baris perintah pertama berjalan. Saya telah menggunakan dua contoh perangkat ini, jadi saya mendapatkan dua salinan dari nilai input (pada saat yang sama).
  • ^nmemeriksa nbit ke-marmer input (di mana n=0bit paling signifikan), dan menghasilkan 1atau 0tergantung pada bit.
  • =0memeriksa kesetaraan dengan 0. Jika input marmer sama, ia akan langsung jatuh, jika tidak didorong ke kanan.
  • \/ adalah tempat sampah, jadi itu hanya menelan input marmer dan tidak pernah menghasilkan apa pun.
  • 2Dadalah kode ASCII -, 31adalah kode ASCII 1dan 69adalah kode ASCII dari i.
  • The &nadalah synchronisers. Sinkronisasi menghentikan marmer sampai semua sinkronisasi dengan nmemegang marmer yang sama, pada titik mana mereka semua akan membiarkan marmer yang tersimpan jatuh.

Jadi pada dasarnya, apa yang saya lakukan adalah menahan tiga karakter yang relevan dalam tiga sinkronisasi, dan melepaskan mereka tergantung pada bagaimana bit paling tidak signifikan diatur dalam input.

Untuk informasi lebih lanjut, lihat draf spesifikasi .

Martin Ender
sumber
1
Saya sangat suka yang ini! Kedengarannya luar biasa, aku harus memeriksanya dalam waktu dekat :)
Kezz101
3
@ Kezz101 Kami punya draft spesifikasi di sini
Martin Ender
Oh bagus! Itu terlihat sangat menarik
Kezz101
Jangan lupa bahwa Anda dapat memberikan input ke papan utama pada baris perintah, sehingga papan ini dapat digunakan apa adanya.
Sparr
1
@ overactor Hm, saya tidak tahu ... mengeluarkan karakter tambahan (meskipun mereka tidak patut dicetak) sepertinya masih melanggar format output untuk saya. Mungkin bernilai pertanyaan meta.
Martin Ender
6

JavaScript (ES6) 29-5 = 24

Mendukung kekuatan negatif.

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

ES5:

function f(n){return (n&2?'-':'')+(n&1?'i':1)}
Michael M.
sumber
Yap, lebih pendek ( f=n=>[1,'i',-1,'-i'][n%4]). Tapi itu kurang seksi dan tidak akan mendukung kekuatan negatif. Itu tergantung pada bonus kurasa.
Michael M.
Tidak, 29 byte. Negatif didukung dengan kode ini.
Michael M.
Apakah JS memiliki &operator bitwise ? Jika demikian, Anda dapat melakukannya &3untuk operasi modulus-4 yang sebenarnya. Sunting: sepertinya itu seperti &2yang digunakan dalam jawaban Anda ...
feersum
5

Python 28 byte - 5 = 23

Mendukung input -ve.

Dengan asumsi fungsi lambda dapat diterima (Terima kasih FryAmTheEggman!):

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

jika tidak, 31 byte - 5 = 26

print[1,"i",-1,"-i"][input()%4]
Trauma Digital
sumber
1
Anda tidak dapat menyebutnya dengan tepat. Anda harus menyimpannya di tempat yang dapat Anda akses. Jadi Anda bisa melakukannya foo=..., atau Anda bisa lakukan map(<your lambda>,range(10))untuk mendapatkan daftar nilai i^ndari 0-9.
FryAmTheEggman
2
Pada dasarnya Anda membuat pointer fungsi, jika itu lebih jelas: P
FryAmTheEggman
3
@DigitalTrauma: Ya, meskipun Anda mungkin bisa melakukan yang lebih baik dengan trik mengiris string. Sebagai contoh lambda n:'--1i'[n%4-2::2],.
user2357112 mendukung Monica
2
Untuk menerjemahkan posting user2357112: Ambil setiap karakter lain '--1i'mulai dari pada indeks n%4-2. Ketika python mendapatkan indeks negatif, itu akan mulai banyak posisi yang tersisa dari akhir array, dan kemudian naik ke 0. Dengan cara ini, 0dan 1jangan pernah memukul -tanda, sementara 3dan 4lakukan.
FryAmTheEggman
1
lambda n:n%4/2*'-'+'1i'[n%2]Menghapus ruang dan lebih pendek :)
FryAmTheEggman
4

(Emacs) Lisp - 34

Hanya untuk bersenang-senang, di (Emacs) Lisp:

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

Jika Anda ingin menggunakannya, gunakan defunatau gunakan 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
sumber
4

APL (Dyalog) , 8 karakter - 15 bonus = skor -7

Fungsi bawaan (dan karenanya dilarang) adalah 0J1*⊢, tetapi ini menggunakan metode @ blutorange .

¯12○.5×○

Penulis tantangan, Kezz101, menulis :

Jika Anda mendukung bilangan real apa pun, Anda dapat menampilkan dalam bentuk kompleks apa pun yang valid.

Ini mengembalikan bilangan kompleks dalam bentuk aJbyang merupakan cara normal bagi APL untuk menampilkan bilangan kompleks.

Cobalah online!

Penjelasan

¯12○ menemukan vektor satuan yang memiliki sudut dalam radian

.5× satu setengah kali

 argumen dikalikan dengan 𝜋 (konstanta lingkaran)

Adám
sumber
3

Bash murni, 29 byte - 5 = 24

Mendukung input -ve.

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

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

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

Mendukung bilangan bulat negatif. Tidak akan memenangkan penghargaan apa pun dengan solusi ini, tapi apa pun itu.

Ia hanya menerima angka sebagai input, melakukan beberapa tipu daya pada modulus (yang, sayangnya, tidak bekerja seperti modulus biasa untuk angka negatif pada interpreter yang saya gunakan untuk mengujinya) untuk membuat negatif bekerja, dan kemudian melakukan beberapa persyaratan konyol untuk tentukan masing-masing karakter yang seharusnya.

Saya yakin ini bisa bermain golf lebih jauh. Untuk saat ini, inilah solusi lain yang tidak menerima negatif, tetapi menebus kehilangan bonus dengan menjadi lebih pendek:

Befunge-98, 32 26 23

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

Sunting - Sekarang mengambil keuntungan dari kenyataan bahwa "-" berjarak 13 (0xd) karakter dari "".

Sunting 2 - Sekarang, sekali lagi, manfaatkan fakta bahwa "i" berjarak 56 (0x38, atau '8) karakter dari "1".

Kasran
sumber
3

Skor Java 8: 72

Di Jawa, bahasa golf terburuk yang pernah ada! Golf:

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

Diperluas:

class Complex{

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

}

Catatan: Saya tidak terbiasa dengan Java 8. Saya juga belum memiliki runtime untuk itu. Tolong beritahu saya jika ada kesalahan sintaksis. Ini juga golf pertama saya.

Edit: Dihapus import.

Sunting: Deklarasi kelas yang dihapus.

Jawaban lain dengan skor = 87 - 15 = 72

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

Diperluas:

class Complex{

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

}
TheNumberOne
sumber
Anda dapat menyimpannya dengan "import java.util. *"
Anubian Noob
@Anubian Noob Kelas Fungsi ini dalam paket java.util.functiontidak java.util(atau aku salah?).
TheNumberOne
Tapi jika Anda melakukannya java.util.*dengan .*cara impor segala sesuatu di bawah paket. Sama seperti saat ini Anda mengimpor semua kelas dalam fuctionpaket.
Anubian Noob
5
@ Anubian Noob importhanya mengimpor kelas dalam paket itu. Itu tidak mengimpor salah satu kelas dari paket dalam paket itu. Sebagai contoh, kelas Functionada dalam paket java.util.functiontetapi tidak dalam paket java.util.
TheNumberOne
Ya ampun, maaf soal itu.
Anubian Noob
3

MATLAB, 33 byte - 5 = 28

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

Meskipun beberapa byte lebih banyak (37-5 = 32), saya sebenarnya lebih menyukai pendekatan ini:

x='1i -';x((mod([n/2,n],2)>=1)+[3,1])
Stewie Griffin
sumber
i^3adalah -i, daripada i, kira itu hanya menambah 1 char - Sidenote untuk pembaca lain: tanpa aturan pertama dari tantangan, solusi Matlab hanya akan menjadi 3 karakter.
Dennis Jaheruddin
Ya, itu salah ketik. Tetap! Terima kasih telah memperhatikan ... Setidaknya pendekatan kedua (sedikit lebih menarik) benar =)
Stewie Griffin
3

C 77

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

Peningkatan berkat Ruslan

C 74-5 = 69

Oh dan tentu saja pendekatan yang paling jelas

main(){unsigned n,*c[]={"1","i","-1","-i"};scanf("%d",&n);puts(c[n%4]);}
Rames
sumber
2
Anda dapat menghapus tanda kurung di sekitar n%2dan menggunakan ~bukan !karena meniadakan nterlebih dahulu, kemudian %dengan 2 akan memberikan hasil yang sama, setidaknya untuk n<(1<<32)-1. Dan C tidak perlu secara eksplisit mendefinisikan tipe pengembalian untuk fungsi, sehingga Anda dapat menghapus int di awal. Dan juga gunakan 0sebagai gantinya '\0'. Dengan demikian -9 karakter.
Ruslan
3

OCaml 47

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

Bukan solusi pemenang penghargaan, tapi ini adalah golf code pertama kali saya, jadi saya tidak begitu yakin dengan apa yang saya lakukan. Saya mencoba menggunakan pencocokan pola, tetapi itu membuat saya lebih dari 58.

usernumber
sumber
3

Pari / GP , 19 byte - 5 = 14

CR[x]/(x2+1)

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

Di isini hanya sebuah simbol, bukan unit imajiner (yang ada Idi Pari / GP).

Cobalah online!

alephalpha
sumber
2

Ruby 32-5 = 27

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

Bekerja untuk kekuatan negatif!

MegaTom
sumber
Anda bisa bermain golf ini dengan sepele puts %w[1 i -1 i][gets.to_i % 4].
histokrat
2

Perl, 26 - 5 = 21

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

berfungsi sebagai program mandiri (argumen pada commandline) atau badan fungsi.

hobbs
sumber
2

Jawa: 151 131-5 = 126

Golf:

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

Tidak Disatukan:

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

Sebagai fungsi: 72-5 = 67

Golf:

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

Tidak Disatukan:

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

Ya, satu lagi balasan Java - dan bermain golf lebih buruk dari sebelumnya. Tetapi Anda bekerja dengan apa yang Anda bisa ...

EDIT : menambahkan versi fungsi.

EDIT 2 : jadi, setelah sedikit coba-coba, inilah versi yang mencoba melakukannya oleh buku, tanpa menjelajahi celah siklus. Begitu…

Java dengan perhitungan nilai: 146-15 = 131

Golf:

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

Tidak Disatukan:

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

(setidaknya, saya pikir saya bisa mengklaim bonus teratas, koreksi saya sebaliknya)

Rodolfo Dias
sumber
Anda dapat mengurangi kode Anda, jika Anda meneruskannya ke utama sebagai argumen.
user902383
@ user902383 Aku selalu bisa membuat suatu fungsi. Mungkin akan memposting kedua versi juga.
Rodolfo Dias
sebenarnya saya sedang berpikir tentang parsing itu, sehingga Anda akan memilikiint n = Integer.parseInt(a[0])
user902383
@ user902383 Daaaaamn, bahkan tidak ingat itu. jempol ke atas
Rodolfo Dias
2

Python - 31

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

Saya baru saja mulai belajar python. Meskipun saya tahu itu tidak baik, itu yang terbaik yang bisa saya lakukan.

kukac67
sumber
2

Haskell GHCi, 29 Bytes - 15 = 14

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

Pemakaian:

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

R , 29 - 5 = 24 byte

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

Cobalah online!

Sama seperti kebanyakan metode di atas, mengambil modulo dari 4, dan meningkatkannya dengan 1, karena array R adalah 1-diindeks. Bekerja untuk bilangan bulat negatif juga.

Saya khawatir tentang output campuran di sini, tetapi Giuseppe menunjukkan bahwa R memaksa tipe numerik ke tipe string ketika mereka dicampur.

Sumner18
sumber
29 - 5 = 24 byte
Giuseppe
@ Giuseppe Benar-benar kecewa karenanya. Kekhawatiran saya dengan itu adalah bahwa output secara teknis dicampur, setengah string, setengah angka.
Sumner18
tidak, R secara otomatis memaksa numerictipe characterketika mereka dicampur! Buku Hadley menjelaskan ini dengan cukup baik - cukup Ctrl + F untuk "Pemaksaan" dan Anda akan melihatnya, tetapi keseluruhan buku ini layak dibaca (untuk tujuan non-golf kebanyakan, tetapi kadang-kadang Anda mengambil satu atau dua trik, heheh )
Giuseppe
1

Haskell, 29 byte - 5 = 24

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

Bekerja untuk kekuatan negatif.

Saya memiliki versi pointfree yang berhasil, tetapi ternyata itu sebenarnya lebih lama.

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

Clojure ( 64 54 31 karakter)

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

Edit

Saran Per @ SeanAllred, inilah versi yang menggunakan vektor literal alih-alih casefungsi:

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

Edit 2

Dengan mengandalkan REPL untuk mencetak koleksi yang dihasilkan dan mengkode fungsi menggunakan #()cara pintas kita dapat menguranginya menjadi

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

(Yang sebenarnya jauh lebih Clojure / Lisp-ish karena fungsi sekarang benar-benar mengembalikan hasil yang dihasilkan, memungkinkan fungsi untuk digunakan map, seperti pada

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

yang mencetak

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

Bagikan dan nikmati.

Bob Jarvis - Pasang kembali Monica
sumber
Alih-alih menggunakan struktur pilih, tidak bisakah Anda menggunakan semacam array eksplisit seperti pada jawaban saya ?
Sean Allred
1

Groovy: 27-5 = 22

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

C 105, adalah 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
sumber
Itu bahkan tidak dapat dikompilasi karena Anda harus mengurung tugas setelah :dalam ?:pernyataan di dataran C. Juga, apa gunanya menggunakan 0==0ketika Anda dapat menggunakan char tunggal 1? Dan tidak perlu tanda kurung sebelumnya ?. Juga, ?:pernyataan terakhir bisa disingkat menjadi c[j]=i&1?'i':'1';.
Ruslan
@Ruslan Di CodeBlocks Mingw hanya ada 1 peringatan di sekitar saya & 0. i & 0 == 0 adalah ujian untuk genap, jika saya genap hasilnya adalah 0 yang lain adalah 1.
bacchusbeale
Ya, tapi apa gunanya menggunakan 0==0itu identik 1? Perhatikan bahwa ==memiliki prioritas lebih tinggi daripada &, jika tidak, tes (seharusnya) Anda (i&0)==0akan selalu benar.
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)lebih pendek satu karakter, tetapi tidak menangani jawaban yang tepat. Tentu saja n->I^ndilarang, dan mungkin juga milik PARI powIs.

Charles
sumber
1

Jelly , 2 - 20 = -18 byte

ı*

Cobalah online!

Itu tidak menggunakan i ^ xbuiltin tetapi menggunakan builtin untuk 1jdan **jadi tidak yakin jika diizinkan.

Erik the Outgolfer
sumber
"Jika bahasa Anda mendukung bilangan kompleks, jangan gunakan fungsi atau aritmatika apa pun yang bisa menyelesaikan masalah ini." Saya pikir itu cukup jelas ...
manusia
@ sebenarnya manusia, saya tidak yakin apakah 1j literal itu dilarang juga?
Erik the Outgolfer
Ya, tetapi aritmatika ( *) adalah.
totallyhuman
1
@totallyhuman Hm, mungkin saya akan menambahkan versi lain di bawah ini, walaupun "tidak menggunakan fungsi atau aritmatika apa pun yang bisa menyelesaikan masalah ini" tampaknya menyarankan bahwa saya tidak dapat menggunakan built-in untuk melakukan tugas yang tepat ini ... BTW cara dia mengucapkannya membuat saya berpikir bahwa Anda didorong untuk menggunakan 1jliteral.
Erik the Outgolfer
1

05AB1E , skor 5 (10 byte - 5 bonus)

'i®„-i1)Iè

Cobalah secara online atau verifikasi beberapa kasus uji lagi .

Penjelasan:

'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
sumber