数値の反転バージョンを返します


18

計算機に数値が表示されると、その数値のさまざまな変換がどのようになるかを考慮することができます。たとえば、7セグメントディスプレイでは、2は次のように表示されます。

ここに画像の説明を入力してください

そして、水平方向に反転すると、次のようになります。

ここに画像の説明を入力してください

そのため、2の鏡像は5です。

このチャレンジのタスクは、1桁の数字を取得し、そのミラーイメージの番号を返すことです(可能な場合)。鏡像が数字のように見えない場合は、180度回転した数字を返します(可能な場合)。これらのどちらでもない場合は、-1を返します。

以下は、プログラムが処理する必要がある入力と出力の完全なリストです。

Input   Output
0       0
1       -1
2       5
3       -1
4       -1
5       2
6       9
7       -1
8       8
9       6

の挑戦、最短コードが優勝します!


17
私はあなたの最後の点に同意しません-7セグメントディスプレイ上の1は単に反対側に反転されるので、1は1に仮眠します。
Jwosty14年

29
各桁を反転する方法について混乱しています。2が5になった場合、その後、6は後方9、ではない9になるはずですが、6が9になった場合、その後、フリップだけ回転され、その2は、別の2になり、ない5
kernigh

6
6、9は180度回転し、2、5は水平に反転し、実際には1、3は垂直軸を横切る自身の反射です。
jimmy23013 14年

22
質問で定義された翻訳はまったく一貫していません。なぜ2と5が反転するのに、3は反転しないのですか?
リナント14年

4
私は、切り替え可能な数字について奇妙な事実に気付きました。それらは反対のバイナリパターン、つまり2 = 010、5 = 101を形成します。6 = 0110、9 = 1001。誰もがこの事実をソリューションで使用できますか?
ジャックエイドリー14年

回答:


32

ハスケル- 43 31

何も派手な43文字。

f 0=0
f 8=8
f 2=5
f 5=2
f 6=9
f 9=6
f _= -1

部分的な機能にすることで、31文字になりました。

f=([0,-1,5,-1,-1,2,9,-1,8,6]!!)

4
私は笑った。+1します。
seequ 14年

6
+1 Haskellを使用して、仕様どおりに実行します。言う!
recursion.ninja 14年

1
f=2番目の解決策は有効な表現であるため、私はあなたが必要とは思わない
-Cyoce

23

GolfScript、15 14

仕様をもう一度読みましたが、入力は文字列でなければならないことがわかりました。

"0.5..29.86"\?

走る:

echo -n 2 | ruby golfscript.rb a.gs

古いバージョン(整数入力を使用):

[0.5..2 9.8 6]?

新しいもの(14バイト)は、aditsuによるCJamの回答にやや影響を受けています。


1
私はそのことを考えていなかったと信じてすることはできません...
デニス・




8

CJam、20バイト

q25691347`"5296W"er~

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

出力

$ for i in {0..9}; { cjam <(echo 'q25691347`"5296W"er~') <<< $i; echo; }
0
-1
5
-1
-1
2
9
-1
8
6

使い方

