给定n,求i ^ n


27

挑战

在尽可能少的字符中,找到给定n的i ^ n值(大于0的正整数)。应将其输出为String。

对于那些不知道的人,i被定义为i ^ 2 = -1。所以:

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

然后重复此步骤。

规则

  • 如果您的语言支持复数,请不要使用任何可以解决此问题的函数或算法。
  • 浮点数不正确的答案可以返回小数,但整数输入应能给出准确的结果

奖励积分

-5如果可以计算出其中n也为负的值

如果您可以计算任何实数的值,则为-15(此奖金包括上述奖金中的-5)

祝好运!


1
我们以什么格式准确返回?通过函数输出还是标准输出?
自豪的haskeller 2014年

@proudhaskeller标签Wiki列出了默认设置。除非另有说明,否则函数和程序均可以通过函数参数,STDIN或命令行参数输入,并通过STDOUT或函数返回值输出。函数不必命名。
Martin Ender 2014年

1
@MartinBüttner但如果我选择函数输出,应该如何格式化/存储输出而没有使用我的语言的本机复数?
骄傲的haskeller 2014年

16
@BetaDecay什么是浮点整数?oO
Martin Ender

2
@MartinBüttnerHaha错误的单词:/浮点数然后
Beta Decay

Answers:


15

红宝石,得分-2

(13字节,-15奖金)

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

功能包括:无舍入错误!(如果您将输入作为Rational传递)


由作者Kezz101发布

如果支持任何实数,则可以任何有效的复数形式输出。

负分数使我的肾上腺素冲了出去。因此,滥用规则可以实现这一崇高目标。

创建一个匿名函数,并输出包含2个条目的数组,这些条目以极坐标形式(角度单位:度)表示一个复数。


4
“ Ruby,-2个字节” .....
FantaC

3
那么,下载这1,000,000,000,000次会给我2TB的可用硬盘空间吗?对我来说听起来不错。
Redwolf Programs

^在成功执行此操作之前,我的浏览器已损坏。也许尝试使用文件里面的“ zip炸弹”?(提取它可以节省空间。)
A̲̲

15

CJam,12个字符-5 = 7

1'iW"-i"]li=

在这里测试。

支持负输入。

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

结果将自动打印在程序末尾。

Mathematica,22 20 19个字符-15 = 4

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

这是一个匿名函数,您可以像

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

(或指定它f说,然后执行f[15]。)

支持实数并给出整数输入的精确结果。

请注意,i不是数学的复杂(这是I)。这只是一个未定义的变量。

同样,尽管表达式具有顺序,Mathematica也会将输出重新排序为R+Ci形式。


您不需要4%。它可以自动完成。
jimmy23013

@ user23013 nifty :)
Martin Ender

8
这两个答案不应该分开吗?
贾斯汀2014年

@Quincunx也许...最初他们俩都在CJam,这就是为什么我把他们放在同一答案中。但是第二个无效,因此我将其移植到了Mathematica,但将其保留在原来的位置。如果人们坚持,我可以将它们分开。
Martin Ender 2014年

并且您可以使用f@15代替来保存使用它的字符f[15]
orome 2014年

14

Python 2-(24-5)= 19

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

大多数功劳属于@ user2357112,我只是从这个答案的评论中获得了更多答案

说明:从n%4字符串中的索引处开始'1i--'。然后在字符串中的每个字母上以两个为单位向后迭代。因此,例如,n=6将从索引2开始,第一个-,然后跳过i并采用1,以返回-1

@xnor指出了相同长度的解决方案:

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

-(14-5)= 9

无论我如何尝试反向/切片/等,我似乎只能得到14。:'(

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

这与上面的python答案基本相同,但是分2个步骤,因为pyth不支持python的完整索引选项。在线尝试。

我将与isaacg讨论Pyth索引;)


python是否lambda不需要分配给变量?至少要调用它,您需要用括号将其括起来,并添加两个字节,以便将其称为(lambda...)(n)
mbomb007'3

@ mbomb007 根据meta可以接受。此处的代码创建了一个执行所需任务的函数。匿名lambda在python中相对频繁地用于诸如map和的函数sorted
FryAmTheEggman 2015年

11

TI-BASIC(NSpire)-5(20个字符-15)

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

如果要接收复杂的返回值,请i(复杂i)末尾替换。


