그래 근데 그래 그래 그래


46

동료가 최근에 다음과 같은 JavaScript를 농담으로 보냈습니다.

let butScript = (nrOfButs) => {
    for(var i = 0; i < nrOfButs; i++){
        if(i % 3 == 0){
            console.log("Yeah")
        }
        if(i % 2 == 0){
            console.log("But")
        }
        if(i % 3 == 1){
            console.log("No")
        }
    }
}

근무 시간 동안 코드가 작성되었으므로 회사 리소스가 많이 낭비되었습니다. 앞으로 비슷한 상황이 발생하지 않도록하려면 근무 시간 낭비를 최소화해야합니다. 더 짧은 프로그램을 작성하는 것이 빠르다는 것은 일반적인 지식이므로 가능한 한 짧게이 코드를 골프화해야합니다!

입력

음이 아닌 단일 정수 잘못된 입력을 처리해서는 안됩니다.

산출

프로그램은 위 스크립트와 동일한 출력을 생성해야합니다. 한 줄에 한 단어를 출력해야하며 단어 수는 원본 스크립트와 일치해야합니다.

줄 바꿈이 아닌 공백 문자는 각 행의 끝에 표시되지만 처음에는 표시되지 않으므로 공백 문자를 포함 할 수 없습니다. 출력의 맨 끝에 하나의 추가 줄 바꾸기 문자가 허용됩니다.

Input: 0
Output:


Input: 1
Output:
Yeah
But

Input: 2
Output:
Yeah
But
No

Input: 10
Output:
Yeah
But
No
But
Yeah
But
No
Yeah
But
No
But
Yeah

3
줄 목록을 반환 할 수 있습니까?
조 왕

10
그런 재미있는 녀석과 함께 일하려면 재미 있어야합니다! : s 약간 더 심각한 참고 사항 : nrOfButs변수의 이름이 잘못되어 오도됩니다. 어쨌든 좋은 간단한 도전.
Arnauld

10
마지막 줄이 "하나님 께서 당신이 방금 그렇게 말씀 하셨다는 것을 믿을 수 없습니다!"
Ciaran_McCarthy

3
@EriktheOutgolfer ifs 쓰루를 통과 하고 조건이 만족되면 전류 루프를 계속합니다.
dzaima

4
아직 가장 호주 코드 골프? "nah"가 아닌 것을 제외하고
Nacht-Reinstate Monica

답변:


48

Excel, 78 바이트

셀 A1에 입력이 있고 셀에 대해 줄 바꿈 서식이 설정되어 있다고 가정합니다. 문자열 내에 줄 바꿈을 추가하고 공백을 확인하려면 Alt + Enter를 사용하십시오. REPT 기능의 한계로 인해 최대 3570 개의 입력 만 처리합니다 (셀을 키가 큰 행운을 빕니다).

