条件ステートメントなしのルックアップ


23

この課題は、Arduinoマイクロコントローラーのプログラミングに触発されました。ボード上のさまざまなピンに接続された6つのLEDと6つのボタンがあります。コードでは、各ボタンとLEDにID番号(1〜6)が割り当てられています。ID番号に対応するピン番号(0〜13の範囲)は、switchステートメントを使用して検索されます。純粋に娯楽のために、これらのswitchesを算術/その他の関数で回避して、将来のコードメンテナーを恐ろしくすることができるかどうか疑問に思っていました。

チャレンジ

ID番号(整数)をパラメーターとして受け取り、条件ステートメント(no if、no switchおよびno ternary)を使用せずに、6個のLEDおよび/または6個のボタンのピン番号(整数)を返す関数を提供します。

LEDの戻り値:

ID    Pin
1      3 
2      5
3      6
4      9
5     10
6     11

ボタンの戻り値:

ID    Pin
1      2 
2      4
3      7
4      8
5     12
6     13

ボーナスチャレンジ

LEDまたはボタンのピンが要求されているかどうかを示すID番号(整数)と2番目のパラメーター(任意のタイプ)を受け取り、対応するピン(整数)を返す単一の関数を提供します。

ルール

これはArduino固有の課題ではありません任意の言語を使用し、必要ことを行います。

編集:steveverrilの提案で、これは今やゴルフの挑戦です。

がんばろう!

(あなたがまだ読んでいる場合:プログラミング規格によって特許的に不条理でarbitrary意的ですが、マッピングはArduino Microのピン配列に基づいています。ピン0および1はシリアル通信用に予約されており、LEDは6つの最小番号のPWM対応ピンに割り当てられています、ボタンは残りのピンに割り当てられます)


PPCGにようこそ!私は下票しませんでしたが、これはコードゴルフとしてより良くなると思います。人気コンテストは、このような状況では非常に広範です。ところで、あなたは私たちのサンドボックスに質問を投稿することができますmeta.codegolf.stackexchange.com/q/2140/15599彼らは前の投稿に見直さ持っている
レベル川セントを

「no if」と言うとき、整数として条件式を使用できますか?例えば1+(1==1)
kirbyfan64sos

はい、それらは結構です。チャレンジで言及されている3つのステートメント(ifswitchおよび3項)のみが立ち入り禁止です。


1
@steveverrillは提案をありがとう、チャレンジはコードゴルフです。メタに対して+5のレピュテーション要件を満たせば、Sandboxに投稿したことになります:)だから、+ 1が低いrepカジュアルをダウンボットしないことを二重に感謝します。

回答:


10

C、各28バイト

p(i){return"@cefijk"[i]&15;}
b(i){return"@bdghlm"[i]&15;}

これは基本的にkirbyfan64sosの答えと同じですが、整数の代わりにchar配列を使用し、ダミーの最初のバイトがあるため、関数パラメーターから1を引く必要はありません。


9

Haskell、各24バイト

l 1=3
l n=n+l(div(n+2)3)

チェックする:

> map l [1..6]
[3,5,6,9,10,11]

b 1=2
b n=n+b(div(n+1)2)

チェックする:

> map b [1..6]
[2,4,7,8,12,13]

ボーナス、Haskell、36バイト

a f 1=f+2
a f n=n+a f(n+f+1`div`f+2)

チェックする:

> map (a 0) [1..6]
[2,4,7,8,12,13]
> map (a 1) [1..6]
[3,5,6,9,10,11]

ボタンの場合は0、LEDの場合は1。


1
ボーナスでは、を使用できるはずa f n=n+a f(n+f+div 1f+2)です。
dfeuer

うん!codegolfの精神ではないことは承知していますが、これは手遅れであり、あまりにもマイナーすぎて完全に良いソリューションを編集することはできません。ただし、詳細に注意を向ける
レイフ・ウィラーツ

遅すぎますか?
dfeuer

7

C(数学)、32 / 27 26バイト(ボーナスチャレンジの場合は45)

いくつかの人々がさまざまなテーブル検索ソリューションを投稿しましたが、それは簡単な方法を取っているように思われました。