q          " Read from STDIN. The leaves a string on the stack.            ";
25691347`  " Push the string '25691347'.                                   ";
"5296W"    " Push the string '5296W'.                                      ";
er         " Perform character transliteration.                            ";
~          " Evaluate the result. Examples: '2' returns 2, 'W' returns -1. ";

8

BEFUNGE 93 - 18 14の 20バイト

コメンテーターは正しいと思いますが、Befungeは2次元の言語であるということは少し異なります。それでも、現時点では、コメンテーターは正しいです。

&1g01g-.  
! &  #* )'

手順:

&

入力を数値xとして読み取り、スタックにプッシュします。

1g

位置x、1で文字値c(つまり、「!」= 33、または「*」= 42など。空のセル= 32)を取得します。

01g-.

セル0,1(33)の文字値を読み取り、cから減算し、数値として出力します。


2
けっこういい。+1します。
seequ 14年

長さを修正してください:それは20のバイトだ
HAR-wradim

1
実際にバイト数を間違えています。19バイトを使用しました。改行とスペースをカウントします。ただし、Befunge 98に切り替えると、保存できます。:への1行目を変更&1g'!-.
ジャスティン

8

Java-49

long f(int a){return(0x790a300601L>>(a*4)&15)-1;}

ここに、0x790a300601目的の出力が詰め込まれた値があり、正の値になるように1つ追加されています。値は値内のニブルに格納されるため、それらをポップするには少しのシフトとマスキングが必要です。

Java-100(楽しいオプション)

int f(int a){Random r=new Random(0x2000A2F47D6Fl);int b=0;for(;a>=0;a--)b=r.nextInt(11)-1;
return b;}

最小のオプションではありませんが、少し楽しいです。X回呼び出されたときに正しい値を生成するランダムシードを見つけました(0> = X <= 9)。


賢い。+1
チョイス

8

JavaScript(ECMAScript 6)25

x=>'1060039097'[x]-(x!=6)

JavaScript(ECMAScript 5)43

function f(x){return'1060039097'[x]-(x!=6)}

更新:edc65は、はるかに優れた手法を提案しています。歯ブラシははるかに優れた言語を提案しています。この時点で、私の主な貢献はデバッグと機能です。


1
これをECMAScript 6(Firefoxでサポート)に変更する場合は、単に実行できますx=>[0,-1,5,-1,-1,2,9,-1,8,6][x]
歯ブラシ14年

最初は、function(x)[0,-1,5,-1,-1,2,9,-1,8,6][x]Firefoxのおかげで、ほぼ投稿しました。私はとにかく勝つつもりはなかったので、最高の互換性の答えに固執することにしました。簡潔にするために言語の切り替えを開始すると、最終的には、私が行うすべての課題に対して独自の言語の定義を開始します。しかし、私はあなたがそれを示唆しているので、とにかくECMAScriptの6バージョンを先に行くと言及します
KEEN

1
同じ概念ですが、より短い(カンマバイバイ):x => '106003907' [x]-(x!= 6)
edc65 14

@ edc65ご存知のとおり、文字列を使用したかったため、結果を数値に強制的に戻すことができるという事実を完全に空白にしていました。奇妙な失態。それでも私はまだ思い付かなかったでしょう-(x!=6)。ありがとうございました。
キーン14年


6

バッシュ29

tr 1-9 x5xx29x86|sed s/x/-1/g

例えば

$ echo 0 1 2 3 4 5 6 7 8 9 | tr 1-9 x5xx29x86|sed s/x/-1/g
0 -1 5 -1 -1 2 9 -1 8 6

'sed式の前後は省略できます。また、私はあなたが省略することができると思うgスペックは一度に1桁を提供するために
デジタルトラウマ

ありがとう。これは単なる例であり、提出自体はを使用しません'gより長い入力が好き!

4

コナ - 29

この関数は、配列xから要素を返します0 -1 5...

f:{0 -1 5 -1 -1 2 9 -1 8 6@x}

例:

> f 2
  5
> f 5
  2
> f 8
  8

ベクター自体は本当に許可されていますか?
seequ 14年

@TheRare:うーん、それは「アルゴリズム」と言うので、そうではないと思います。私は...それを変更し、より多くのあなたのようにそれを作ってあげる
カイルKanos

良いようです、+ 1を持っています。
seequ 14年

4

JavaScript 36 37 41

alert('0x'+'65b558f5ec'[prompt()]-6)

ES6関数として-27:

f=v=>'0x'+'65b558f5ec'[v]-6

2
28:f=v=>~-[1,,6,,,3,10,,9,7][v]
nderscore 14年

@nderscore人のコードを改善するのが大好きですね。
seequ 14年

3
@TheRare最短のJavaScriptコードを探しているところです。:)他の誰かが既に良い答えを投稿している場合、ほとんど重複している新しい答えを投稿するよりも、最適化を見つける方が理にかなっています。私はここで競争するのではなく、この目標を達成するために協力するだけです。
アンダースコア14年

@nderscore私の考えが十分に似ている限り、私は同じ考え方を持っています。とにかく、いいね。
seequ 14年

@nderscore本当にモチベーションをくれました。私はそれを短くできるかどうかは
わかり

4

スクリプティング、11文字

걄럣뉥밈결⓷方分결剩貶

最後に、Visual StudioがインストールされたインタープリターをビルドするWindowsコンピューターを見つけました。そして、それは私のGolfScriptコードを簡単に破りました。

18453063256\11\?/11%(GolfScript で読み取ります。


2
興味深いですが、GolfScriptの答えはまだ勝ちです。質問に特に明記されていない限り、長さはバイト単位で測定されます。
デニス

@Dennisこれは、このサイトでの3番目または4番目の回答でした。知りませんでした。そして、APLは例外だと思います。
jimmy23013

@Dennisそして、ほとんどの人はスクリッピングが好きではありません。:)
jimmy23013

実際には例外ではなく、エンコードを選択できるようにしています。UTF-16を使用したサイズなので、この答えは22バイトを獲得します。APLは256種類の文字のみを使用し、1文字が正確に1バイトであるAPLコードページがあります。
デニス

@デニスああ、あなたは正しい。
jimmy23013

3

J- 28 27バイト

あなたは私が好きなものを知っていますか?シンプル(28バイト)。Jでは、_1負の値(-1)であることに注意してください。

f=:{&0 _1 5 _1 _1 2 9 _1 8 6

少し複雑にすると、27バイトになります。

f=:-{&0 2 _3 4 5 3 _3 8 0 3

例:

   f 2
5
   f 6
9
   f 5
2
...

3

CJam-14

入出力バージョン:

"0 5  29 86"q#

スタックバージョン(番号がスタック上にあると想定):

[0W5WWY9W8 6]=

http://cjam.aditsu.net/で試してください


CJAMに関するWikipediaの記事はありません。リンクは空のフィドラーへのリンクです。言語と確立されたリリースに関する情報はどこで入手できますか?
パンツァークライシス14年

このように見えます:sourceforge.net/projects/cjam
Panzercrisis 14年

@Panzercrisis cjam.aditsu.net「CJamは」SourceForgeのページにリンクしている
aditsu

3

Perl、27 26

カウントにはpフラグが含まれます

y/2569/5296/,s/[1347]/-1/

使用法:

$ echo 7 | perl -pe y/2569/5296/,s/[1347]/-1/
-1

待ってください、PerlはJを打ち負かしたのでしょうか?:)


1私はポストに行っていたy+0-9+9a4aa70a13+;$_=9-hex同じ長さですが、あなたはより多くのオリジナルである、;)
core1024

1
@ core1024:そして短くなりました;)
Zaid 14年

しませんでした:echo 1 | perl -pe y/2569/5296/,s/[347]/-1/
core1024 14年

@ core1024:仕様を読み違えました。今すぐ修正する必要があります。Jソリューションよりもまだ短いです。
ザイド14年

値を厳密に入力し、数値が文字列と一致しないため、Jでこれを行う簡単な方法はありません。
seequ 14年

3

マーベラス 34バイト

}0
=6=9=2=5=0=8?0
+3-3+3-3....--

これは最短の解決策ではありませんが、最長の解決策でもありません。

使い方

}0最初のコマンドライン入力を表す大理石を生成します。この大理石は、次のティックを=6セルにドロップします。=6は比較セルであり、値6のビー玉を押し下げ、他のすべてを右側に押し出します。この比較セルのラインナップは、ビー玉が希望の値になるまでビー玉を押し出します。0と8はそのまま落ち、ボードの底から落ちると印刷されます。6と2、9と5は最初に3を加え、それぞれから引きます。ビー玉が目的の値のいずれにも等しくない場合、?0セルに着地し、ビー玉を0ビー玉1に変えます。その後、この大理石は減少し、ボードから落ちます。

1 Aの?n大理石は、技術的に0とnの間の大理石に任意大理石を回します。これには、?0すべてを0に変える素晴らしい副作用があります。


2

MATLAB-35

これをn唯一のパラメーターとして関数にラップします。

f=[0,-1,5,-1,-1,2,9,-1,8,6];
f(n+1)

35文字。


2

ECMAScript 6、24

f=x=>~-++'0n5nn29n86'[x]

通常のJavaScriptを使用すると、33になります。

alert(~-++'0n5nn29n86'[prompt()])

2

TI-BASIC、24 22

-1+int(11fPart(11^Ans.0954191904

これは、11を基数とする浮動小数点数として保存されたルックアップテーブルに出力をエンコードします。小数点の後の(N + 1)-11桁目がテーブルから抽出され、反転した数字の値を取得します。基数11の数は.106003A097であり、この小さい方の桁は正確0,-1,5,-1,-1,2,9,-1,8,6です。

6の場合に1を引くedc65のトリックは、この24バイトのソリューションにつながります。 ⑩^(は、1つの1バイトトークンであるます。

-(Ans≠6)+int(10fPart(.1060039097⑩^(Ans

文字列アプローチは29バイトです。

-(Ans≠6)+expr(inString("1060039097",Ans+1,1

配列アプローチ(Ypnpynも採用)は、数がXに格納されていると仮定すると、30バイトです。

{1,0,6,0,0,3,10,0,9,7}-1:Ans(X+1

24-> 22:マジック定数の余分な2桁の精度を削除しました。


これはほぼ確実に19、おそらく18になります。ただし、正しい番号を検索する必要があります。
リルトシアスト

2

C-47バイト[48バイト]

f(i){return(int[]){1,0,6,0,0,3,10,0,9,7}[i]-1;}

86バイトのI / O(他の答えは常にそうではなかった)を追加するには:

main(i){i=(int[]){1,0,6,0,0,3,10,0,9,7}[getchar()-48]-1;i<0?puts("-1"):putchar(i+48);}

1
うわー、私はこれが事であるような手がかりインライン配列リテラルを持っていませんでした。非常に良い最初の答え、そしてPPCGへようこそ!(I / O 関数を追加する必要はありません。サブミットは完全に有効です。)
Martin Ender

1

Python-34

f=lambda n:ord("A@F@@CJ@IG"[n])-65


これがどのように、そしてなぜ機能するのかを説明したいと思うかもしれません
Riot 14年

asciiテーブルasciitable.comを使用して、選択した空白をPythonで印刷できます。それは実際のようなものに見える&#002;&#002;&#008;&#002;&#002;&#005;&#012;&#002;&#011;&#009;理由でそれのマイナス3をその-1葉ヌル良くない文字、およびマイナス2葉pythonで予約されている改行
ディランMadisetti

1

Java、58 59

int f(int i){int[]a={1,0,6,0,0,3,10,0,9,7};return a[i]-1;}

または

int f(int i){return new int[]{1,0,6,0,0,3,10,0,9,7}[i]-1;}

あなたは配列にし、後に各値に1を追加する場合は、[i]はsubstract 1.あなたのコードが少し短くすることができます
barteks2x

@ Barteks2x良い点; 感謝
Ypnypn


1

C - 117の 108 106 77 76バイト

a[]={1,0,6,0,0,3,10,0,9,7};main(int c,char**b){printf("%d",a[*b[1]-48]-1);}

ゴルフに最適な言語ではありませんが、まあ...で
コンパイルしgcc progname.c -o prognameます。(警告を無視するか、追加します-include stdio.h、コンパイルコマンドにします。)

使用法:./progname <number>

編集

@bebeの提案に従って、代わりにSTDINから入力を取得する例を次に示します。

C- 68 51バイト

main(){printf("%d","106003:097"[getchar()-48]-49);}

使用することはd=*b[1]-48良い考えかもしれない
BEBE

@bebeあ、はい、ありがとう!
BenjiWiebe 14年

1
main(){printf("%d",(int[]){1,0,6,0,0,3,10,0,9,7}[getchar()-48]-1);}この件でご迷惑をおかけして申し訳ありませんが、もう少し短いと思います。
ベベ14年

キャストを必要としないように配列をグローバルにすることにより、別の文字を保存できます。a[]={1,0,6,0,0,3,10,0,9,7};main(){printf("%d",a[getchar()-48]-1);}
Allbeert

2
main(){printf("%d","106003:097"[getchar()-48]-49);}51バイト
BEBE

1

J(24、関数)

(入力パネルはうまく再生されていません。Pythonインタプリタに以下を貼り付けてください。答えが明らかになります:)

print "f=:{&(_3+3 u:'^C^B^B^E^L^B^K\t')"


1

05AB1E、13バイト(非競合)

0®5®®Y9®8 6¹@

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

-3 エミニャに感謝します

説明:

0®5®®Y9®8 6¹@ Takes an integer from STDIN.
0®5®®Y9®8 6   Push 0, r=-1, 5, r=-1, r=-1, Y=2, 9, r=-1, 8, 6.
           ¹  Push first input item.
            @ Pop and push the 0-indexed stack item at the respective index.

0®5®®Y9®8 6¹@同様に動作するはずです。
エミグナ

@Emignaわからなかった、ありがとう!
エリックアウトゴルファー

との良い思考@。頻繁に使用されているのを見ることはありません:)
エミグナ

@Emigna )¹èまたはより短いバイト)sè
エリックアウトゴルファー


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