27
\$\begingroup\$

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!

\$\endgroup\$
  • 1
    \$\begingroup\$ In what format do we return exactly? Through function output or stdout? \$\endgroup\$ – proud haskeller Nov 21 '14 at 15:59
  • \$\begingroup\$ @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. \$\endgroup\$ – Martin Ender Nov 21 '14 at 16:00
  • 1
    \$\begingroup\$ @MartinBüttner but if i choose function output, how should the output should be formatted/stored without native complex numbers in my language? \$\endgroup\$ – proud haskeller Nov 21 '14 at 16:02
  • 16
    \$\begingroup\$ @BetaDecay What are floating point integers? o.O \$\endgroup\$ – Martin Ender Nov 21 '14 at 18:04
  • 2
    \$\begingroup\$ @MartinBüttner Haha wrong word :/ Floating point number then \$\endgroup\$ – Beta Decay Nov 21 '14 at 18:17

44 Answers 44

1 2
1
\$\begingroup\$

Swift, 27

{["1","i","-1","-i"][$0%4]}

Try it online

\$\endgroup\$
  • 1
    \$\begingroup\$ Welcome to PPCG! \$\endgroup\$ – alephalpha Apr 18 '19 at 14:11
1
\$\begingroup\$

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!

\$\endgroup\$
1
\$\begingroup\$

C (gcc), 30 bytes

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

Try it online!

\$\endgroup\$
1
\$\begingroup\$

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.

\$\endgroup\$
0
\$\begingroup\$

C# 69-5 = 64

public string m(int n){return n%2==0?(n%4==0?"1":"-1"):(m(n-1)+"i");}
\$\endgroup\$
  • \$\begingroup\$ output is in form -1i, 1i, i, or 1 \$\endgroup\$ – binderbound Nov 23 '14 at 23:38
  • 1
    \$\begingroup\$ You cannot claim the -15 bonus as this would fail on the input 3.247104. You may only claim the -5 bonus. \$\endgroup\$ – Beta Decay Nov 24 '14 at 7:06
  • \$\begingroup\$ Oh, sorry, yes - I didn't read the bonuses bit properly \$\endgroup\$ – binderbound Nov 27 '14 at 3:34
  • \$\begingroup\$ I have asked a question on meta about this answer: meta.codegolf.stackexchange.com/questions/4851/… \$\endgroup\$ – Thomas Weller Mar 5 '15 at 22:27
0
\$\begingroup\$

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
\$\endgroup\$
0
\$\begingroup\$

C, 61

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

Try it here.

\$\endgroup\$
0
\$\begingroup\$

Java (OpenJDK 8), 39 bytes

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

Try it online!

\$\endgroup\$
0
\$\begingroup\$

Haskell, 27 bytes

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

Try it online!

\$\endgroup\$
0
\$\begingroup\$

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.
\$\endgroup\$
0
\$\begingroup\$

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
\$\endgroup\$
0
\$\begingroup\$

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.
\$\endgroup\$
0
\$\begingroup\$

Tcl, 50 bytes

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

Try it online!

\$\endgroup\$
0
\$\begingroup\$

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.

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.