p(i){return~i&1|i*2^i*!(i%5-1);}
b(i){return i/5*5+1^p(i);}

1つの関数が他の関数を呼び出すことが受け入れられるかどうかは明確ではありませんでした。そうでない場合は、b(i)代わりに(33バイト)のこの代替定義を使用できます。

b(i){return(i&1|i*2)+i/5-!(i/2);}

ボーナスチャレンジ(45バイト):

f(i,t){return(i&1|i*2)+i/5-!(i/2)^t+i/5*5*t;}

t=0ボタンのパス、t=1LEDのパス)


5

C、各36バイト(ボーナスチャレンジの場合は49バイト)

p(i){return 3500459>>(4*(7+~i))&15;}
b(i){return 2390221>>(4*(7+~i))&15;}

ごめんなさい...私はそれを助けることができませんでした... OK、私は今本当の解決策を置きました。

ボーナスチャレンジ、49バイト

f(i,t){return(2390221+t*1110238)>>(4*(7+~i))&15;}

とを使用f(button,0)f(pin,1)ます。

Ideoneでのライブデモ。

Screenshot

オリジナル:

p(i){int a[]={3,5,6,9,10,11};return a[i-1];}
b(i){int a[]={2,4,7,8,12,13};return a[i-1];}

1
賢明な回答が必要な場合、PPCGに投稿することはありません。興味深いことに、実際のArduinoプログラムでこれを使用すると、コンパイル済みバイナリのサイズが大きくなります(ボード上の〜28Kのストレージスペースが与えられると、避けるべきものです)。

どうp(i){return"@cefijk"[i]&15;}b(i){return"@bdghlm"[i]&15;}
squeamish ossifrage

@squeamishossifrageあなたはそれらをあなた自身の答えとして投稿すべきです。彼らは私のものよりも優れています。:)
kirbyfan64sos

@ kirbyfan64sos OKああ、その後
うるさいossifrage

4

Pyth-各12バイト

ベースは配列をエンコードします。

@jC"Ý"14tQ (buttons)
@jC"\r'"12tQ (leds)

最後の1つは実際には12バイトです。ただし、キャリッジリターンを書き込めないため、エスケープしました。

ボタンのテストスイート

LEDSのテストスイート


OPはこれを関数(「関数を提供する」)であると考えています。それで、ボーナスを得るのは簡単なM@jC@"\rÝ"H+12*G2はずです。ピンの場合は0を、ボタンの場合は1を使用するようなものが機能するはずです。
kirbyfan64sos

3

Pyth、ボーナスのみ:20バイト

M@jC"5i«$xÍ"16+*6HtG

param#2はLEDの場合は0、ボタンの場合は1です。LED4のピン番号を取得するには、g4 0

私はこれをMaltysenのエントリーへのコメントとして投稿していましたが、始めたばかりなので、必要な評判がありません。私は今夜​​PYTHを使い始めたばかりで、リストを効率的にエンコードする彼の方法を恥知らずに適合させたことを認めています。

これが不適切な場合は、深くおaび申し上げます。エントリを削除します。


1
ブライアン・タック!あなたが私の言語を使い始めてうれしいです。ベースエンコーディングはまったく新しいアイデアではないため、Maltysenのアイデアのこの再利用はおそらく大丈夫だったでしょう。ただし、あなたがしたクレジットを与えることは重要です。ちなみに、Pythはすべて大文字で書くべきではありません-頭字語ではなく、単なる名前です。
isaacg

2

MIPS、16バイト

ビットシフトとビットマスク。入力で$a0、出力で$v0

sll     $t0, $a0, 2 
li      $t1, 0xba96530
srlv    $t0, $t1, $t0   
andi    $v0, $t0, 0xf

ボーナスについては、即時使用 0xdc87420


ゴルフの際にソースのサイズを数えることになっていないのですか?:)
nitro2k01

2

F#、28 + 28バイト

ルックアップテーブルなしでこれを試してみたかったです。

let L x=1+x*2-x%4/3-x/5-x/6
let B x=x*2+x/3-x/4+x%6/5*2

1

SWI-Prolog、各34バイト

l(I,P):-nth1(I,[3,5,6,9,10,11],P).
b(I,P):-nth1(I,[2,4,7,8,12,13],P).

