nを指定してi ^ nを見つける


27

チャレンジ

できるだけ少ない文字で、nが与えられ、0より大きい正の整数であるi ^ nの値を見つけます。これは文字列として出力する必要があります。

知らない人のために、iはi ^ 2 = -1となるように定義されています。そう:

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

これが繰り返されます。

ルール

  • 言語が複素数をサポートしている場合、これを解決する可能性のある関数や算術を使用しないでください。
  • とにかく小数を返す答えには浮動小数点の不正確さは問題ありませんが、整数入力は正確な結果を与えるはずです

ボーナスポイント

-5、nも負の値を計算できる場合

-15(実数の値を計算できる場合)(このボーナスには上記のボーナスの-5が含まれます)

がんばろう!


1
どの形式で正確に返しますか?関数出力またはstdoutを通じて?
誇りに思ってhaskeller 14年

@proudhaskellerタグwikiには、そのデフォルトがリストされています。特に指定がない限り、関数とプログラムは問題なく、関数引数、STDINまたはコマンドライン引数を介して入力し、STDOUTまたは関数の戻り値を介して出力します。関数に名前を付ける必要はありません。
マーティンエンダー14年

1
@MartinBüttnerが、関数出力を選択した場合、私の言語のネイティブ複素数なしで出力をどのようにフォーマット/保存する必要がありますか?
誇りに思ってhaskeller 14年

16
@BetaDecay浮動小数点整数とは何ですか?オブジェクト指向
マーティン・エンダー

2
@MartinBüttnerハハ間違った言葉:/浮動小数点数
ベータ崩壊14年

回答:


15

ルビー、スコア-2

(13バイト、-15ボーナス)

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

機能が含まれます:丸めエラーなし!(入力をRationalとして渡す場合)


著者、Kezz101により投稿

実数をサポートする場合、有効な複素数形式で出力できます。

ネガティブスコアにより、アドレナリンが急上昇します。したがって、ルールが悪用されると、この高貴な目標を達成するために利用れます。

匿名関数を作成し、極形式(角度単位:度)の複素数を表す2つのエントリを持つ配列を出力します。


4
..... "Rubyは、-2バイト"
FantaC

3
それで、この1,000,000,000,000回をダウンロードすると、2TBのハードドライブの空き容量が得られますか?私には大したことのようですね。
Redwolfプログラム

^成功する前にブラウザが故障しました。ファイルを中に入れて「zip bomb」を試してみませんか?(それを抽出するとスペースが節約されます。)
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]。)

実数をサポートし、整数入力の正確な結果を提供します。

Mathematicaの複素数i(ではない)でiないことに注意してください。これは未定義の変数です。I

また、式の順序にもかかわらず、Mathematicaは出力をR+Ci形式に並べ替えます。


必要はありません4%。自動的に実行できます。
jimmy23013 14年

@ user23013 nifty :)
マーティン・エンダー14年

8
2つの答えを別々にすべきではありませんか?
ジャスティン14年

@Quincunxたぶん...元々は両方ともCJamにあったので、同じ答えにしたのです。しかし、2番目のものは有効ではなかったため、Mathematicaに移植しましたが、そのままにしておきました。人々が私がそれらを分割できると主張すれば。
マーティンエンダー14年

また、のf@15代わりにを使用してキャラクターを保存できますf[15]
オロム14年

14

Python 2-(24-5)= 19

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

ほとんどのクレジットは@ user2357112に属し、私はこの回答に関するコメントから彼の回答をもう少しゴルフしました。

説明:n%4文字列内のインデックスから開始します'1i--'。次に、文字列の各文字を2ステップずつ逆方向に繰り返します。したがって、たとえば、n=6最初のインデックス2から開始し-、をスキップしてiを取得し1、を返し-1ます。

@xnorは同じ長さのソリューションを指摘しました:

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

パイス -(14-5)= 9

どのようにリバース/スライス/などをしようとしても、14しか得られないようです。: '(

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

これは、上記のpythonの答えと本質的に同じですが、pythはpythonの完全なインデックスオプションをサポートしていないため、2つのステップで行われます。オンラインでお試しください。

Pythのインデックス作成についてisaacgと話をするつもりです;)


Pythonをlambda変数に割り当てる必要はありませんか?少なくとも、呼び出すには、括弧で囲む必要があり、2バイトを追加して呼び出すことができます(lambda...)(n)
mbomb007

@ mbomb007 メタによると、これは許容範囲です。ここのコードは、必要なタスクを実行する関数を作成します。匿名ラムダは、Pythonでmapやなどの関数に対して比較的頻繁に使用されsortedます。
FryAmTheEggman

11

TI-BASIC(NSpire)-5(20文字-15)

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

複雑な戻り値を受け取りたい場合iは、末尾の(complex i)を置き換えます。


@MartinBüttnerTI-Basicは、ある種の「式」タイプを使用しているようで、組み込みメソッドはこれらの正確な結果を返します。
Shujal

なるほど。;)
マーティン・エンダー14年