=LEFT(REPT("Yeah
But
No      
But     
Yeah    
But
No           
",595),A1*9)

공백이있는 재 인쇄

=LEFT(REPT("Yeah
But
No......
But.....
Yeah....
But
No...........
",595),A1*9)

작동 방식 : 패턴은 6 개의 숫자마다 반복됩니다.

0 = Yeah and But      Yeah + linefeed + But + linefeed
1 = No                No + 6 whitespace + line feed
2 = But               But + 5 whitespace + linefeed
3 = Yeah              Yeah + 4 whitespace + linefeed
4 = But and No        But + linefeed + No + 3 whitespace
5 = Blank             8 whitespace + linefeed

이들 각각은 9 문자로 표현 될 수 있으므로 문자열은 54 문자 (9 * 6)로 구성된 다음 Excel에서 허용하는만큼 반복됩니다. 그런 다음 왼쪽 9 * (입력 수) 문자를 출력으로 사용합니다.

"그러나 안함"에 대한 줄 바꿈은 공백 뒤에 위치하므로 # 6, # 12 등의 예는 오른쪽이 아닌 왼쪽으로 서식이 지정되며 6 번째 줄마다 빈 줄 바꿈이 추가되지 않습니다. 해당 항목에 대해.

산출


1
나는 이것을 확인할 방법이 없지만, 당신의 설명은 그것을 올바르게 보이게합니다. 예제 입력 / 출력 쌍을 추가 할 수 있습니까? 더 우스운 언어 중 하나이지만 그럼에도 불구하고 큰 대답입니다.
maxb

16
@maxb 다른 언어를 때릴 때 그렇게 우스운 일이 아닙니다.
Keeta

1
훌륭한 설명과 매우 멋진 기술. LibreOffice Calc에서도 작동하지만 서식을 사용해야 할 수도 있습니다. +1
ElPedro

20

자바 스크립트 (ES6), 59 57 바이트

f=n=>n?f(n-1)+[s=n&1?`But
`:'',`Yeah
`+s,s+`No
`][n%3]:''

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

어떻게?

우리는 에서 아닌 에서 로 돌아가는 재귀 함수를 사용합니다 .1 0 N - 1n10n1

결과적으로 테스트는 참조 코드와 비교하여 씩 해제됩니다 .1

  • 만약 , 출력 "그래"n1(mod3)
  • 만약 , 출력 "하지만"n1(mod2)
  • 만약 , 출력 "아니오"n2(mod3)

이를 통해 간단한 배열 을 조회 배열의 첫 번째 항목으로 저장할 수 있습니다. 여기서 : 빈 문자열 또는 변수를 보유하는 변수를 정의 할 수 있습니다 .에요n0(mod3)s"But\n"

다른 두 항목은 각각 "Yeah\n" + s및 로 정의됩니다 s + "No\n".

참고 : 에서 을 반복 하면 첫 번째 항목에도 를 정의 할 수 있지만 두 개의 추가 괄호가 필요 합니다.0 n10s

댓글

f = n =>            // n = input
  n ?               // if n is not equal to 0:
    f(n - 1) +      //   prepend the result of a recursive call with n - 1
    [               //   define our lookup array:
      s = n & 1 ?   //     1st entry: if n is odd:
        `But\n`     //       set s to "But"
      :             //     else:
        '',         //       set s to an empty string
      `Yeah\n` + s, //     2nd entry: "Yeah" followed by s
      s + `No\n`    //     3rd entry: s followed by "No"
    ][n % 3]        //   append the correct entry for this iteration
  :                 // else:
    ''              //   return an empty string and stop recursion

16

LOLCODE , 257 바이트

HAI 1.2
I HAS A B
GIMMEH B
B IS NOW A NUMBR
I HAS A C ITZ 0
IM IN YR L UPPIN YR C TIL BOTH SAEM B AN C
I HAS A D ITZ MOD OF C AN 3
D
WTF?
OMG 0
VISIBLE "Yeah"
OIC
MOD OF C AN 2
WTF?
OMG 0
VISIBLE "But"
OIC
D
WTF?
OMG 1
VISIBLE "No"
OIC
IM OUTTA YR L
KTHXBYE

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


2
그것은 (! 나는이 코드를 싫어),하지만 테스트 케이스 (10) 제 2 회 "아니오"와 3에서 "그러나"얻을 멋진 모습 ... 그래서 그래, 이성을 상실하지만 : D
seadoggie01하지

2
으악, 내가 거기서 최적화 할 수 있다고 생각했습니다. 이것은 까다로운 패턴입니다. 나는 지금 고쳤다.
JosiahRyanW

1
나는 그것이 읽는 방식을 좋아한다
LocustHorde

4
않습니다 VISIBLE "But"바지의 프로그램의 부족을 참조하십시오?
JDL

12

공백 , 315 304 300 277 276 바이트

-11 바이트 (8에서 7로 사용되는 레이블의 양을 줄임)와 -24 바이트 (프로그램의 일반적인 흐름을 변경하고 사용되는 레이블의 양을 7에서 5로 줄임)에 대한 @JoKing 덕분 입니다.

[S S S N
_Push_0][T  N
T   T   _Read_STDIN_as_integer][N
S S N
_Create_Label_LOOP][S S S N
_Push_0][T  T   T   _Retrieve][N
T   S S N
_If_negative_jump_to_Label_PRINT][S S S N
_Push_0][T  T   T   _Retrieve][S S S T  T   N
_Push_3][T  S T T   _Modulo][S S S T    S N
_Push_2][T  S S T   _Subtract][N
T   T   T   N
_If_negative_jump_to_Label_SKIP_NO][S S T   T   S T T   T   T   S N
_Push_-94_\n][S S S T   T   T   N
_Push_7_o][S S T    T   T   S T S N
_Push_-26_N][N
S S T   N
_Create_Label_SKIP_NO][S S S N
_Push_0][T  T   T   _Retrieve][S S S T  S N
_Push_2][T  S T T   _Modulo][N
T   S S S N
_If_0_jump_to_Label_SKIP_BUT][S S T T   S T T   T   T   S N
_Push_-94_\n][S S S T   T   S S N
_Push_12_t][S S S T T   S T N
_Push_13_u][S S T   T   S S T   T   S N
_Push_-38_B][N
S S S S N
_Create_Label_RETURN_FROM_BUT][S S S N
_Push_0][S N
S _Duplicate_0][S N
S _Duplicate_0][T   T   T   _Retrieve][S S S T  N
_Push_1][T  S S T   _Subtract][T    T   S _Store][T T   T   _Retrieve][S S S T  T   N
_Push_3][T  S T T   _Modulo][N
T   S S T   N
_If_0_jump_to_Label_YEAH][N
S N
N
_Jump_to_Label_LOOP][N
S S S T N
_Create_Label_YEAH][S S T   T   S T T   T   T   S N
_Push_-94_\n][S S S N
_Push_0_h][S S T    T   T   T   N
_Push_-7_a][S S T   T   T   N
_Push_-3_e][S S T   T   T   T   T   N
_Push_-15_Y][N
S N
N
_Jump_to_Label_LOOP][N
S S S N
_Create_Label_PRINT][S S S T    T   S T S S S N
_Push_104][T    S S S _Add][T   N
S S _Print_as_character][N
S N
N
_Jump_to_Label_LOOP]

문자 S(공백), T(탭) 및 N(줄 바꾸기)가 강조 표시로만 추가되었습니다.
[..._some_action]설명으로 만 추가되었습니다.

온라인으로 시도하십시오 (원시 공백, 탭 및 줄 바꾸기 만).

공백은 확실히이 문제에 대한 올바른 언어가 아닙니다 ..에 공백 루프와 두 명령문은 경우 라벨로 만든 라벨로 이동, 그들이 때문에-경우 경우 경우-ELSEIF-다른 경우지만 여러되지 않습니다 그것이 내가 의미 모든 경우에 뒤로 건너 뛰어야 합니다. 매우 길어 지면 일부 인쇄를 건너 뛰기 위해 검사를 약간 수정해야합니다 ( @JoKing 감사 합니다 ).

의사 코드의 설명 :

Read STDIN as integer, and store it in the heap
Start LOOP:
  Integer i = retrieve integer from heap
  If(i is negative):
    Call function PRINT
  If(i modulo-3 is NOT 2):
    Jump to Label SKIP_NO
  Push "\noN" to the stack
  Label: SKIP_NO
  If(i modulo-2 is 0):
    Jump to Label SKIP_BUT
  Push "\ntuB" to the stack
  Label: SKIP_BUT
  i = i - 1
  Replace i in the heap with this updated value
  If(i modulo-3 is 0):
    Call function YEAH
  Go to next iteration of LOOP

function YEAH:
  Push "\nhaeY" to the stack
  Go to next iteration of LOOP

function PRINT:
  Print top of the stack as character to STDOUT
  Go to next iteration of LOOP (which will enter the if and then
                                comes back to this PRINT again)

추가 설명 :

일반적으로 입력에서 0으로 반복하여 줄 바꿈을 누르고 단어를 뒤집습니다 (따라서 "Yeah \ n", "But \ n 대신"\ noN ","\ ntuB ","\ nhaeY "순서로) ","아니요 \ n "). 그리고 입력이 0으로 반복되고 모든 문자가 스택에 있으면 해당 문자를 역순으로 인쇄하므로 올바른 출력 순서가 표시됩니다.

그러나 더 깊이 : 범위 내의 단어를 인쇄해야하지만 범위 내 (input, 0]에서 반복 [input, 0)됩니다. 이 때문에 if(i%3 == 2)"\ noN" 검사 를 사용 하거나 실제로 if(i%3 != 2)"\ noN"푸시를 건너 뛰고 "\ ntuB"검사 if(i%2 != 1)를 사용 하거나 실제로 if(i%2 == 0)"\ ntuB"푸시를 건너 뜁니다 ). 이 두 번의 확인 후에 만 ​​반복 i을 1 씩 줄입니다. 그런 다음 if(i%3 == 0)챌린지 설명의 JS 예제 코드에서와 같이 "\ nhaeY"를 눌러 확인 합니다. 레이블로 이동하는 대신 if-not 검사로 건너 뛰고 23 바이트가 저장된 if-checks로 레이블에서 돌아갑니다.

또한 공백에서 문자 값은 스택에 유니 코드 값으로 저장됩니다 (예 : 10줄 바꾸기, 65'A', 97'a'등). 문자를 인쇄하기 위해 이미 스택을 반복해야하므로 문자로 인쇄 하기 전에 공백 값을 사용하여 숫자 값에 상수를 추가하여 바이트 수를 낮추는 것도 가능합니다 .
이 상수는 104이 경우이며, 이 Java 프로그램으로 생성되어 이전에 또 다른 공백 응답 을 골프로 사용했습니다 . 이것이 코드의이 부분이되는 이유이기도합니다.

[S S T  T   S T T   T   T   S N
_Push_-94_\n][S S S T   T   T   N
_Push_7_o][S S T    T   T   S T S N
_Push_-26_N]

값을 갖는 -94상기 개행을 7'O'등에 대한 -26'N'에 대한. 의 지속적인 추가하기 때문에 104뜻을 올바르게 우리의 유니 코드 값을주고 10, 11178각각이 문자를.


1
나는 분명히 공백 답변을 기대하지 않았습니다. 잘 했어!
maxb

@maxb 감사합니다! 불행히도 필요한 8 개의 레이블로 인해 예상보다 상당히 길었습니다. 그러나 이미 작동하고있어 기쁩니다. :)
Kevin Cruijssen

조건이 거짓 인 경우 다음 if 문으로 건너 뛰어 레이블을 반으로 줄이겠습니까? 예if i modulo-3 != 1 jump to next if else push NO
Jo King

1
@ 조킹 아 잠깐, 나는 당신의 의사 코드의 일부를 오해했습니다. i전에 검색하지 않는 것에 대한 첫 번째 문제 if(i is 0) call PRINT는 사실이지만 다른 사람은 i빼기 전에 인쇄물을 건너 뛰기 전에 확인 합니다. 실제로 똑똑하다. 그것을 계속 구현할 것입니다.
Kevin Cruijssen

1
글쎄, 루프의 시작으로 점프하면 if 문을 다시 실행하고 인쇄 기능으로 바로 건너 뜁니다. 루프 레이블을 빈 레이블로 변경하면 바이트가 절약 될 수 있습니다.
Jo King


11

펄 6 , 63 50 바이트

{<<"Yeah But"No But Yeah"But No">>[^$_ X%6].words}

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

숫자를 가져와 줄 목록을 반환하는 익명 코드 블록

설명:

{                                                }   # Anonymous code block
 <<"Yeah But"No But Yeah"But No">>  # Create the list of strings:
                                     # Yeah But
                                     # No
                                     # But
                                     # Yeah
                                     # But No
                                  [       ]  # Index into this list
                                   ^$_  # The range from 0 to n-1
                                       X%6  # All modulo 6
                                           .words  # Convert the list to a string 
                                                   # Which joins by spaces
                                                   # And split by whitespace


8

05AB1E (레거시) , 27 25 24 바이트

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

F”¥æ€³€¸”#N3ÖNÈN3%‚‚˜Ï`»

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

설명

F                          # for N in [0 ... input] do:
 ”¥æ€³€¸”#                 # push ['Yeah', 'But', 'No']
          N3Ö              # push N % 3 == 0
             NÈ            # push N % 2 == 0
               N3%         # push N % 3
                  ‚‚˜      # add the 3 numbers to a list
                     Ï     # keep only the strings whose corresponding value  
                           # in the int list is true (1)
                      `»   # push strings separately to stack and join stack on newlines

Dang, 당신이 날 이겼어 .. 답변을 게시하려고했다. 어쨌든 당신은 더 짧아서, +1 ..의 좋은 사용은 ×그것에 대해 생각하지 못했습니다!
Kevin Cruijssen

와, 이것에 대한 설명을 듣고 싶습니다. 내 개인 최고는 CJam에서 44 바이트였습니다.
maxb

@ maxb : 물론 설명을 추가하겠습니다. 난 그냥 골프를 좀 더 먼저 아래로 골프 수 있는지 확인하고 있어요;)
Emigna

Θ더 이상 사용하지 않는 것을 제거 할 수 있습니다 ×. 왜냐하면 Ï오직 1s 만 보이 므로 2(그리고 0물론) 무시합니다 .
Kevin Cruijssen

@ KevinCruijssen : 감사합니다! 확실하지 내가 놓친 어떻게 : P
Emigna


6

파이썬 2 , 97 95 92 90 83 81 바이트

lambda n:[w for i in range(n)for w in'Yeah','But','No'if('N'in w)==i%(3-(w<'N'))]

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

ovs 덕분에 -2 바이트


파이썬 3 , 92 90 85 83 바이트

lambda n:[w for i in range(n)for w in['Yeah','But','No']if('N'in w)==i%(3-(w<'N'))]

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

ovs 덕분에 -4 바이트

Jo King 덕분에 -4 바이트


이 두 가지를 결합하여 줄 목록으로 반환함으로써 86 바이트
Jo King

@ JoKing 감사합니다, 쓸 때 인쇄 대신 반환 할 수 있다는 것을 몰랐습니다.
TFeld

82 바이트 : len(w)<3-> 'N'in w, 81 바이트 : len(w)%2->(w<'N')
ovs


6

그루비 (기능), 79 바이트

처음에 답변을 제출 한 후 적절한 답변을 구성하는 내용에 대한 역사적인 토론을 살펴 보았습니다. Java에서 메소드를 리턴하는 것 (반환 유형 및 매개 변수 선언 포함)이 일반적으로 허용되는 것처럼 보이므로 여기에 메소드 리턴 값이 응답 인 더 짧은 Groovy 메소드가 있습니다. 사용은 def반환 유형이 유추되었음을 의미합니다.

def a(int n){n?a(--n)+(n%3?'':'Yeah\n')+(n%2?'':'But\n')+(n%3==1?'No\n':''):''}

0에서 n-1까지 반복되는 아래의 원래 답변과 달리이 답변은 n에서 1까지 자체 호출하지만 재귀 호출의 나머지 줄에 대한 입력을 줄입니다.

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

그루비 (프로그램), 87 바이트

Groovy 스크립트는 특정 공통 임포트를 필요로하지 않기 때문에 System.out.이전 에 선언하지 않고도 Java의 STDOUT에 대한 답변을 인쇄하는 프로그램이 될 수 있습니다 print. 또한 toLong()입력 인수를 합리적으로 간결하게 구문 분석 할 수있는 일반적인 유틸리티 메소드를 제공합니다 .

본질적으로 Java 10 답변이지만 Groovy의 짧은 루프 구문과 진실한 진술을 평가하는 기능을 활용합니다.

args[0].toLong().times{print((it%3?'':'Yeah\n')+(it%2?'':'But\n')+(it%3==1?'No\n':''))}

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


PPCG에 오신 것을 환영합니다! 훌륭한 첫 번째 답변! Groovy를 직접 코딩하지는 않았지만 TIO에서 코드를 실행하는 것이 좋습니다 . 그렇게하면 다른 사람이 검증 할 수 있고 모든 사람이 즐길 수 있습니다.
maxb

1
@maxb 감사합니다! 나는 하나를 추가했습니다 :)
archangel.mjj

좋은 첫 번째 대답이며 PPCG에 오신 것을 환영합니다.
ElPedro

5

레티 나 0.8.2 , 45 바이트

.+
$*
1
$`Yeah¶$`But¶$`11No¶
+`11B
B
111

A`1

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

.+
$*

입력을 단항으로 변환하십시오.

1
$`Yeah¶$`But¶$`11No¶

각 정수를 들어 0...n-1, 세 줄의 텍스트, 각 단어 하나, 각각의 생성 i 1을 제외하고 그 이전의, No두 개의 여분이있는, 1우리가 계산되도록들 (i+2)%3==0에 해당하는가 i%3==1.

+`11B
B

1s 전에 Bs 쌍을 제거하십시오 .

111

1다른 곳에서는 세 그룹으로 된 s를 제거하십시오 .

A`1

가 여전히있는 모든 행을 삭제하십시오 1.


아, 이제 11No¶계산 하는 것을 보았습니다 (i+2)%3==0(그래서 세 가지 모두 if-checks입니다 ==0) 너무 명백해 보이지만 실제로는 생각하지 않았으므로 실제로 독창적입니다. 나에게서 +1, 좋은 답변!
Kevin Cruijssen

5

자바 10, 100 99 바이트

n->{for(int i=0;i<n;)System.out.print((i%3<1?"Yeah\n":"")+(i%2<1?"But\n":"")+(++i%3>1?"No\n":""));}

@ OlivierGrégoire 덕분에 -1 바이트 .

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

설명:

n->{                   // Method with integer parameter and no return-type
  for(int i=0;i<n;)    //  Loop `i` in the range [0, `n`)
    System.out.print(  //   Print to STDOUT:
      (i%3<1?          //    If `i` is divisible by 3:
        "Yeah\n"       //     Print "Yeah" with newline
      :"")+(i%2<1?     //    If `i` is even:
        "But\n"        //     Print "But" with newline
      :"")+(++i%3>1?   //    If `i` modulo-3 is 1:
        "No\n"         //     Print "No" with newline
      :                //    If none of the above three if's applied to the current `i`:
       ""));}          //     Print nothing for the current `i`

1
++i%3>1가능성이 당신에게 바이트 저장됩니다
올리비에 그레 구 아르

물론 @ OlivierGrégoire 아. 감사!
Kevin Cruijssen

5

Powershell, 75 74 72 67 66 바이트

-1 바이트 덕분에 TessellatingHeckler

param($n)(" Yeah
But No But Yeah But
No "*$n-split' ')[1..$n]-ne''

테스트 스크립트 및 설명 :

$f = {

param($n)(" Yeah
But No But Yeah But
No "*$n-split' ')[1..$n]-ne''

# 1. repeat the string $n times
# 2. split by space
# 3. get elements from 1 to $n
# some elements are multiline strings, some elements are $null:
# ($null,"Yeah`nBut","But","No","But","Yeah","But`nNo",$null,...)
# 4. remove $null elements from result array

}

# Output results
@(
    0,1,2,10
) | % {
    &$f $_
    "======"
}

# Advanced test
@(
    ,(0,'')
    ,(1,'Yeah But')
    ,(2,'Yeah But No')
    ,(3,'Yeah But No But')
    ,(4,'Yeah But No But Yeah')
    ,(5,'Yeah But No But Yeah But No')
    ,(6,'Yeah But No But Yeah But No')
    ,(7,'Yeah But No But Yeah But No Yeah But')
    ,(8,'Yeah But No But Yeah But No Yeah But No')
    ,(9,'Yeah But No But Yeah But No Yeah But No But')
    ,(10,'Yeah But No But Yeah But No Yeah But No But Yeah')
    ,(20,'Yeah But No But Yeah But No Yeah But No But Yeah But No Yeah But No But Yeah But No Yeah But No')
) | % {
    $n,$e = $_
    $r = &$f $n
    $r = $r-split"`n"       # simplify test string
    "$($e-eq$r): $n : $r"
}

산출:

======
Yeah
But
======
Yeah
But
No
======
Yeah
But
No
But
Yeah
But
No
Yeah
But
No
But
Yeah
======
True: 0 :
True: 1 : Yeah But
True: 2 : Yeah But No
True: 3 : Yeah But No But
True: 4 : Yeah But No But Yeah
True: 5 : Yeah But No But Yeah But No
True: 6 : Yeah But No But Yeah But No
True: 7 : Yeah But No But Yeah But No Yeah But
True: 8 : Yeah But No But Yeah But No Yeah But No
True: 9 : Yeah But No But Yeah But No Yeah But No But
True: 10 : Yeah But No But Yeah But No Yeah But No But Yeah
True: 20 : Yeah But No But Yeah But No Yeah But No But Yeah But No Yeah But No But Yeah But No Yeah But No

간단한 스크립트, 72 바이트 :

$args|?{$_}|%{0..--$_|%{@('Yeah')[$_%3]
@('But')[$_%2]
@{1='No'}[$_%3]}}

1
좋은 답변입니다! 온라인 통역사가 포함되어 있지 않으므로 답변에 출력을 추가 할 수 있습니까?
maxb

응답 스크립트 블록이 반환되지 않습니다 ======. Yeah,But,No문자열 만 생성 합니다. 테스트 스크립트는 결과를보다 쉽게 ​​읽을 수 있도록 구분 기호를 표시합니다.
mazzy

해시 테이블 사용법은 영리합니다. 나는 그것을 기억해야 할 것입니다.
AdmBorkBork


1
@mazzy 나는 당신을 재구성 할 수는 있지만 여전히 67을 이길 수는 없습니다 (두 줄을 새로운 줄 바꿈으로 바꾸십시오)(" Yeah\nBut No But Yeah But\nNo "*($j="$args")|% s*t 32)[1..$j]-ne''
TessellatingHeckler

4

하스켈 , 71 바이트

f n=[1..n]>>=(3?1)"Yeah"<>(2?1)"But"<>(3?2)"No"
(a?b)c n=[c|n`mod`a==b]

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

설명

매우 간단 하고 나머지 를 [1..n]대신 사용하여 2 바이트를 저장 [0..n-1]하고 나머지를 조정했습니다. 연산자 (?)테스트는 네 개의 인수를 사용하여 결과가 올바른 경우 빈 목록 또는 제공된 문자열을 단일 값으로 반환합니다.

(?)우리는 네 번째 주장을함으로써 (<>)각 기능의 결과를 연결하는 데 활용할 수 있습니다 .

(3?1)"Yeah" <> (2?1)"But" <> (3?2)"No"  \i-> (3?1)"Yeah" i ++ (2?1)"But" i ++ (3?2)"No" i

4

C # (Visual C # Interactive Compiler) , 105 99 94 96 89 바이트

i=>{for(int x=0;x<i;)Write((x%3<1?"Yeah\n":"")+(x%2<1?"But\n":"")+(x++%3==1?"No\n":""));}

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


4
이와 같이 보간을 제거 하면 7 바이트가 절약됩니다.
Emigna

@Emigna 팁 주셔서 감사합니다, 답변을 변경
auhmaan

1
x++%3==1?일 수 있습니다 ++x%3>1?. 다른 사람이 Java 답변에 팁을 줬지만 C # 답변에도 동일하게 적용됩니다. :)
Kevin Cruijssen

4

, 37 35 33 바이트

"But 
Yeah
No
"<>5@:^[t2io02x]@<a

(뒤의 공백에 유의하십시오 But.) 입력을 명령 행 인수로 사용합니다. 온라인으로 사용해보십시오!

설명

이 설명은 이전 버전에 대한 것입니다. 아래의 changelog를 참조하십시오.

Jo King의 Perl 6 답변에서 영감을 얻었습니다 . 이리스트를 구성합니다 :

[
 "Yeah
 But
 ";
 "No
 ";
 "But
 ";
 "Yeah
 ";
 "But
 No
 ";
 ""
]

a순환 인덱싱을 사용하여 그 첫 번째 요소를 출력 합니다.

[t2io02x]R,3["But""Yeah""No"].n@<:a
                                     i is 0; o is 1; t is 10; x is ""; n is newline;
                                     a is 1st cmdline arg (implicit)
[       ]                            Construct this list of scalars:
 t                                    10
  2                                   2
   i                                  0
    o                                 1
     02                               02
       x                              <empty string>
         R                           Treating each of these as a string, we're going to
                                     replace:
          ,3                          0, 1, and 2 (respectively)
                                     with the corresponding values from this list:
            ["But""Yeah""No"].n       These strings, each with a newline appended
                                     We now have constructed the list shown above
                               @<:a  Take the first a elements from this list, with
                                     cyclical indexing (the : is for parsing reasons)
                                     Concatenate them together and print (implicit)

업데이트 : 0/1/2를 문자열로 변경하기 위해 replace를 사용할 필요가 없다는 것을 깨달았습니다.이 숫자를 사용하여 목록에 직접 색인을 생성 할 수 있습니다. 이렇게하려면 여러 자리 숫자를 해당 자리 목록으로 분할해야합니다. 그렇지 않으면 인덱스 1과 0 대신 인덱스 10을 선택합니다. 다행히 Pip에서 임의로 중첩 된 목록을 인덱스로 사용하면 예상대로 작동하여 결과 목록이 나타납니다. 3을 입력하면 다음과 같은 데이터 진행이 발생합니다 (여기서 _줄 바꿈 표시).

"But _Yeah_No_"<>5                       ["But _"; "Yeah_"; "No_"]
                     [t2io02x]           [10; 2; 0; 1; 02; ""]
                              @<a        [10; 2; 0]
                    ^                    [[1; 0]; [2]; [0]]
                  @:                     [["Yeah_"; "But _"]; ["No_"]; ["But _"]]

이전과 마찬가지로 최종 결과가 함께 연결되고 자동 인쇄됩니다.


4

첨부 , 48 바이트

Flat##{Mask[_%3'2'3=0'0'1,$Yeah'$But'$No]}=>Iota

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

설명

Flat##{Mask[_%3'2'3=0'0'1,$Yeah'$But'$No]}=>Iota   input: an integer
      {                                  }=>Iota   over each number from 0 to that integer exclusive
       Mask[             ,$Yeah'$But'$No]          select values from that array according to:
            _%3'2'3                                    whether or not the input mod 3, 2, 3
                   =0'0'1                              is 0, 0, 1
Flat##                                             flatten the intermediate results

4

C (gcc) , 77 71 74 72 69 바이트

여기에 더 나은 C 답변이 있지만이 답변은 재귀 적이며 곧 게시하는 데 시간이 걸렸습니다.

@ceilingcat 및 @JonathanFrech 덕분에 69 바이트까지 감소

(나는 n-i + 1 대신에 n- ~ -i를 사용한다고 생각하지 않습니다)

i;f(n){i=n&&n-i>=~n/6&&f(n,i++,puts(i%7%4?i%7%2?"But":"No":"Yeah"));}

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


@JonathanFrech 니스지만 0, 또는 5에서 작동하지 않습니다
cleblanc

@cleblanc 아, 죄송합니다. 몰랐습니다 ... 적어도 제거 j하면 두 바이트가 절약되었습니다.
Jonathan Frech

1
70 바이트 -@ceilingcat의 저장된 바이트 하나를 통합합니다.
Jonathan Frech

1
n-~-i에 동등 n-i+1하지 - i<n+1... 그래서 실제로 바이트를 저장하지 않습니다 -
조나단 FRECH

3

루비, 69 72 74 바이트

->y{puts *(1..y).map{|i|[i%3==1&&:Yeah,i%2>0&&:But,i%3>1&&:No]-[!0]}}

지금은 더 짧고 재귀적인 방법을 확인하는 매우 간단한 대답입니다.

@BWO 덕분에 2 바이트를 절약했습니다 :)