@MartinBüttnerTI-Basic似乎使用了某种“表达式”类型,并且内置方法返回了确切的结果。
Shujal 2014年

我知道了,那一切都很好。;)
Martin Ender 2014年

那么规则“如果您的语言支持复数,请不要使用任何可以解决此问题的函数或算术”。+ i是算术
edc65

@ edc65 +实际上是一个复杂的操作。但是,如果您不喜欢那样的话,请用normal 替换i。如果i未定义变量,则将使用i代替来获取复数。我只是在分别计算实部和虚部。
Shujal 2014年

1
@Shujal在这种情况下,我认为您i还是应该使用。复杂的我甚至不是问题所要求的字符,它可以为您节省两个字节,因此您至少会与我联系;)。
Martin Ender 2014年

7

Marbelous,43个字节

并不是真正的赢家,但Marbelous很有趣。:)

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

这是一个从第一个命令行参数中将输入作为单个整数读取输入的程序。请注意,输入取模256,但这不会影响输入大于255的结果的有效性,因为256可被4整除。

说明

Marbelous是一种2D编程语言,它模拟掉入大量设备的“大理石”(字节值)。木板由2个字符宽的单元(设备)组成,可以处理大理石。落在电路板底部的所有内容都将打印到STDOUT。

让我们浏览一下正在使用的设备:

  • }0是第一个命令行参数所在的位置。我已经使用了该设备的两个实例,因此(同时)获得了输入值的两个副本。
  • ^n检查n输入大理石的th位(其中n=0最低有效位),并产生10取决于该位。
  • =0与检查是否相等0。如果输入的弹珠相等,则将直接掉落,如果不相等,则将其推向右侧。
  • \/ 是一个垃圾桶,所以它只会吞下输入的大理石,而不会产生任何东西。
  • 2D是的ASCII代码-31是的ASCII代码169是的ASCII代码i
  • &n是同步器。同步器会停顿一块大理石,直到所有同n一个同步器都握住一块大理石,这时它们都会让存储的大理石全部掉落。

因此,实际上,我要做的是将三个相关字符保留在三个同步器中,然后根据输入中最低有效位的设置方式释放它们。

有关更多信息,请参见规范草案


1
我真的很喜欢这一个!Marbelous听起来很不错,我需要尽快检查一下:)
Kezz101

3
@ Kezz101我们这里
Martin Ender

不错哦!它看起来真的很有趣
Kezz101 2014年

不要忘记,您可以在命令行上向主板提供输入,因此该主板可以原样使用。
Sparr 2014年

1
@overactor Hm,我不知道...输出其他字符(即使它们无法打印)似乎仍然违反了我的输出格式。也许值得一个元问题。
Martin Ender 2014年

6

JavaScript(ES6)29-5 = 24

支持负电源。

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

ES5:

function f(n){return (n&2?'-':'')+(n&1?'i':1)}

是的,较短(f=n=>[1,'i',-1,'-i'][n%4])。但是它不那么性感,并且不支持负能量。这取决于我猜想的奖金。
Michael M.

Nop,29个字节。此代码支持负数。
Michael M.

JS是否有按位运算&符?如果是这样,您可以&3进行真正的4模运算。编辑:看起来像&2您的答案一样...
feersum 2014年

5

Python 28字节-5 = 23

支持-ve输入。

假设可以接受lambda函数(感谢FryAmTheEggman!):

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

否则31个字节-5 = 26

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

1
您不能准确地称呼它。您必须将其存储在可以访问的位置。因此,您可以这样做foo=...,或者可以map(<your lambda>,range(10))获取i^nfrom 的值列表0-9
FryAmTheEggman 2014年

2
基本上,您正在制作一个函数指针,如果更清楚的话:P
FryAmTheEggman

3
@DigitalTrauma:是的,尽管您可以用字符串切片技巧做得更好。例如,lambda n:'--1i'[n%4-2::2]
user2357112支持Monica 2014年

2
翻译user2357112的帖子:从'--1i'index处获取其他所有字符n%4-2。当python获得负索引时,它将从数组末尾开始剩余多个位置,然后上升到0。通过这种方式,0并且1永远不要打-迹象,而34做。
FryAmTheEggman 2014年

1
lambda n:n%4/2*'-'+'1i'[n%2]删除空间并缩短:)
FryAmTheEggman

4

(Emacs)Lisp – 34