「言語が複素数をサポートしている場合、これを解決する関数や算術を使用しないでください」というルールについてはどうですか。+ iが算術ある
edc65

@ edc65 +は実際には複雑な操作です。ただし、それが気に入らない場合は、通常のに置き換えてくださいi。変数iが定義されていない場合は、のi代わりに複素数を取得します。実数部と虚数部を別々に計算しています。
シュジャル14年

1
@Shujalその場合、iとにかく使うべきだと思います。複雑なiは、質問が求める文字すらありません。2バイト節約できるので、少なくとも私と結びついてください;)。
マーティンエンダー14年

7

マーベラス、43バイト

実際には勝者ではありませんが、Marbelousは楽しいです。:)

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

これは、最初のコマンドライン引数から単一の整数として入力を読み取るプログラムです。入力は256を法として取られますが、256は4で割り切れるため、255を超える入力の結果の有効性には影響しません。

説明

Marbelousは2Dプログラミング言語で、多数のデバイスを通過する「マーブル」(バイト値)をシミュレートします。ボードは、大理石を処理できる2文字幅のセル(デバイス)で構成されています。ボードの底から落ちるものはすべてSTDOUTに出力されます。

使用中のデバイスを見てみましょう。

  • }0は、最初のコマンドライン引数の場所です。このデバイスのインスタンスを2つ使用したので、入力値のコピーを2つ取得します(同時に)。
  • ^nn入力マーブルのthビット(ここでn=0最下位ビット)をチェックし、ビットを生成1または0依存します。
  • =0との等価性をチェックし0ます。入力ビー玉が等しい場合は、まっすぐに落下し、等しくない場合は右に押し出されます。
  • \/ はゴミ箱ですので、それは単に入力大理石を飲み込み、何も生成しません。
  • 2DはのASCIIコードで-31はのASCIIコードで1あり69、はのASCIIコードですi
  • &nsynchronisersです。シンクロナイザーは、同じものをn持っているすべてのシンクロナイザーが大理石を保持するまで大理石を失速させます。

したがって、実際には、3つの関連する文字を3つのシンクロナイザーに保持し、入力で最下位ビットがどのように設定されているかに応じてそれらを解放します。

詳細については、仕様ドラフトを参照してください


1
私はこれが本当に好きです!Marbelous音は私がいつかすぐにそれをチェックアウトする必要がありますファブ:)
Kezz101

3
Kezz101 @私たちは、仕様のドラフトを持ってこっち
マーティン・エンダー

いいね!それは本当に面白いです

コマンドラインでメインボードに入力を与えることができるので、このボードをそのまま使用できることを忘れないでください。
スパー14年

1
@overactorうーん、わかりません...追加の文字を出力することは(たとえ印刷できない場合でも)出力形式に違反しているようです。しかし、メタ質問に値するかもしれません。
マーティンエンダー14年

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])。しかし、それはそれほどセクシーではなく、負の力をサポートしません。それは私が推測するボーナスに依存します。
マイケルM. 14年

いいえ、29バイト。このコードでは負がサポートされています。
マイケルM. 14年

JSにはビット&演算子がありますか?その場合&3、真のモジュラス4操作を行うことができます。編集:&2あなたの答えで使用されているように見えます...
feersum 14年

5

Python 28バイト-5 = 23

-ve入力をサポートします。

ラムダ関数が許容されると仮定します(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^nからの値のリストを取得することができます0-9
FryAmTheEggman 14年

2
基本的には、より明確な場合、関数ポインターを作成しています:P
FryAmTheEggman 14年

3
@DigitalTrauma:はい。ただし、文字列スライシングトリックを使用するとより効果的に実行できる場合があります。たとえば、lambda n:'--1i'[n%4-2::2]
user2357112は

2
user2357112の投稿を翻訳するには:'--1i'index から始まる他のすべての文字を取得しますn%4-2。pythonが負のインデックスを取得すると、配列の末尾からその数だけ左の位置を開始し、次にに進み0ます。このようにして、0そして1今までにヒットしない-一方で、サインを3して4ください。
FryAmTheEggman 14年

1
lambda n:n%4/2*'-'+'1i'[n%2]スペースを削除して短くなります:)
FryAmTheEggman 14年

4

(Emacs)Lisp – 34

楽しみのために、(Emacs)Lispで:

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

使用する場合は、a defunまたはuseを使用します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のmethodを使用します。

¯12○.5×○

チャレンジの著者であるKezz101は次のように書いています。

実数をサポートする場合、有効な複素数形式で出力できます。

これは、aJbAPLが複素数を表示する通常の方法である形式で複素数を返します。

オンラインでお試しください!

説明

¯12○ ラジアン単位の角度を持つ単位ベクトルを見つける

.5× 半回

 引数にmultiplied(円定数)を掛けたもの



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.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]};

}

注:私はJava 8には慣れていません。それ用のランタイムもまだありません。構文エラーがあるかどうか教えてください。これも私の最初のゴルフです。

編集:削除しました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"};

}

あなたは、「輸入java.utilの*」といくつかの保存することができます
Anubian Noobの

