“거짓하는 동안”관용구


47

거짓 동안 행하십시오

오늘 직장에서 동료 중 한 명이 수행하는 동안 유스 케이스를 설명하고있었습니다 (거짓). 그가 말한 사람은 이것이 어리 석고 단순한 if 문이 훨씬 나을 것이라고 생각했습니다. 그런 다음 하루의 절반을 낭비하여 다음과 같은 내용을 쓰는 가장 좋은 방법을 논의했습니다.

do
{
   //some code that should always execute...

   if ( condition )
   {
      //do some stuff
      break;
   }

   //some code that should execute if condition is not true

   if ( condition2 )
   {
       //do some more stuff
       break;
   }

   //further code that should not execute if condition or condition2 are true

}
while(false);

이것은 c에서 자주 발견되는 관용구입니다. 프로그램은 조건에 따라 아래 의사 코드와 동일한 출력을 생성해야합니다.

do
{
   result += "A";

   if ( C1)
   {
      result += "B";
      break;
   }

   result += "C"

   if ( C2 )
   {
       result += "D";
       break;
   }

   result += "E";

}
while(false);

print(result);

따라서 입력은 다음과 같습니다.

1. C1 = true, C2 = true
2. C1 = true, C2 = false
3. C1 = false, C2 = true
4. C1 = false, C2 = false

출력은 다음과 같아야합니다.

1. "AB"
2. "AB"
3. "ACD"
4. "ACE"

이것은 코드 골프이므로 답은 바이트로 판단됩니다. 표준 허점은 금지되어 있습니다.

예, 이것은 간단한 것이지만, 희망적으로 우리는 창의적인 답을 보게 될 것입니다. 단순함이 사람들이 덜 자신감있는 언어를 사용하도록 장려하기를 바랍니다.


출력은 대문자 여야합니까, 아니면 소문자도 허용됩니까?
Adnan

7
동료와의 토론을 제쳐두고, return result대신에 방법을 사용하여 동일한 것을 수행 할 수있는 것 같습니다 break. 그런 다음 재사용 성 및 호출 코드 단순화의 이점도 얻을 수 있습니다. 하지만 아마도 뭔가 빠졌을 것입니다.
jpmc26

3
나는 이것이 C의 관용구라는 것을 몰랐다.
Mehrdad

5
@Mehrdad 일부 사람들은 대신 goto사용하는 goto것이 좋지 않기 때문에 대신이 작업을 수행합니다 :)
Seth

2
내가 사용한 유일한 시간 do{}while(false)은 매크로 내부입니다. 간단한 if것은 충분하지 않습니다 else. 존재하는 주변의 s 와 잘못 상호 작용하기 때문 입니다. 매크로없이 당신은뿐만 아니라 제거 할 수 있습니다 dowhile.
nwp

답변:


19

파이썬 3, 31

xnor 덕분에 1 바이트를 절약했습니다.

ES6에서 1 바이트 만 떨어져 있습니다. : / 멍청한 파이썬과 긴 익명 함수 구문.

하나의 라이너를위한 만세!

lambda x,y:x*"AB"or"AC"+"ED"[y]

테스트 사례 :

assert f(1, 1) == "AB"
assert f(1, 0) == "AB"
assert f(0, 1) == "ACD"
assert f(0, 0) == "ACE"

7
을 다시 주문 x*"AB"하면 공간을 절약 할 수 있습니다.
xnor

2
죄송합니다, 귀하의 긴 익명 함수 구문은 Python의 죽음입니다 : P
Conor O'Brien

5
@ CᴏɴᴏʀO'Bʀɪᴇɴ 나는 뭔가 파이썬을 다시 잡아야한다는 것을 알았습니다. 최대한 빨리 PEP를 제출하겠습니다.
Morgan Thrapp


9
λ동의어 를 만드는 PEP lambda는 대단 할 것입니다 :)
Robert Grant

13

자바 스크립트 ES6, 30 26 25 바이트

