# Find i^n, given n

The Challenge

In as few characters as possible, find the value of i^n, given n, a positive integer greater than 0. This should be outputted as a String.

For those that don't know, i is defined such that i^2=-1. So:

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

This then repeats..

Rules

• If your language supports complex numbers, don't use any functions or arithmetic that could work this out.
• Floating point inaccuracies are fine for answers that would return decimals anyway, but integer inputs should give exact results

Bonus Points

-5 if you can work the value out where n is also negative

-15 if you can work out the value for any real number (this bonus includes the -5 from the above bonus)

Good luck!

• In what format do we return exactly? Through function output or stdout? – proud haskeller Nov 21 '14 at 15:59
• @proudhaskeller The tag wiki lists defaults for that. Unless specified otherwise, functions and programs are fine, input via function argument, STDIN or command-line argument and output via STDOUT or function return value. Functions do not have to be named. – Martin Ender Nov 21 '14 at 16:00
• @MartinBüttner but if i choose function output, how should the output should be formatted/stored without native complex numbers in my language? – proud haskeller Nov 21 '14 at 16:02
• @BetaDecay What are floating point integers? o.O – Martin Ender Nov 21 '14 at 18:04
• @MartinBüttner Haha wrong word :/ Floating point number then – Beta Decay Nov 21 '14 at 18:17

{["1","i","-1","-i"][$0%4]}  Try it online • Welcome to PPCG! – alephalpha Apr 18 '19 at 14:11 # Perl 6, 19 bytes - 5 = 14 {<1 i -1 -i>[$_%4]}


The result of % has the same sign as the divisor in this language.

Try it online!

# C (gcc), 30 bytes

f(x){printf(L"iㄭ椭1"+x%4);}


Try it online!

# C (gcc), 44 bytes -15=29

#define f(x)cos(x*acos(0))+1i*sin(x*acos(0))


Try it online!

Handles signed and noninteger arguments.

# C# 69-5 = 64

public string m(int n){return n%2==0?(n%4==0?"1":"-1"):(m(n-1)+"i");}

• output is in form -1i, 1i, i, or 1 – binderbound Nov 23 '14 at 23:38
• You cannot claim the -15 bonus as this would fail on the input 3.247104. You may only claim the -5 bonus. – Beta Decay Nov 24 '14 at 7:06
• Oh, sorry, yes - I didn't read the bonuses bit properly – binderbound Nov 27 '14 at 3:34

# Ruby, 208 - 15 = 193

p=Math::PI/2;t=gets.to_f*p;l=->n{Math::cos(n).round(2)};k=l.call(t);if k!=0;k=k.to_i if k.abs==1;print k;end;m=l.call(t+p);if m!=0;r="i";r='-'+r if m==-1;r="#{m}"+r if 1>m && -1<m;r=" + "+r if k!=0;puts r end


This implementation completely conforms to the spec! 1.0 is written as 1, -1.0i is written as -i, etc. I don't see any other solution that incorporates this along with supporting floating points, except for maybe the TI-Calculator.

Ungolfed:

p=Math::PI/2
t=gets.to_f*p
l=->n{Math::cos(n).round(2)}

k=l.call(t)
if k!=0
k=k.to_i if k.abs==1
print k
end

m=l.call(t+p)
if m!=0
r="i"
r='-'+r if m==-1
r="#{m}"+r if 1>m && -1<m
r=" + "+r if k!=0
puts r
end


# C, 61

main(n){scanf("%d",&n);printf("%c%c",n%4/2*45,n%4%2?'i':49);}


Try it here.

# Java (OpenJDK 8), 39 bytes

n->new String[]{"1","i","-1","-i"}[n%4]


Try it online!

(cycle(words"1 i -1 -i")!!)


Try it online!

# 05AB1E, 12 bytes

®sfgm¹Éi1'i:


Try it online!

®             # Push -1 onto the stack.
sfg          # Push the number of prime factors of input.
m         # -1^(number_prime_factors)
¹Éi      # is input even?
1'i:  # if input was even, replace 1 with i.


# Forth (gforth), 53 bytes - 5 bytes (bonus) = 48 bytes

: f 4 mod dup 1 > if ." -"then 2 mod 56 * '1 + emit ;


Try it online!

This works for both positive and negative numbers

### Code Explanation

: f             \ start a new word definition
4 mod dup     \ get result of n % 4 (and make a copy)
1 > if        \ if result is 2 or 3
." -'       \ print a minus sign
then          \ end the if
2 mod 56 *    \ get result modulo 2 and multiply by 56 (difference between ascii for '1' and 'i')
'1 +          \ add to ascii value of '1'
emit          \ output the character for the given value
;               \ end the word definition


# Zsh, 30 bytes, score 25 (-5)

a=({,}{,-}{1,i})
<<<$a[$1%4+5]


Try it online!

Based on the bash answer, but with some changes needed:

• %4 results in a value in the range -3 to 3 (negative inputs give negative outputs), so we shift up with +5.
• Arrays are 1-indexed, hence +5 instead of +4.
• We make our array twice as long by using brace expansion: {,}foo expands to foo foo.

# Tcl, 50 bytes

proc I n {expr $n%4==3?"-i":$n%4==2?-1:\$n%4?"i":1}


Try it online!

# Keg, 15 - 5 = 10 bytes

1i0;-i¿4%⊙&ø&


Try it online!

Pushes the four different possibilities and then takes the input modulo 4 and indexes the stack.

• You program supports negative numbers, you should have the -5 bonus! -5 if you can work the value out where n is also negative – user85052 Nov 16 '19 at 6:09