@Anubian Noobクラス関数はパッケージに含まれてjava.util.functionいませんjava.util(または間違っていますか?)。
TheNumberOne

しかし、もしあなたがそうjava.util.*するなら.*、パッケージの下にすべてをインポートします。現在、fuctionパッケージ内のすべてのクラスをインポートしているように。
Anubian Noobの

5
@ Anubian Noob importは、そのパッケージのクラスのみをインポートします。そのパッケージ内のパッケージからクラスをインポートすることはありません。たとえば、クラスFunctionはパッケージにありますjava.util.functionが、パッケージにはありませんjava.util
TheNumberOne

ああ、それはごめんなさい。
アヌビアヌーブ14

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^3is -iではなく、i1文字を追加するだけです。-他の読者への補足:課題の最初のルールがなければ、Matlabソリューションの長さはわずか3文字になります。
デニスJaheruddin 14年

はい、それはタイプミスでした。一定!気づいてくれてありがとう...少なくとも2番目の(もう少し興味深い)アプローチは正しい=)
Stewie Griffin 14年

3

C 77

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

ルスランのおかげで改善

C 74-5 = 69

ああ、もちろん最も明白なアプローチ

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

2
括弧を削除してn%2~代わりに使用することができます。!なぜならn、最初に否定し、次に%2を指定すると、少なくともに対して同じ結果が得られるからですn<(1<<32)-1。また、Cは関数の戻り値の型を明示的に定義する必要がないためint 、最初に削除できます。また、の0代わりに使用します'\0'。したがって、-9文字です。
ルスラン

3

OCaml 47

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

賞を受賞したソリューションではありませんが、これは初めてのコードゴルフですので、自分が何をしているのか正確にはわかりません。パターンマッチングを使用しようとしましたが、58を超えました。



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

ジャワ: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 14年

@ user902383確かに、関数をいつでも作成できました。おそらく両方のバージョンも投稿するでしょう。
ロドルフォディアス

実際に私はそれを解析することを考えていたので、あなたは持っているでしょうint n = Integer.parseInt(a[0])
user902383 14年

@ user902383 Daaaaamn、それさえ覚えていませんでした。いいね
ロドルフォ・ディアス

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]

オンラインでお試しください!

上記のほとんどのメソッドと同様に、Rの配列は1インデックスであるため、4のモジュロをとり、1増やします。負の整数でも機能します。

ここでは混合出力について心配していましたが、Giuseppeは、Rが数値型を混合すると文字列型に強制することを指摘しました。



@Giuseppeが完全に空白にしました。私の懸念は、出力が技術的に混合された、半分の文字列、半分の数値であるということです。
Sumner18

いいえ、Rはnumericタイプcharacterが混在しているときに自動的に型を強制します!ハドリーの本はこれを非常によく説明しています-Ctrl + Fで「強制」にすると表示されますが、本全体を読む価値があります(主にゴルフ以外の目的のために、時にはトリック1つまたは2つを選択します)。 )
ジュゼッペ


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のっぽいあるどの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")

共有してお楽しみください。


選択構造を使用する代わりに、私の答えのように何らかの明示的な配列を使用できませんか?
ショーンオールレッド14年


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のステートメント内の後:に割り当てを括弧で括らなければならないため、コンパイルさえしません?:。また、0==0単一のcharを使用できる場合に使用するポイントは何1ですか?前に括弧で囲む必要はありません?。また、最後の?:ステートメントはに短縮できますc[j]=i&1?'i':'1';
ルスラン

@Ruslan CodeBlocks Mingwでは、i&0に関する警告は1つだけです。I&0 == 0私も結果が0それ以外であれば、それは1です、でものためのテストです
bacchusbeale

ええ、しかし0==0、それが同一であるときに使用するポイントは何1ですか?==はに比べて優先順位が高いことに注意して&ください(i&0)==0
ルスラン14年

1

PARI / GP26-5 = 21

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

n->cos(t=Pi*n/2)+I*sin(t)は1文字短くなりますが、正確な答えを処理しません。もちろんn->I^n許可されていませんpowIs。また、おそらくPARIも禁止されています。


1

ゼリー、2-20 = -18バイト

ı*

オンラインでお試しください!

それは使用しませんi ^ x組み込みを、それはのための組み込みコマンドを使用1jして**許可されている場合は必ずそうではありません。


「言語が複素数をサポートしている場合、これを解決する関数や算術は使用しないでください。」私はそれが...かなり明確だと思う
totallyhuman

@totallyhumanまあ、私も1j リテラルが禁止されているかどうかはわかりませんか?
エリックアウトゴルファー

ええ、でも算術(*)です。
完全に人間

1
@totallyhuman Hm、多分私は下に別のバージョンを追加しますが、「これを解決する関数や算術を使用しないでください」は、この正確なタスクを行うために組み込みを使用できないことを示唆しているようです...ところで彼の言い回しでは、リテラルを使用することをお勧めしていると思うようになり1jます。
エリックアウトゴルファー

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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.