두 개의 입력을받는 간단한 익명 함수입니다. 호출 할 변수에 지정하십시오. 업데이트 : 인덱스 악대 차로 넘어 갑시다. 4 바이트를 절약합니다. 나는 파이썬보다 내 리드를 확보했다 . 함수를 카레하여 바이트를 저장했습니다. 처럼 전화하십시오 (...)(a)(b). 패트릭 로버츠 감사합니다!

a=>b=>a?"AB":"AC"+"ED"[b]

이전의 원래 버전, 30 바이트 (python answer에 녹지 않도록 포함 (;) :

(a,b)=>"A"+(a?"B":b?"CD":"CE")

이것은 영리하지 않습니다 ...
theonlygusti

15
@theonlygusti 이것은 인기 골프 대회가 아닌 코드 골프입니다. 또한 더 간결한 솔루션이 있다면 낭비 바이트가 영리한 이유는 무엇입니까?
코너 오브라이언

나는 코의 선택을 좋아합니다:b?
J Atkin

@JAtkin 실제로!
코너 오브라이언

4
당신은으로 바이트를 저장할 수 있습니다 무두질
패트릭 로버츠에게


9

하스켈, 28 바이트

x#y|x="AB"|y="ACD"|1<2="ACE"

사용 예 : False # True-> "ACD".

가드로 직접 입력 값 사용


9

MATL , 15 17 바이트

?'AB'}'AC'69i-h

입력은 0또는 1별도의 라인. 또는 0교체 할 수 있습니다 F(MATL의 false)와 1T(MATL의를 true).

온라인으로 사용해보십시오!

?           % if C1 (implicit input)
  'AB'      %   push 'AB'
}           % else
  'AC'      %   push 'AC'
  69        %   push 69 ('E')
  i-        %   subtract input. If 1 gives 'D', if 0 leaves 'E'
  h         %   concatenate horizontally
            % end if (implicit)

8

Brainfuck, 65 바이트

이는 C1 및 C2가 원시 0 또는 1 바이트로 입력되었다고 가정합니다. 예 :

echo -en '\x00\x01' | bf foo.bf

골프 :

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

언 골프 드 :

                                      Tape
                                      _0
++++++++[>++++++++<-]>+.+  print A    0 _B
>+>,                       read C1    0 B 1 _0  or  0 B 1 _1
[<-<.>>-]<                 print B    0 B _0 0  or  0 B _1 0
[<+.+>>                    print C    0 D 1 _0
    ,                      read C2    0 D 1 _0  or  0 D 1 _1
    [<-<.>>-]<             print D    0 D _0 0  or  0 D _1 0
    [<+.>-]                print E    0 D _0    or  0 E _0
]

나는이 솔루션 실제로 while 루프에서 벗어나는 것을 기반으로한다는 점에 주목할 가치가 있다고 생각합니다 .



7

NTFJ , 110 바이트

##~~~~~#@|########@|~#~~~~~#@*(~#~~~~#~@*########@^)~#~~~~##@*##~~~~~#@|########@|(~#~~~#~~@*):~||(~#~~~#~#@*)

더 읽기 쉬운 :