l/2LED b/2用、ボタン用です。

ボーナス、66バイト

a(I,S,P):-nth1(I,[3:2,5:4,6:7,9:8,10:12,11:13],A:B),(S=0,P=A;P=B).

S = 0 LEDの場合、ボタンの場合は何でも。


1

q / k(各18バイト)

単にインデックス作成の場合:

L:0N 3 5 6 9 10 11
B:0N 2 4 1 8 12 13

例:

q) L[2]
5
q) B[6]
13

ボーナス(1バイト、L&Bが定義されている場合)

@

例:

q) @[`L;2]
5
q) @[`B;6]
13

これは一見巧妙なシンボルの使用です!+1
kirbyfan64sos

1

CJam、各10バイト

これらは匿名関数です。オンラインインタープリターへのリンクは、すべての入力値に対して関数を実行する小さなテストハーネス内に表示されます。

機能1(LED):

{5*3|4+3/}

オンラインで試す

機能2(ボタン):

{_6|5+*5/}

オンラインで試す

これらの式を生成および評価する小さなプログラムを作成しました。どちらの場合も、8文字(ブレースなしでのみ式をカウント)のソリューションがいくつか見つかりましたが、それ以下のソリューションは見つかりませんでした。


0

Javascript(ES6)、26/27バイト

LED:

a=>`0   
`.charCodeAt(a)

ボタン:

a=>`0\r`.charCodeAt(a)

上記が実行されない場合(おそらく)、hexdumpがあります:

00000000: 6C 3D 61 3D 3E 60 30 03 - 05 06 09 0A 0B 60 2E 63 |l=a=>`0      `.c|
00000010: 68 61 72 43 6F 64 65 41 - 74 28 61 29 0A 62 3D 61 |harCodeAt(a) b=a|
00000020: 3D 3E 60 30 02 04 07 08 - 0C 5C 72 60 2E 63 68 61 |=>`0     \r`.cha|
00000030: 72 43 6F 64 65 41 74 28 - 61 29                   |rCodeAt(a)|

生のCRで動作する2番目のものを取得できなかったため、使用する必要がありました \r

ボーナス、41バイト

(a,b)=>`0   
\r`.charCodeAt(a+b*6)

Hexdump

00000000: 28 61 2C 62 29 3D 3E 60 - 30 03 05 06 09 0A 0B 02 |(a,b)=>`0       |
00000010: 04 07 08 0C 5C 72 60 2E - 63 68 61 72 43 6F 64 65 |    \r`.charCode|
00000020: 41 74 28 61 2B 62 2A 36 - 29                      |At(a+b*6)|

2番目のパラメーターは、LEDの場合は0、ボタンの場合は1です。


0

Brainf ** k、107バイト

,>++++++++[>+>++++++<<-<------>]<[>+++<-[>++<-[>+<-[>+++<-[>>>+>+<<<[-]+<-]]]]]>>[<++++++>-]<.>>>[-[-]<-.>]

これは私の最初の手作業によるBFプログラムであり、いくつかの最適化が行われることを疑いません。しかし、それはまだ素晴らしいです。:)

[]条件付きとしてカウントするかどうかはわかりませんが...:/


BFオプティマイザーを使用したい場合は、自由に使用できるチャレンジあります;)
ベータ崩壊

@BetaDecay見栄えは良いのですが、実際にコードを短くするものはありません...:/
kirbyfan64sos

残念だフム、:P
ベータ崩壊

0

パワーシェル-27-27-72

LEDは1..6を引数として使用します

:\>wc -c LED.PS1 & cat LED.PS1 & echo.& powershell -nologo -f LED.PS1 1
27 LED.PS1
(0,3,5,6,9,10,11)[$args[0]]
3

ボタンは1..6を引数として使用します

:\>wc -c button.PS1 & cat button.PS1 & echo.& powershell -nologo -f button.PS1 6    
27 button.PS1
(0,2,4,7,8,12,13)[$args[0]]
13

LEDまたはボタンはb 1を使用します。l 2; b 6; 引数としてl 5など