只是为了好玩,在(Emacs)Lisp中:

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

如果要使用它,请使用defun或使用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)

4

APL(Dyalog),8个字符-15个红利=得分-7

内置(因此被禁止)的功能是0J1*⊢,但这使用@blutorange的方法

¯12○.5×○

挑战作者Kezz101 写道

如果支持任何实数,则可以任何有效的复数形式输出。

这将以复数形式返回复数,aJb这是APL显示复数的正常方式。

在线尝试!

说明

¯12○ 求出具有弧度角的单位向量

.5× 一半的时间

 自变量乘以𝜋(圆常数)


3

纯bash,29个字节-5 = 24

支持-ve输入。

a=(1 i -1 -i)
echo ${a[$1%4]}

3

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

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

支持负整数。这种解决方案不会赢得任何奖项,但是无论如何。

它只是接受一个数字作为输入,对模数做一些欺骗(令人沮丧的是,它不像我用来测试它的解释器中的负数通常的模数那样工作)以使负数起作用,然后对决定每个字符应该是什么。

我确信这可以进一步进行下去。现在,这是另一种不接受负数的解决方案,但可以通过缩短奖金来弥补奖金的损失:

Befunge-98,32 26 23

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

编辑 -现在利用以下事实:“-”距离“”有13(0xd)个字符。

编辑2-现在,再次利用以下事实:“ i” '8距离“ 1” 有56个字符(0x38或)。


3

Java 8得分:72

在Java中,这是有史以来最糟糕的高尔夫语言!打高尔夫球:

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

展开:

class Complex{

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

}

注意:我还不习惯Java8。我也没有运行时。请告诉我是否有语法错误。这也是我的第一个高尔夫。

编辑:已删除import

编辑:删除类声明。

得分为87-15 = 72的另一个答案

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

展开:

class Complex{

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

}

您可以使用“ import java.util。*”保存一些内容
Anubian Noob 2014年

@Anubian Noob类函数java.util.function不在软件包中java.util(或者我错了吗?)。
TheNumberOne 2014年

但是,如果您这样做,java.util.*则将.*所有内容都导入该软件包下。就像您当前正在导入fuction包中的所有类一样。
Anubian Noob 2014年

5
@ Anubian Noob import仅导入该包中的类。它不会从该软件包中的软件包中导入任何类。例如,class Function在package中,java.util.function但不在package中java.util
TheNumberOne 2014年

哦,我不好,对此感到抱歉。
Anubian Noob 2014年

3

MATLAB,33字节-5 = 28

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

即使增加了几个字节(37-5 = 32),我实际上还是更喜欢这种方法:

x='1i -';x((mod([n/2,n],2)>=1)+[3,1])

i^3-i,而不是i,它只是添加了1个字符。-其他读者的旁注:如果没有挑战的首要规则,Matlab解决方案将只有3个字符长。
丹尼斯·贾赫鲁丁

是的,那是一个错字。固定!感谢您的注意...至少第二种方法(更有趣)是正确的=)
Stewie Griffin 2014年

3

C 77

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

由于Ruslan而有所改善

C 74-5 = 69

哦,当然是最明显的方法

main(){unsigned n,*c[]={"1","i","-1","-i"};scanf("%d",&n);puts(c[n%4]);}

2
您可以删除括号n%2并使用,~而不是!因为n先取反,然后%与2 ing会得到相同的结果,至少对于而言n<(1<<32)-1。C不需要显式定义函数的返回类型,因此您可以int 在一开始就将其删除。并且也可以使用0代替'\0'。因此为-9个字符。
Ruslan

3

OCaml 47

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

这不是一个屡获殊荣的解决方案,但这是我第一次进行代码编程,因此我不确定自己在做什么。我尝试使用模式匹配,但这使我超过了58岁。


3

Pari / GP,19字节-5 = 14

CR[x]/(x2+1)

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

i这里仅仅是一个符号,而不是虚数单位(这是I在帕里/ GP)。

在线尝试!


2

红宝石32-5 = 27

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

适用于负功率!


您可以通过轻松地打高尔夫球puts %w[1 i -1 i][gets.to_i % 4]
histocrat

2

Perl,26-5 = 21

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

可以作为独立程序(命令行参数)或函数主体使用。


2

Java:151 131-5 = 126

打高尔夫球:

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

取消高尔夫:

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