문자열 대신 기호를 사용하여 3 바이트를 더 절약했습니다.


3

파이썬 3, 93 바이트

[print("Yeah\n"*(i%3<1)+"But\n"*(i%2<1)+"No\n"*(i%3==1),end="")for i in range(int(input()))]

이것은 최선의 해결책은 아니지만 제 선택입니다.

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


1
이미 목록 이해에 사용할 수있는 표현식이 있지만 목록 이해는 해당 표현식의 부작용을 불러 일으키기 위해 존재하는 경우 일반 for 루프에는 적은 바이트가 필요합니다.
Jonathan Frech

3

R, 65 바이트

cat(c("yeah","but","no")[c(3,1:3,2,1,2)][1:scan()%%7+1],sep="\n")

우리는 약간의 결함이있는 프로그램을 복제 %4 == 1하고 %4 == 3있기 때문에 ( %3조건이 아니라 사용 된 것보다 4 분의 1마다 "하지만" 빠짐), c7 번에 대한 호출을 어색하게해야합니다 . 여전히 LOLCODE보다 짧습니다 ...

((3,1,2,3,2,1,2) 또는 유사한 순열이 lh데이터 세트에 어딘가에 나타날 것으로 기대 했지만 모양이 아닙니다)


3

sed -E ,179 150 바이트