:\>wc -c ledbutt.PS1 & cat ledbutt.PS1 & echo.& powershell -nologo -f ledbutt.PS1 b 5
72 ledbutt.PS1
$a=@{"b"=(0,3,5,6,9,10,11);"l"=(0,2,4,7,8,12,13)};$a[$args[0]][$args[1]]
10
:\>powershell -nologo -f ledbutt.PS1 l 5
12    
:\>powershell -nologo -f ledbutt.PS1 b 3
6    
:\>powershell -nologo -f ledbutt.PS1 l 2
4

0

オクターブ、40バイト(ボーナスチャレンジ)

匿名関数の使用:

@(x,y)[3 2;5 4;6 7;9 8;10 12;11 13](x,y)

この関数を定義した後、この関数をとして呼び出しますans(x,y)。ここxで、はピン/ボタンの番号でありy、値1とで2それぞれピンまたはボタンを示します。

オンラインで試す


0

JavaScript 113 74 66 59 52 33(1つの機能)

ビットシフトを使用して4ビット値を取得する。p(n、195650864または231240736)で呼び出す必要があります。

/*
  11   10    9    6    5    3
1011 1010 1001 0110 0101 0011 0000 = 195650864

  13   12    8    7    4    2
1101 1100 1000 0111 0100 0010 0000 = 231240736

                   b >> i * 4 xxxx
                         & 15 1111
                              yyyy (matching 1s)
*/
// Where b = 195650864 for pins and 231240736 for buttons.
function p(i,b){return b>>i*4&15}

代わりの。

/*
Using bitwise * 4 for bitwise only.    
function p(i,b){return b>>(i<<2)&15}
*/

0

Perl 4(37および31バイト)

LED(37バイト):

$c=pop;$c*2+($c~~[1,2,4,6]&&5.5<=>$c)

...しかし、ルックアップテーブルを使用します。

ボタン(31バイト、ルックアップなし):

$c=pop;2*($c+($c==5))+($c%3==0)

0

JavaScript(ES6)18,22,44

短いがつまらない編集

// LED 
l=i=>1-~' 134789'[i]
// Buttons
b=i=>[,2,4,7,8,12,13][i]

// bonus
f=(i,t)=>1-~[' 134789',[,0,2,5,6,10,11]][t][i]

//Test

out=x=>O.innerHTML+=x+'\n'

for(i=1;i<=6;i++) out(i +' -> '+l(i) + ' '+b(i) +' '+f(i,0)+' '+f(i,1))
<pre id=O></pre>


0

Python、各31バイト

まったく創造的ではありませんが、機能します!

l=lambda x:int(" 3569AB"[x],16)
b=lambda x:int(" 2478CD"[x],16)

ボーナス、44バイト

k=lambda x,y:int("3569AB2478CD"[x-1+6*y],16)

y LEDの場合は0、ボタンの場合は1にする必要があります。


0

Python、60 + 58 = 118バイト

p=lambda i:(2**i)*(i<3)+1+(i>2)*(5+3*(i-3))-(i>4)*(i-3+~i%2)
b=lambda i:2**i-(i>2)-(i>3)*(2**(i-1)-1)-4*(i>4)-15*(i==6)

これらはひどいです。ここで何をしているのかさえわからない...

しかし、それでもなお興味深いものです!:D


0

Ruby、45バイト

->i,t{[3,5,6,9,10,11,2,4,7,8,12,13][t*6+i-1]}

テスト入力:

->i,t{[3,5,6,9,10,11,2,4,7,8,12,13][t*6+i-1]}.call 1,0
=> 3

->i,t{[3,5,6,9,10,11,2,4,7,8,12,13][t*6+i-1]}.call 3,1
=> 7

0

第4に、各26バイト、ボーナス用に34バイト

squeamishによるCバージョンに似ています。

: P " CEFIJK" + C@ F AND ;
: B " BDGHLM" + C@ F AND ;

ボーナス:

: A " CEFIJKBDGHLM" + + C@ F AND ;

LEDには0、ボタンには6を使用します。そして、パラメーターの順序は関係ありません


-1

Pyth、各19バイト

L.&.>3500459*4-6b15
L.&.>2390221*4-6b15

それぞれピンとボタン用。

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