조건문이없는 조회


23

이 과제는 Arduino 마이크로 컨트롤러를 프로그래밍하여 영감을 얻었습니다. 6 개의 LED와 6 개의 버튼이 보드의 다양한 핀에 연결되어 있습니다. 코드에서 각 버튼과 LED에는 ID 번호 (1-6)가 할당됩니다. ID 번호에 해당하는 핀 번호 (0-13 범위)는 switch명령문 을 사용하여 조회됩니다 . 순전히 오락을 위해, switch미래의 코드 관리자를 놀라게하기 위해 산술 / 기타 기능으로 이러한 es를 피할 수 있는지 궁금합니다 .

도전

ID 번호 (정수)를 매개 변수로 사용하는 기능 / 기능을 제공하고 조건문을 사용하지 않고 6 개의 LED 및 / 또는 6 버튼의 핀 번호 (정수)를 반환합니다 (no if, no switch및 ternary).

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 번호 (정수)와 두 번째 매개 변수 (모든 유형)를 사용하고 해당 핀 (정수)을 반환하는 단일 기능을 제공하십시오.

규칙

이것은 아두 이노 특유의 도전 이 아닙니다 . 사용 언어를 수행 무엇이든 당신이 원하는.

편집 : steveverril 의 제안에 따르면 , 이것은 현재 코드 골프 도전입니다.

행운을 빕니다!

(여전히 읽는 경우 : 프로그래밍 표준에 따라 특허가 불합리하고 임의적 임에도 불구하고 매핑은 Arduino Micro의 핀아웃을 기반으로합니다. 핀 0과 1은 직렬 통신용으로 예약되어 있으며, LED는 6 개의 가장 낮은 번호의 PWM 가능 핀에 할당됩니다. , 버튼은 나머지 핀에 할당됩니다)


PPCG에 오신 것을 환영합니다! 나는 공감하지 않았지만 이것이 코드 골프로 더 좋을 것이라고 생각합니다. 이런 상황에서 인기 경연 대회는 매우 광범위합니다. BTW, 샌드 박스 meta.codegolf.stackexchange.com/q/2140/15599 에 질문 을 게시하여 게시하기 전에 검토하도록 할 수 있습니다
Level River St

"no if"라고 말할 때 조건식을 정수로 사용할 수 있습니까? 예를 들어 1+(1==1)?
kirbyfan64sos

예, 괜찮습니다. 만 도전 (에 언급 된 세 개의 문 if, switch및 원)는 출입 금지입니다.


1
@steveverrill 제안에 감사드립니다, 도전은 이제 코드 골프입니다. 메타에 대한 +5의 평판 요구 사항을 충족했다면 Sandbox에 게시했을 것입니다.) 따라서 +1 담당자를 하향 조정하지 않은 것에 대해 두 번 감사드립니다.

답변:


10

C, 각 28 바이트

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

이것은 기본적으로 kirbyfan64sos의 대답과 동일하지만 정수 대신 char 배열을 사용하며 더미 첫 바이트가 있으므로 함수 매개 변수에서 1을 뺄 필요가 없습니다.


9

하스켈, 각각 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의 정신에 있지 않다는 것을 알고 있지만, 이것은 완벽하게 좋은 솔루션을 편집하기에는 너무 늦고 너무 작습니다. 그래도주의를 기울여야합니다
Leif Willerts

너무 늦었 어?
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);}

한 함수가 다른 함수를 호출하는 것이 허용 가능한지 여부는 명확하지 않았습니다. 그렇지 않다면, 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;}

죄송합니다. 도와 드릴 수 없습니다 ... 지금은 실제 해결책을 제시했습니다.

보너스 챌린지, 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에 게시하지 않을 것입니다 : P 흥미롭게도, 실제 Arduino 프로그램에서 이것을 사용하면 컴파일 된 바이너리의 크기가 커집니다 (보드에 ~ 28K의 저장 공간이 주어지면, 피해야합니다).

어때요 p(i){return"@cefijk"[i]&15;}b(i){return"@bdghlm"[i]&15;}?
squeamish ossifrage

@squeamishossifrage 자신의 답변으로 게시해야합니다. 그들은 내 것보다 낫다. :)
kirbyfan64sos

@ kirbyfan64sos 아, 그럼
으스스한 ossifrage

4

Pyth-각 12 바이트

베이스는 배열을 인코딩합니다.

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

마지막은 캐리지 리턴을 쓸 수 없으므로 탈출했지만 실제로는 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를 사용하기 시작했으며 목록을 효율적으로 인코딩하는 그의 방법을 부끄럽게 조정했음을 인정합니다.

이것이 부적절하다면 가장 깊은 사과를 드리며 저의 입장을 제거하겠습니다.


1
브라이언 T! 내 언어를 사용하게 된 것을 기쁘게 생각합니다. 기본 인코딩은 정확히 새로운 아이디어가 아니기 때문에 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- 프롤로그, 각 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

보너스 (L & B가 정의 된 경우 1 바이트)

@

예:

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

자바 스크립트 (ES6), 26/27 바이트

LED :

a=>`0   
`.charCodeAt(a)

버튼 :

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

위의 내용이 실행되지 않으면 다음과 같은 16 진 덤프가 있습니다.

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로 작업 할 두 번째 것을 얻을 수 없으므로 사용해야했습니다. \r

보너스, 41 바이트

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

육각 덤프

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)|

두 번째 매개 변수는 LED의 경우 0이고 버튼의 경우 1입니다.


0

Brainf ** k, 107 바이트

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

이것은 처음으로 직접 코딩 한 BF 프로그램이므로 여러 가지 최적화가 필요하다는 것을 의심하지 않습니다. 그러나 여전히 굉장합니다. :)

[]그래도 조건부로 계산 되는지 확실하지 않습니다 ... : /


우리는이 도전 당신이 하나를 사용하기를 원한다면 당신의 처리에 BF의 optimisers의 전체를)
베타 붕괴

@BetaDecay 그들은 훌륭해 보이지만 실제로는 내 코드를 더 짧게 만들지 않습니다 ... : /
kirbyfan64sos

흠, 그것은 부끄러운 일이다. : P
Beta Decay

0

파워 쉘-27-27-72

args로 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을 args로 사용

:\>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

자바 스크립트 113 74 66 59 52 33 (하나의 기능)

비트 시프트를 사용하여 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

자바 스크립트 (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

파이썬, 각 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

파이썬, 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)

이것들은 끔찍합니다. 내가 여기서 뭐하는지 모르겠어 ...

그럼에도 불구하고 그들은 꽤 흥미 롭습니다! :디


0

루비, 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

넷째, 각각 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.