/^0/!s:$:g:
:l;y:abcdefg:bcdefga:
/[ae]/iYeah
/[bdf]/iBut
/[cg]/iNo
s:.$:-&:;:s;s:0-:-9:;ts;h
y:123456789:012345678:;G
s:.*(.)-.*\n(.*).-:\2\1:;tl;c\ 

가장 어려운 부분은 목록을 구성하는 것이 아니라 실제로 십진수를 구문 분석하는 것이 었습니다.

마지막 줄 바꿈이 필요하지 않은 경우 2 바이트를 저장할 수 있습니다. c\ d.

여전히 최적화가 필요합니다.

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

설명

/^0/!                            | if the input number doesn`t begin with a '0'…
     s:$:g:                      | …then append a 'g' to it and proceed
                                 |
:l;                              | loop label 'l':
   y:abcdefg:bcdefga:            | shift all occurences of [abcdef] 1 letter forward, and all 'g'-s to 'a'-s
                                 |
/[ae]/                           | if there`s an 'a' or 'e' in the input…
      iYeah                      | …output 'Yeah'
                                 |
/[bdf]/                          | if there`s a 'b' or 'd' or 'f' in the input…
       iBut                      | …output 'But'
                                 |
/[cg]/                           | if there`s a 'c' or 'g' in the input…
      iNo                        | …output 'No' 
                                 |