作为函数:72-5 = 67

打高尔夫球:

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

取消高尔夫:

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

是的,还有另一个Java答复-打高尔夫球比以往任何时候都要糟糕。但是您会尽力...

编辑:添加了功能版本。

编辑2:因此,经过一番反复试验之后,这是一个尝试按书进行操作的版本,而没有探讨循环漏洞。所以…

具有值计算的Java:146-15 = 131

打高尔夫球:

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

取消高尔夫:

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

(至少,我认为我可以要求最高奖金,否则请更正我)


如果将其作为参数传递给main,则可以减少代码。
user902383 2014年

@ user902383,我的确可以做一个函数。可能也会发布两个版本。
Rodolfo Dias 2014年

实际上我正在考虑解析它,所以您将拥有int n = Integer.parseInt(a[0])
user902383

@ user902383 Daaaaamn,甚至都不记得了。竖起大拇指
Rodolfo Dias

2

的Python-31

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

我最近才开始学习python。即使我知道这不好,这也是我能做的最好的。


2

Haskell GHCi,29字节-15 = 14

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

用法:

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

2

R,29-5 = 24字节

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

在线尝试!

与上面的大多数方法相同,取4的模,并将其取1,因为R的数组是1索引的。也适用于负整数。

我在这里担心混合输出,但是Giuseppe指出,当R将数字类型混合时,它们会将数字类型强制转换为字符串类型。



@Giuseppe对此完全空白。我担心的是,输出在技术上是混合的,半字符串,半数字。
Sumner18

不,R 在混合时会自动将numeric类型强制为character哈德利(Hadley)的书对此作了很好解释-只需按Ctrl + F即可执行“强制转换”,您会看到它,但整本书值得一读(主要用于非高尔夫目的,但有时您会学到一两个窍门,嘿嘿)
朱塞佩


1

Haskell,29个字节-5 = 24

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

适用于负功率。

我设计了一个无点版本,但事实证明它实际上更长。

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

1

Clojure(64 54 31个字符)

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

编辑

根据@SeanAllred的建议,以下是使用文字向量而不是case函数的版本:

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

编辑2

通过依靠REPL打印出结果集合并使用#()快捷方式对函数进行编码,我们可以将其简化为

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

(实际上,这比Clojure / Lisp-ish要多得多,因为该函数现在实际上返回生成的结果,从而允许该函数与一起使用map,如

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

哪个打印

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

分享并享受。


除了使用选择结构之外,您是否可以像我的回答中那样使用某种显式数组?
肖恩·艾瑞德


1

C 105是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);
}

它甚至无法编译,因为您必须在纯C中的:in ?:语句后括号中的赋值。另外,什么0==0时候可以使用单个char 1呢?并且之前不需要括号?。另外,最后一个?:语句可以缩短为c[j]=i&1?'i':'1';
Ruslan 2014年

@Ruslan在CodeBlocks Mingw中,i&0周围只有1条警告。I&0 == 0是因为即便是一个测试,如果我是,即使结果是0否则为1
bacchusbeale

是的,但是0==0当与相同时使用有1什么意义呢?请注意,它==具有比更高的优先级&,否则,您(的)检验(i&0)==0将始终为true。
Ruslan 2014年

1

PARI / GP26-5 = 21

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

n->cos(t=Pi*n/2)+I*sin(t)短一个字符,但不能处理确切的答案。当然n->I^n是不允许的,大概也是PARI的powIs


1

果冻,2-20 = -18字节

ı*

在线尝试!

它不使用i ^ x内置函数,而是使用内置函数1j**因此不确定是否允许。


“如果您的语言支持复数,请不要使用任何可以解决此问题的函数或算术。” 我认为这很清楚……
完全是人性的

@totallyhuman好吧,我不确定该1j 文字是否也被禁止?
暴民埃里克'17

是的,但是算术(*)是。
totallyhuman

1
@totallyhuman Hm,也许我会在下面添加另一个版本,尽管“不要使用任何可以解决此问题的函数或算术”似乎表明我无法使用内置函数来执行此确切任务...顺便说一句,他所说的话让我觉得鼓励你使用1j文字。
暴民埃里克(Erik the Outgolfer)'17年

1

05AB1E,得分5(10 字节 -5奖励)

'i®„-i1)Iè

在线尝试验证更多测试用例

说明:

'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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.