##~~~~~#@|########@|~#~~~~~#@*(~#~~~~#~@*########@^)~#~~~~##@*##~~~~~#@|########@|(~#~~~#~~@*
):~||(~#~~~#~#@*)

확실히 재미있었습니다. 입력으로 두 문자 ( 또는 )를 사용하여 여기서 사용해보십시오 .01

0, 1 (문자)을 비트로 변환하기 위해 ETHProduction의 방법을 사용하면 더 간단 해집니다.

##~~~~~#@|########@|

이것이 상기 방법입니다. 193 ( ##~~~~~#@)을 누르고 |최상위 입력 값 (이 경우 첫 번째 문자 코드, 48 또는 49)으로 NAND ( )를 누릅니다 . 이것은 1에 대해 254를, 0에 대해 255를 ########@생성합니다. 255 ( )로 NAND 하면 입력에 따라 0 또는 1 비트를 생성합니다.

~#~~~~~#@*

A모든 입력이로 시작하기 때문에을 인쇄합니다 A. 인쇄시 *가 튀어 나오 A므로 스택이 이전 상태와 달라지지 않습니다.

(~#~~~~#~@*########@^)

사례 1 : 첫 번째 비트는 1이고 (내부 코드를 활성화합니다. ~#~~~~#~@*인쇄 B하고 ########@^255를 누르고 코드에서 해당 위치로 이동합니다. 이것은 프로그램의 끝이므로 종료됩니다.

사례 2 : 첫 번째 비트는 0입니다. (건너 뛰고 )코드는 계속됩니다.

~#~~~~##@*

C다음 문자이므로를 인쇄합니다 .

##~~~~~#@|########@|

두 번째 입력을 비트로 변환합니다.

(~#~~~#~~@*)

두 번째 비트가 1이면을 인쇄합니다 E.

:~||

이것은 비트의 부울 부정에 대한 NAND 표현입니다 A NAND (0 NAND A) = NOT A.

(~#~~~#~#@*)

비트가 a이면 활성화 0되어 인쇄합니다 E.


5

Pyth, 16 바이트

+\A?Q\B+\C?E\D\E

테스트 스위트

Ternaries!

설명:

+\A              Start with an A
?Q\B             If the first variable is true, add a B and break.
+\C              Otherwise, add a C and
?E\D             If the second variable is true, add a D and break.
\E               Otherwise, add a E and finish.

두 개의 연속 라인에 입력합니다.


3
pythmaster,이 프로그램의 방법을 알려주세요. ;)
코너 오브라이언

5

CJam, 15 16 17 바이트

'Ali'B'C'Eli-+?

온라인으로 사용해보십시오!

@randomra 덕분에 1 바이트, @Dennis 덕분에 1 바이트

설명:

'A                  e# push "A"
  li                e# read first input as an integer
    'B              e# push "B" 
      'C            e# push "C"
        'E          e# push "E"
          li-       e# leave "E" or change to "D" according to second input
             +      e# concatenate "C" with "E" or "D"
              ?     e# select "B" or "C..." according to first input

이전 버전 (16 바이트) :

'Ali'B{'C'Eli-}?

설명:

'A                  e# push character "A"
               ?    e# if-then-else
  li                e# read first input as an integer. Condition for if
    'B              e# push character "B" if first input is true
      {       }     e# execute this if first input is false
       'C           e# push character "C"
         'E         e# push character "E"
           li       e# read second input as an integer
             -      e# subtract: transform "E" to "D" if second input is true
                    e# implicitly display stack contents

5
우리의 좋은 친구 알리와 엘리!
코너 오브라이언

5

Pyth, 13 자, 19 바이트

.HC@"૎્««"iQ2

[a, b] 형식으로 입력을받습니다.

설명

               - autoassign Q = eval(input())
           iQ2 -    from_base(Q, 2) - convert to an int
   @"૎્««"    -   "૎્««"[^]
  C            -  ord(^)
.H             - hex(^)

여기 사용해보십시오

또는 테스트 스위트를 사용하십시오


2
적어도 UTF-8에서는 무게가 19 바이트입니다.
Dennis

1
bytesizematters하지 않는 (및 계산 바이트 완전히 제작 방법, 사용 불가능 ) 실제 부호화에 대응한다. 그것은 사각형 물건을 각각 2 바이트 (UTF-8에서는 3 바이트)와 «1 바이트 (각 UTF-8에서는 2 바이트)로 계산합니다. 모두 wc 는 19 바이트의 동의합니다.
Dennis

4

C, 76 바이트

이름 c1c, c2으로 Cresult로 변경 했습니다 r. C 프로그래머는 피하기 위해 극단적으로 간다 goto. C에서 터무니없는 구문이있는 문제가있는 경우을 사용하지 않았기 때문일 가능성이 큽니다 goto.

char r[4]="A";if(c){r[1]=66;goto e;}r[1]=67;if(C){r[2]=68;goto e;}r[2]=69;e:

언 골프

char r[4] = "A";
if(c1){
    r[1] = 'B';
    goto end;
}
r[1] = 'C';
if(c2){
    r[2] = 'D';
    goto end;
}
r[2] = 'E';
end:

당신은 시작할 수 있습니까 char r[4]="A";? 내 C는 녹슬었다.
LarsH

String 리터럴을 선언하는 정말 우스운 방법이 아닙니까?
Tamoghna Chowdhury

@TamoghnaChowdhury 종류의. 문자열 리터럴은 쓸 수 없습니다. 그런 다음 문자열 리터럴 "A" 로 초기화 되는 배열입니다 . "A"는 처음 2 바이트 만 설정하므로 나머지는 정적 지속 기간의 객체 규칙 (이 경우 0)에 따라 초기화됩니다. [C99 6.7.8 / 22]
Ray

1
당신은에 초기화 목록을 변경하여 22 바이트를 저장할 수 있습니다 "AC"및 모든 것을 교체 r[1]=67r[2]=69;r[2]=c2?68:69;
레이

4

C, 41 바이트

질문에 프로그램, 함수 또는 코드 스 니펫이 필요한지 확실하지 않습니다.
기능은 다음과 같습니다.

f(a,b){a=a?16961:4473665|b<<16;puts(&a);}

0 또는 1이어야하는 두 개의 매개 변수로 입력을 가져 와서 ( b필수 , 필수) stdout으로 인쇄합니다.

설정 a중 하나 0x4241, 0x454341또는 0x444341. 리틀 엔디안 ASCII 시스템에서 문자열로 인쇄하면 필요한 출력이 제공됩니다.


4

R , 41 39 37 바이트

pryr::f(c("ACD","ACE","AB")[1+a+a^b])

온라인으로 사용해보십시오!

R에서, TRUE그리고 FALSE강제 변환된다 1그리고 0각각 당신은 숫자로 사용하려고 할 때. 우리는 인덱스에이 숫자를 변환 할 수 있습니다 1, 2그리고 3공식을 통해 1+a+a^b.

  a  |   b  | 1+a+a^b
TRUE | TRUE | 1+1+1^1 = 3
TRUE | FALSE| 1+1+1^0 = 3
FALSE| TRUE | 1+0+0^1 = 1
FALSE| FALSE| 1+0+0^0 = 2

이 값은 다음 색인 목록에 사용되는 ACD, ACE,AB 올바른 출력을 얻었다.

JayCe 덕분에 2 바이트를 절약했습니다.

대신 if문장이 있는 버전을 선호하는 경우 41 바이트에 대해 다음이 있습니다.

pryr::f(`if`(a,"AB",`if`(b,"ACD","ACE")))

온라인으로 사용해보십시오!



@ JayCe 감사합니다, 답변을 업데이트했습니다!
rturnbull



3

자바 스크립트, 38 바이트

구분 기호를 사용하지 0않거나 / 1대신falsetrue

_=>"ACE ACD AB AB".split` `[+('0b'+_)]

1
split` ` 대신 사용할 수 있습니다split(" ")
andlrc

+('0b'+prompt())parseInt(prompt(),2)
andlrc


3

ArnoldC , 423 바이트

IT'S SHOWTIME
HEY CHRISTMAS TREE a
YOU SET US UP 0
HEY CHRISTMAS TREE b
YOU SET US UP 0
BECAUSE I'M GOING TO SAY PLEASE a
BECAUSE I'M GOING TO SAY PLEASE b
TALK TO THE HAND "ABD"
BULLSHIT
TALK TO THE HAND "ABE"
YOU HAVE NO RESPECT FOR LOGIC
BULLSHIT
BECAUSE I'M GOING TO SAY PLEASE b
TALK TO THE HAND "ACD"
BULLSHIT
TALK TO THE HAND "ACE"
YOU HAVE NO RESPECT FOR LOGIC
YOU HAVE NO RESPECT FOR LOGIC
YOU HAVE BEEN TERMINATED

ArnoldC에는 공식적인 입력이없는 것처럼 보이기 때문에 처음 두 YOU SET US UP값을 0 또는 1로 변경하면 됩니다.

설명

이것은 가능한 모든 출력을 설명하는 조건 문의 전부입니다. 왜 물어봐도 될까요? ArnoldC는 실제로 문자열 이해력이 없습니다. 심지어 문자열을 연결할 수 없습니다! 결과적으로 더 비효율적 인 방법에 의지해야합니다.


"ABD"/ "ABE"가 아니라 a가 true이면 출력은 "AB"여야합니다. 코드가 짧아 질 것입니다!
Toby Speight

3

자바, 28 바이트

많은 답변과 동일한 상용구. 유형은 BiFunction<Boolean,Boolean, String>입니다.

(c,d)->c?"AB":d?"ACD":"ACE"

거의 2 년 (c,d)->이 걸렸지 만를 c->d->사용할 때 1 바이트 씩 골프를 칠 수 있다는 것을 알고 있습니다 java.util.function.Function<Boolean, java.util.function.Function<Boolean, String>>.
Kevin Cruijssen

2

Pyth, 21 바이트

@c"ACE ACD AB AB"diz2

여기 사용해보십시오!

C1이 먼저 오는 동안 입력은 true / false 대신 0 또는 1로 간주됩니다.

설명

가능한 결과가 4 개라는 사실 만 사용하십시오. 입력을 이진으로 해석하여 10 진수로 변환 한 다음이를 사용하여 조회 문자열에서 올바른 결과를 선택합니다.

@c "ACE ACD AB AB"diz2 # z = 입력

                  iz2 # 이진 입력을 밑 10으로 변환
 c "ACE ACD AB AB"d # 공백에서 분할 문자열
@ # 인덱스에서 요소를 얻는다

2

Y , 20 바이트

첫 번째 입력이 하나 인 경우 하나의 입력 만받습니다. 이 동작이 허용된다고 가정합니다. 여기 사용해보십시오!

'B'AjhMr$'C'E@j-#rCp

언 골프 드 :

'B'A jh M
   r$ 'C 'E@ j - # r
 C p

설명 :

'B'A

이 문자를 밀어 BA스택에.

jh M

이것은 하나의 입력을 받고, 증가시키고, 터 뜨리고 그 수의 섹션 위로 이동합니다.

사례 1 : j1 = 0. 이것은 더 흥미로운 것입니다. r$스택을 반전하고 값을 팝, 'C'E문자를 밀어 C하고 E. 숫자 @로 변환 E하고 두 번째 입력을 빼고 문자로 다시 변환합니다. r스택을 되돌립니다. 그런 다음 프로그램은 C 링크를보고 다음 링크로 이동 p하여 스택을 인쇄합니다.

사례 2 : 프로그램이 마지막 링크로 이동 p하여 전체 스택을 인쇄합니다.


2

PowerShell, 40 바이트

param($x,$y)(("ACE","ACD")[$y],"AB")[$x]

입력으로 인덱스 된 중첩 배열. PowerShell에서 $true/ 1$false/ 0는 실질적으로 동일하므로 (유형이 느슨하기 때문에) 두 요소 배열로 멋지게 인덱스합니다. 이것은 PowerShell이 ​​얻는 것만 큼 삼항에 가깝고 골프에서 많은 시간을 사용했습니다.

PS C:\Tools\Scripts\golfing> .\do-while-false.ps1 1 1
AB

PS C:\Tools\Scripts\golfing> .\do-while-false.ps1 1 0
AB

PS C:\Tools\Scripts\golfing> .\do-while-false.ps1 0 1
ACD

PS C:\Tools\Scripts\golfing> .\do-while-false.ps1 0 0
ACE


2

Vitsy , 26 바이트

줄 바꾸기를 구분하여 STDIN을 통해 입력을 1 또는 0으로 예상합니다.

W([1m;]'DCA'W(Zr1+rZ
'BA'Z

나는 실제로이 도전 중에 if 문에 심각한 문제가 있음을 발견했다. D : 깨진 버전으로 게시되었지만 제대로 작동합니다. (문제를 해결 한 후에 업데이트하겠습니다.) Vitsy를 if / ifnot 수정으로 업데이트했습니다. 이 변경으로 인해 어떤 이점도 얻지 못하고 설명 만 할 수 있습니다.

설명:

W([1m;]'DCA'W(Zr1+rZ
W                      Get one line from STDIN (evaluate it, if possible)
 ([1m;]                If not zero, go to the first index of lines of code (next line)
                       and then end execution.
       'DCA'           Push character literals "ACD" to the stack.
            W          Get another (the second) line from STDIN.
             (         If not zero, 
do the next instruction.
              Z        Output all of the stack.
               r1+r    Reverse the stack, add one (will error out on input 0, 1), reverse.
                   Z   Output everything in the stack.

'BA'Z
'BA'                   Push character literals "AB" to the stack.
    Z                  Output everything in the stack.

온라인으로 사용해보십시오!


2

밀랍 , 26 바이트

0으로 거짓으로 해석 1합니다.

E`<
D`d"`C`~<
_T~T~`A`"b`B

산출:

julia> beeswax("codegolfdowhile.bswx",0,0.0,Int(20000))
i1
i1
AB
Program finished!

julia> beeswax("codegolfdowhile.bswx",0,0.0,Int(20000))
i1
i0
AB
Program finished!

julia> beeswax("codegolfdowhile.bswx",0,0.0,Int(20000))
i0
i1
ACD
Program finished!

julia> beeswax("codegolfdowhile.bswx",0,0.0,Int(20000))
i0
i0
ACE
Program finished!

내 Github 저장소 에서 밀랍 통역사를 복제하십시오 .


나는 당신이 따옴표가 필요하지 않다고 확신합니다.
undergroundmonorail

@undergroundmonorail : 좋아, 솔루션을 업데이트 할 것입니다. 감사.
ML

2

C, 47 45 바이트

결과는 3 가지뿐이므로 다음과 같이 3 가지 문자열 중 하나를 선택할 수 있습니다.

char*f(c,d){return"AB\0 ACE\0ACD"+(!c<<d+2);}

Herman L 에게 2 바이트 감사

데모

#include<stdio.h>
int main()
{
    printf("%s\n%s\n%s\n%s\n",
           f(1,1),
           f(1,0),
           f(0,1),
           f(0,0));
}

1
-2 바이트 :char*f(c,d){return"AB\0 ACE\0ACD"+(!c<<d+2);}
Herman L

TIO pls에 링크
ASCII 전용

1

펄, 23 바이트

say<>>0?AB:<>>0?ACD:ACE

필요 -E| -M5.010플래그를 지정하고 1과 0으로 입력합니다.

$ perl -E'say<>>0?AB:<>>0?ACD:ACE' <<< $'0\n0'
ACE
$ perl -E'say<>>0?AB:<>>0?ACD:ACE' <<< $'0\n1'
ACD
$ perl -E'say<>>0?AB:<>>0?ACD:ACE' <<< $'1\n0'
AB

-p22 + 1 = 23 바이트가 필요 하고 대체 솔루션 :

$_=/^1/?AB:/1/?ACD:ACE
perl -pe'$_=/^1/?AB:/1/?ACD:ACE' <<< '0 1'

say-<>?AB:-<>?ACD:ACE2 바이트 더 짧습니다.
nwellnhof

1

05AB1E , 23 20 바이트

암호:

Ii"AB"?q}"AC"?69I-ç?

온라인으로 사용해보십시오!


1
이것은 아마도 05AB1E의 고대 버전이지만 지금 14 바이트 일 수 있습니다. i„ABë„AC69I-çJ 온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .
Kevin Cruijssen

1
@KevinCruijssen 니스! 이것은 실제로 05AB1E의 고대 버전입니다. 언어는 여기에서 약 3 개월이되었습니다 (암시적인 입력조차 없었습니다).
Adnan

1
그래, 나는 이미 선두에 대해 이미 혼란 스러웠다 I. ; p
Kevin Cruijssen

1

apt, 19 바이트

"A{U?'B:'C+(V?'D:'E

온라인으로 테스트하십시오!

재미있는 사실 : 버그가 아닌 경우 16 바이트입니다.

"A{U?"B:C{V?"D:E

버그는 최악이다 : |
코너 O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Lemme이 버그가없는 이전 버전을 파낼 수 있는지 확인하십시오. 그런 다음 16 바이트가 합법적입니다.
ETHproductions

1
버그가 뭐야?
CalculatorFeline

@CalculatorFeline 그런 중첩 문자열은 어떤 이유로 변환되지 않는다고 생각합니다.
ETHproductions
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.