s:.$:-&:;                        | insert '-' before the last character
         :s;                     | loop label 's':
            s:0-:-9:;            | transform the next consecutive '0' in the end of the number to '9', if any
                     ts;         | loop to 's' if more consecutive zeroes are available
                        h        | copy the result to the temporary buffer
                                 |
y:123456789:012345678:;          | decrement all digits except '0' (N.B.: digits, not numbers)
                       G         | append the temporary buffer to the result
                                 |
s:.*(.)-.*\n(.*).-:\2\1:;        | cut and replace the digit left to the last consecutive 0 in the original
                                 | number pasted from the temporary buffer, then discard all other digits decremented
                         tl;     | …then loop to 'l' if the number is ≥0
                            c\   | insert a carriage return and exit

설명을 추가해 주시겠습니까?
user285259

1
@ user285259 완료.
hidefromkgb


2

F #, 108106 바이트

let v p=seq{for i=1 to p do
 if i%3=1 then yield"Yeah"
 if i%2=1 then yield"But"
 if i%3=2 then yield"No"}

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

-2에서 변화 바이트 i=0 to p-1i=1 to p하고 modulos 조정. 그 외에도 꽤 간단합니다.


1
TIO 링크에 대한 빌드 오류, 테스트 코드의 구문 오류가 있습니까?
maxb

고마워 내 원래 솔루션은 콘솔에 직접 인쇄되었지만 시퀀스를 반환하려고 시도했는데 약 2 바이트가 더 짧았습니다. 그래서 TIO에서 코드를 변경했지만 바닥 글을 업데이트하는 것을 잊었습니다. 여전히 v모든 것을 인쇄 하는 기능을 기대하고 있었습니다.
Ciaran_McCarthy

2
(2 i=1 to p) 자연스럽게 모듈러스를 조정 하여 2 바이트를 면도하십시오 . 역 범위가 비어 있습니다. :)

좋은! 나는 그것을 추가했다. 감사! :)
Ciaran_McCarthy

2

PHP, 65 68 바이트

while($i<$argn)echo["Yeah
"][$i%3],["But
"][$i%2],["No
"][~-$i++%3];

파이프로 실행 -nR하거나 온라인으로 사용해보십시오 .


보기 좋지만 n = 10 인 중간에 추가 줄 바꿈을 생성합니다.
maxb

@maxb 힌트 감사합니다. 나는 그것을 9 바이트로 고칠 수 있었다. 그러나 다른 접근법은 더 짧습니다.
Titus

2

VBA (엑셀), 105, 101, 99 바이트

편집 : Keeta에서 -4 바이트! 감사!

Chronocidal에서 2 : 2 바이트 편집! 우와! (테스트 사례는 10 일 동안 만 작동한다는 사실을 현실화했습니다. 지금 수정되었습니다.)

네, 이번에는 Excel이 VBA를 이겼습니다. 도대체 무엇이. (우리는 당신을 위해오고있다)

d=vbCr:For i=1To[a1]:a=i Mod 3:?IIf(a=1,"Yeah"+d,"")IIf(i/2=i\2,"","But"+d)IIf(a=2,"No"+d,"");:Next

^ 이것은 직접 실행 창에 붙여 넣어 디버그 창에 출력됩니다.

언 골프

d = vbCr
'For 1 to the value in A1 (using 0 gave extra values, and VBA skips the for loop if 0)
For i = 1 To [a1]    'aka: Range("A1").value
    a = i mod 3
    '? is the same as Print (Debug.Print when not in the Immediate Window)
    Print IIf(a = 1, "Yeah" + d, "") _ '<-- Just a line continuation
          'Keeta taught me that the \ operator is division with truncation,
          '     so if they are equal then there is no remainder!
          IIf(i / 2 = i \ 2, "", "But" + d) _
          IIf(a = 2, "No" + d, "");
    'Print usually prints a newline, but it still outputs if the string is blank...
    '   So we append a newline -if true- and use a semi-colon to kill the newline
Next

당신이 내 첫 번째 코드를 보면 @Keeta 좋은 아이디어,하지만 ... 내가 범위 / 셀 .value를 의미하는 [A1]를 사용 : 나는 설명을하지만, 미안하다고하는 것이 더 명확하지했습니다해야합니다 /
seadoggie01

1
그래, 나는 그것을보고 의견을 삭제하려고했습니다. i mod 3 = 0 대신 i / 3 = i \ 3을 사용하는 방법은 어떻습니까 (mod 2 = 0과 동일). 시도하지 않았지만 작동합니까?
Keeta

나는 그렇게 생각 생각하지 않는다 전에 ...의 \ 연산자를 본 적이 @Keeta, 그것은 생각 모 I의 반대처럼 ... 나머지없이 부문의 값을 반환
seadoggie01

하나는 정수 나누기이고 다른 하나는 부동 소수점입니다. 7/3 = 2.3333 여기서 7 \ 3 = 2 (절단 나누기). 6/3는 2이어야하고 6 \ 3도 2이어야하므로 나머지가 0 일 때마다 작동해야합니다 (제 생각에).
Keeta

1
VBA는 자동으로 함수 출력을 연결하므로 여분의 2 바이트에 &대해 각각 사이를 삭제할 수 있습니다.IIf(..)
Chronocidal

2

젤리 , 22 바이트

5Rż7FṚṁị“'⁴\ÆẓNƇ»ḲŒP¤Ẏ

행 목록을 생성하는 모나드 링크 (주석에 허용 된 것 같습니다)

온라인으로 사용해보십시오! (바닥 글은 Jelly의 암시 적 인쇄가 가능하면 모든 것을 하나로 묶으므로링크를 사용하여 링크를 호출하고 줄Ç바꿈을 사용Y합니다)

어떻게?

2×3=6

이제 처음 6 개의 값은 다음과 같습니다.

["Yeah", "But"]
["No"]
["But"]
["Yeah"]
["But", "No"]
[]

따라서 결과로 나오는 줄 목록은이 값 n들이 함께 연결된 길이까지 반복되거나 잘 려야합니다.

이제 전원의 설정 "Yeah", "But", "No"은 다음과 같습니다.

[]
["Yeah"]
["But"]
["No"]
["Yeah", "But"]
["Yeah", "No"]
["But", "No"]
["Yeah", "But", "No"]

따라서 각주기는 다음과 같이 1- 인덱싱 된 검정력 값입니다 "Yeah", "But", "No".

5, 4, 3, 2, 7, 1

코드는이 목록을 만들고 길이로 성형 n하고 전원 세트로 색인 한 다음 내부 목록을 제거합니다 (문자열은 젤리의 목록이므로 빈 문자열도 제거합니다) ...

5Rż7FṚṁị“'⁴\ÆẓNƇ»ḲŒP¤Ẏ - Link: integer, n   e.g. 10
5                      - literal five            5
 R                     - range                   [1,2,3,4,5]
   7                   - literal seven           7
  ż                    - zip together            [[1,7],[2],[3],[4],[5]]
    F                  - flatten                 [1,7,2,3,4,5]
     Ṛ                 - reverse                 [5,4,3,2,7,1]
      ṁ                - mould like (n)          [5,4,3,2,7,1,5,4,3,2]
                    ¤  - nilad followed by link(s) as a nilad:
        “'⁴\ÆẓNƇ»      -   compressed string     "Yeah But No"
                 Ḳ     -   split at spaces       ["Yeah","But","No"]
                  ŒP   -   power-set             [[],["Yeah"],["But"],["No"],["Yeah","But"],["Yeah","No"],["But","No"],["Yeah","But","No"]]
       ị               - index into              [["Yeah","But"],["No"],["But"],["Yeah"],["But","No"],[],["Yeah","But"],["No"],["But"],["Yeah"]]
                     Ẏ - tighten                 ["Yeah","But","No","But","Yeah","But","No","Yeah","But","No","But","Yeah"]

이보다 더 짧아 질 것 같지는 않습니다. 환상적인 답변과 훌륭한 설명, 잘했습니다!
maxb

2

파이썬 2 , 93 92 83 바이트

lambda i:''.join('Yeah\n'*(x%3<1)+'But\n'*(x%2<1)+'No\n'*(x%3==1)for x in range(i))

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

@Jonathan Frech 덕분에 엄청난 9 바이트가 절약되었습니다.


당신은 문자열의 반복 대신 튜플 인덱싱을 사용할 수 있습니다 - ('','Yeah\n')[x%3<1]에 해당합니다 "Yeah\n"*(x%3<1).
Jonathan Frech

@JonathanFrech-매우 멋지다! 다른 경우에도 유사한 기술을 적용 할 수 있습니다. 많은 감사합니다!
ElPedro
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.