Vâng nhưng không nhưng vâng


46

Đồng nghiệp của tôi gần đây đã gửi cho tôi đoạn JavaScript sau đây như một trò đùa:

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

Vì mã được viết trong giờ làm việc, rõ ràng nó là một sự lãng phí rất lớn tài nguyên của công ty. Để ngăn chặn những sự cố tương tự xảy ra trong tương lai, chúng ta phải giảm thiểu lãng phí thời gian làm việc. Và vì kiến ​​thức phổ biến là một chương trình ngắn hơn để viết nhanh hơn, chúng ta phải đánh golf mã này càng ngắn càng tốt!

Đầu vào

Một số nguyên không âm. Bạn không được xử lý đầu vào bị lỗi.

Đầu ra

Chương trình của bạn phải tạo đầu ra giống hệt với kịch bản ở trên. Bạn nên xuất một từ trên mỗi dòng và số lượng từ phải phù hợp với tập lệnh gốc.

Được phép bao gồm các ký tự khoảng trắng không phải dòng mới ở cuối mỗi dòng (nhưng không phải ở đầu) vì chúng là vô hình. Một ký tự dòng mới bổ sung được cho phép ở cuối đầu ra.

Ví dụ

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
Chúng tôi có thể trả về một danh sách các dòng?
Jo King

10
Nó phải giải trí để làm việc với một chap vui như vậy! : s Trên một lưu ý nghiêm trọng hơn một chút: nrOfButsbiến này được đặt tên kém và gây hiểu nhầm. Dù sao cũng là thử thách đơn giản.
Arnauld

10
Chúng ta có nhận được tiền thưởng không nếu dòng cuối cùng là "Chúa không thể tin rằng bạn vừa nói điều đó!"
Ciaran_McCarthy

3
@EriktheOutgolfer ifmáng rơi và tiếp tục trong vòng lặp hiện tại nếu điều kiện của họ được thỏa mãn.
dzaima

4
Codegolf Úc nhất chưa? Ngoại trừ nó phải là "nah"
Nacht - Tái lập Monica

Câu trả lời:


48

Excel, 78 byte

Giả sử đầu vào trong ô A1 và định dạng Wordwrap được bật cho ô. Sử dụng Alt + Enter để thêm nguồn cấp dữ liệu trong chuỗi và lưu ý khoảng trắng. Chỉ xử lý đầu vào tối đa 3570 do giới hạn chức năng REPT (Tuy nhiên, may mắn là có được một tế bào cao như vậy).

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

In lại, với các khoảng thời gian cho khoảng trắng

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

Cách thức hoạt động: Mẫu lặp lại cứ sau 6 số:

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

Mỗi trong số này có thể được thể hiện bằng 9 ký tự, do đó, một chuỗi được tạo thành từ 54 ký tự (9 * 6), sau đó lặp lại với kích thước lớn như Excel sẽ cho phép. Sau đó, nó lấy các ký tự 9 * (số lượng đầu vào) bên trái làm đầu ra.

Linefeed cho "nhưng và không" được đặt sau khoảng trống để Yeah cho # 6, # 12, (v.v.) được định dạng ở bên trái thay vì bên phải và do đó không có nguồn cấp dữ liệu trống nào được thêm vào mỗi dòng thứ 6 cho mục đó.

Đầu ra


1
Tôi không có cách nào để xác minh điều này, nhưng mô tả của bạn làm cho nó có vẻ đúng. Bạn có thể thêm một số cặp đầu vào / đầu ra? Một trong những ngôn ngữ vô lý hơn, nhưng dù sao câu trả lời tuyệt vời.
maxb

16
@maxb Không thể là tất cả những điều nực cười khi nó đang đánh bại các ngôn ngữ khác.
Keeta

1
Giải thích tuyệt vời và kỹ thuật rất mát mẻ. Cũng hoạt động trong LibreScript Calc nhưng có thể cần một số cách chơi với định dạng. +1
ElPedro

20

JavaScript (ES6), 59 57 byte

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

Hãy thử trực tuyến!

Làm sao?

Chúng tôi sử dụng hàm đệ quy đi từ đến 1 thay vì từ 0 đến n - 1 .n10n1

Kết quả là các bài kiểm tra bị giảm đi so với mã tham chiếu:1

  • nếu , đầu ra"Yeah"viết sai rồi1(phép chia lấy phần dư3)
  • nếu , đầu ra"Nhưng"viết sai rồi1(phép chia lấy phần dư2)
  • nếu , đầu ra"Không"viết sai rồi2(phép chia lấy phần dư3)

Điều này cho phép chúng ta lưu trữ trường hợp đơn giản hơn là mục nhập đầu tiên của mảng tra cứu của chúng tôi, nơi chúng tôi có thể định nghĩa s : một biến giữviết sai rồi0(phép chia lấy phần dư3)S"But\n" hoặc một chuỗi rỗng.

Hai mục khác được định nghĩa là "Yeah\n" + ss + "No\n"tương ứng.

Lưu ý: Bằng cách lặp từ đến 0 , chúng ta cũng có thể xác định s trong mục đầu tiên, nhưng điều đó sẽ tốn thêm hai dấu ngoặc đơnviết sai rồi-10S .

Đã bình luận

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 byte

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

Hãy thử trực tuyến!


2
Trông thật tuyệt vời (tôi rất ghét viết mã này!), Nhưng trong trường hợp thử nghiệm 10, "Không" thứ 2 và "Nhưng" được lật ... Vì vậy, nhưng không: D
seadoggie01

2
Rất tiếc, tôi nghĩ rằng tôi có thể tối ưu hóa ở đó. Đây là một mô hình khó khăn. Tôi đã sửa nó bây giờ.
JosiahRyanW

1
Tôi thích cách nó đọc
LocustHorde

4
VISIBLE "But"đề cập đến chương trình thiếu quần?
JDL

12

Khoảng trắng , 315 304 300 277 276 byte

Nhờ @JoKing cho -11 byte (giảm số lượng nhãn được sử dụng từ 8 xuống 7) và -24 byte nữa (thay đổi luồng chung của chương trình và giảm lượng nhãn được sử dụng từ 7 xuống 5 trong quy trình).

[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]

Chữ cái S(dấu cách), T(tab) và N(dòng mới) được thêm vào dưới dạng chỉ tô sáng.
[..._some_action]chỉ thêm vào giải thích.

Dùng thử trực tuyến (chỉ có khoảng trắng, tab và dòng mới).

Whitespace chắc chắn không phải là ngôn ngữ phù hợp cho thử thách này .. Trong Whitespace cả hai vòng lặp và câu lệnh if được tạo bằng nhãn và nhảy sang nhãn, và vì chúng không phải là trường hợp if-ifif khác mà là nhiều trường hợp if, nó có nghĩa là tôi sẽ phải quay lại sau mỗi lần, nếu nó khá dài có nghĩa là tôi sẽ phải sửa đổi một chút các kiểm tra để bỏ qua một số bản in (cảm ơn @JoKing ).

Giải thích bằng mã giả:

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)

Giải thích thêm:

Nói chung, nó lặp từ đầu vào xuống 0, đẩy một dòng mới và từ bị đảo ngược (vì vậy theo thứ tự "\ noN", "\ ntuB", "\ nhaeY" thay vì "Yeah \ n", "Nhưng \ n "," Không \ n "). Và sau khi đầu vào được lặp xuống 0 và tất cả các ký tự nằm trên ngăn xếp, nó sẽ in các ký tự đó ngược lại (vì vậy thứ tự đầu ra chính xác).

Tuy nhiên, chuyên sâu hơn: Mặc dù chúng ta cần in các từ trong phạm vi (input, 0], [input, 0)thay vào đó , nó sẽ lặp trong phạm vi . Vì lý do này, chúng tôi có thể sử dụng kiểm tra if(i%3 == 2)cho "\ noN" (hoặc thực tế, if(i%3 != 2)bỏ qua việc đẩy "\ noN") và chúng tôi sử dụng kiểm tra if(i%2 != 1)cho "\ ntuB" (hoặc thực tế, if(i%2 == 0)bỏ qua việc đẩy "\ ntuB" ). Chỉ sau hai lần kiểm tra này, chúng tôi mới giảm số lần lặp ixuống 1. Và sau đó thực hiện kiểm traif(i%3 == 0) để đẩy "\ nhaeY", tương tự như trong mã ví dụ JS trong mô tả thử thách. Bỏ qua kiểm tra if-not thay vì đi đến nhãn và trả về từ nhãn với kiểm tra if đã lưu 23 byte.

Ngoài ra, trong các giá trị ký tự Whitespace được lưu trữ trong ngăn xếp dưới dạng các giá trị unicode của chúng (tức là 10cho các dòng mới, 65cho 'A', 97cho 'a', v.v.). Vì tôi đã cần lặp qua ngăn xếp để in các ký tự, tôi cũng có thể sử dụng mẹo Whitespace của mình để hạ thấp số byte bằng cách thêm một hằng số vào các giá trị số, trước khi in chúng dưới dạng ký tự.
Hằng số này là 104trong trường hợp này, được tạo ra với chương trình Java này mà trước đây tôi cũng đã sử dụng để chơi một câu trả lời Whitespace khác của tôi . Đó cũng là lý do tại sao phần này của mã:

[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]

có các giá trị -94cho dòng mới, 7cho 'o' và -26cho 'N'. Bởi vì thêm hằng số của 104ý chí đưa ra một cách chính xác giá trị unicode của chúng tôi 10, 11178cho những nhân vật tương ứng.


1
Tôi chắc chắn không mong đợi một câu trả lời Whitespace. Làm tốt lắm!
maxb

@maxb Cảm ơn! Thật không may, nó dài hơn một chút so với dự kiến ​​do 8 nhãn mà nó yêu cầu .. Nhưng tôi đã rất vui vì nó hoạt động. :)
Kevin Cruijssen

Bạn không thể giảm một nửa nhãn bằng cách bỏ qua câu lệnh if tiếp theo nếu điều kiện sai? ví dụif i modulo-3 != 1 jump to next if else push NO
Jo Vua

1
@JoKing Ah chờ đã, tôi đã hiểu nhầm một phần mã giả của bạn. Vấn đề đầu tiên của tôi về việc không truy xuất itrước if(i is 0) call PRINTlà đúng, nhưng vấn đề khác của bạn là kiểm tra itrước khi trừ nó và bỏ qua các bản in. Khá thông minh thực sự. Sẽ tiếp tục thực hiện nó.
Kevin Cruijssen

1
Chà, nếu bạn nhảy đến đầu vòng lặp, nó sẽ chạy lại câu lệnh if và nhảy thẳng trở lại chức năng in. Có lẽ điều này sẽ tiết kiệm một byte nếu bạn thay đổi nhãn vòng lặp thành nhãn trống
Jo King


11

Perl 6 , 63 50 byte

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

Hãy thử trực tuyến!

Khối mã ẩn danh lấy một số và trả về danh sách các dòng

Giải trình:

{                                                }   # 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 (di sản) , 27 25 24 byte

Đã lưu 1 byte nhờ Kevin Cruijssen .

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

Hãy thử trực tuyến!

Giải trình

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, bạn đánh tôi với nó .. Đã sắp đăng một câu trả lời. Dù sao thì bạn cũng ngắn hơn, vì vậy +1 từ tôi .. Sử dụng tốt ×, đã không nghĩ về điều đó!
Kevin Cruijssen

Wow, tôi thích một lời giải thích về điều này. Tốt nhất cá nhân của tôi là 44 byte trong CJam.
maxb

@maxb: Tất nhiên tôi sẽ thêm một lời giải thích. Tôi chỉ đang kiểm tra xem liệu tôi có thể đánh gôn thêm lần nữa không;)
Emigna

Bạn có thể xóa Θngay bây giờ bạn không còn sử dụng nữa ×, vì Ïsẽ chỉ nhìn vào 1s, vì vậy nó bỏ qua 2(và 0tất nhiên).
Kevin Cruijssen

@KevinCruijssen: Cảm ơn! Không chắc chắn làm thế nào tôi đã bỏ lỡ điều đó: P
Emigna


6

Python 2 , 97 95 92 90 83 81 byte

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

Hãy thử trực tuyến!

-2 byte, nhờ có lò nướng


Python 3 , 92 90 85 83 byte

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

Hãy thử trực tuyến!

-4 byte, nhờ có lò nướng

-4 byte, nhờ Jo King


86 byte bằng cách kết hợp cả hai và trở lại dưới dạng danh sách các dòng
Jo King

@JoKing Cảm ơn, không biết rằng tôi có thể quay lại thay vì in khi viết nó.
TFeld

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


6

Groovy (hàm), 79 byte

Vì ban đầu gửi câu trả lời của tôi, tôi đã xem qua một số cuộc thảo luận lịch sử ở đây về những gì tạo thành một câu trả lời phù hợp. Vì dường như thường được chấp nhận để chỉ cung cấp một phương thức trong Java (bao gồm khai báo kiểu trả về và tham số), nên đây là phương thức ngắn hơn, Groovy, có giá trị trả về phương thức là câu trả lời. Sử dụng các defphương tiện mà kiểu trả về được suy ra.

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

Không giống như câu trả lời ban đầu bên dưới, vòng lặp từ 0 đến n-1, câu hỏi này tự gọi từ n xuống 1, nhưng giảm đầu vào cho phần còn lại của dòng trong cuộc gọi đệ quy.

Hãy thử trực tuyến!

Groovy (chương trình), 87 byte

Các tập lệnh Groovy không yêu cầu một số nhập chung nhất định, vì vậy đây có thể là chương trình in câu trả lời cho STDOUT của Java mà không phải khai báo System.out.trước print. Nó cũng cung cấp một số phương thức tiện ích phổ biến, chẳng hạn như phương thức này toLong()cho phép chúng tôi phân tích đối số đầu vào một cách hợp lý.

Về cơ bản là câu trả lời Java 10, nhưng tận dụng cú pháp vòng lặp ngắn hơn của Groovi và khả năng đánh giá các tuyên bố trung thực.

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

Hãy thử trực tuyến!


Chào mừng đến với PPCG! Câu trả lời tuyệt vời đầu tiên! Bản thân tôi chưa mã hóa bất kỳ Groovy nào, nhưng tôi có thể đề nghị chạy mã của bạn trên TIO không? Bằng cách đó, nó có thể được xác nhận bởi những người khác, và được hưởng tất cả.
maxb

1
@maxb Cảm ơn! Tôi đã thêm một cái :)
archangel.mjj

Câu trả lời đầu tiên tốt đẹp và cũng được chào đón đến PPCG.
ElPedro

5

Võng mạc 0.8.2 , 45 byte

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

A`1

Hãy thử trực tuyến! Giải trình:

.+
$*

Chuyển đổi đầu vào thành unary.

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

Đối với mỗi số nguyên 0...n-1, tạo ba dòng văn bản, một dòng cho mỗi từ, mỗi dòng có i 1s trước nó, ngoại trừ No, có hai 1s thêm để chúng ta tính toán (i+2)%3==0tương đương i%3==1.

+`11B
B

Hủy bỏ các cặp 1s trước Bs.

111

Loại bỏ 1s trong nhóm ba nơi khác.

A`1

Xóa tất cả các dòng vẫn còn a 1.


Ồ, bây giờ tôi thấy 11No¶để tính toán (i+2)%3==0(vì vậy cả ba đều là kiểm tra nếu ==0) nó trông rất rõ ràng, nhưng tôi đã không nghĩ về điều đó, vì vậy nó thực sự khá khéo léo. +1 từ tôi, câu trả lời tốt đẹp!
Kevin Cruijssen

5

Java 10, 100 99 byte

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":""));}

-1 byte nhờ @ OlivierGrégoire .

Hãy thử trực tuyến.

Giải trình:

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>1có thể sẽ giúp bạn tiết kiệm một byte
Olivier Grégoire

@ OlivierGrégoire Ah, tất nhiên. Cảm ơn!
Kevin Cruijssen

5

Powershell, 75 74 72 67 66 byte

-1 byte cảm ơn TessellatingHeckler

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

Kiểm tra kịch bản và giải thích:

$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"
}

Đầu ra:

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

Kịch bản đơn giản, 72 byte:

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

1
Câu trả lời chính xác! Có thể thêm một số đầu ra cho câu trả lời, vì nó không bao gồm một trình thông dịch trực tuyến?
maxb

Scriptblock câu trả lời không trở lại ======. Nó chỉ tạo ra các Yeah,But,Nochuỗi. Kịch bản kiểm tra hiển thị dấu phân cách để chỉ đọc kết quả dễ dàng hơn.
mê mẩn

Cách sử dụng hashtable đó là thông minh. Tôi sẽ cần phải nhớ điều đó.
admBorkBork


1
@mazzy Tôi có thể định dạng lại bạn, nhưng vẫn không thể đánh bại 67 (thay thế hai \ n bằng các dòng mới thực sự)(" Yeah\nBut No But Yeah But\nNo "*($j="$args")|% s*t 32)[1..$j]-ne''
TessellatingHeckler

4

Haskell , 71 byte

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

Hãy thử trực tuyến!

Giải trình

Khá đơn giản, đã lưu hai byte bằng cách sử dụng [1..n]thay vì [0..n-1]và điều chỉnh phần còn lại: Toán tử(?) kiểm tra có bốn đối số, trả về một danh sách trống hoặc chuỗi được cung cấp dưới dạng một đơn nếu kết quả là chính xác.

Bằng cách giới thiệu đối số thứ tư của (?)chúng ta có thể sử dụng (<>)để nối các kết quả của từng hàm, nghĩa là:

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

4

C # (Trình biên dịch tương tác Visual C #) , 105 99 94 96 89byte

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

Hãy thử trực tuyến!


4
Loại bỏ phép nội suy như thế này sẽ tiết kiệm được 7 byte.
Emigna

@Emigna Cảm ơn vì tiền boa, đã thay đổi câu trả lời
auhmaan

1
x++%3==1?có thể ++x%3>1?. Một số người khác chỉ trả lời cho câu trả lời Java của tôi, nhưng điều tương tự cũng áp dụng cho câu trả lời C # của bạn. :)
Kevin Cruijssen

4

Pip , 37 35 33 byte

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

(Lưu ý khoảng trắng sau But.) Lấy đầu vào làm đối số dòng lệnh. Hãy thử trực tuyến!

Giải trình

Giải thích này dành cho phiên bản trước - xem bên dưới để thay đổi

Lấy cảm hứng từ câu trả lời của Jo King Perl 6 . Chúng tôi xây dựng danh sách này:

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

và xuất các aphần tử đầu tiên của nó bằng cách sử dụng lập chỉ mục theo chu kỳ.

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

Cập nhật: Tôi nhận ra rằng tôi không cần sử dụng thay thế để thay đổi 0/1/2 thành chuỗi - Tôi có thể sử dụng các số đó để lập chỉ mục trực tiếp vào danh sách. Để làm điều này, chúng tôi phải đảm bảo các số có nhiều chữ số được chia thành danh sách các chữ số của chúng (nếu không, chúng tôi sẽ chọn chỉ số 10 thay vì chỉ số 1 và 0). May mắn thay, sử dụng danh sách lồng nhau tùy ý làm chỉ mục trong Pip hoạt động như mong đợi, đưa ra danh sách kết quả (lồng). Đối với đầu vào là 3, chúng tôi nhận được tiến trình dữ liệu này ( _đại diện cho một dòng mới):

"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 _"]]

Như trước đây, kết quả cuối cùng được nối với nhau và tự động in.


4

Tùy viên , 48 byte

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

Hãy thử trực tuyến!

Giải trình

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 byte

Đã có một tốt hơn câu trả lời C ở đây nhưng câu này được đệ quy và tôi phải mất một thời gian để đi thẳng nên tôi đã đăng nó.

Giảm xuống 69 byte nhờ cả @ceilingcat và @JonathanFrech

(Tôi không bao giờ nghĩ sử dụng n- ~ -i thay cho n-i + 1)

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

Hãy thử trực tuyến!


@JonathanFrech Đẹp nhưng không hoạt động với số không, hoặc 5
cleblanc

@cleblanc ơi, xin lỗi. Không nhận ra ... Ít nhất việc xóa jbạn đã lưu hai byte.
Jonathan Frech

1
70 byte - kết hợp một byte đã lưu của @ Barecat.
Jonathan Frech

1
n-~-itương đương với n-i+1- không i<n+1- và vì vậy không thực sự lưu bất kỳ byte nào ...
Jonathan Frech

3

Ruby, 69 72 74 Byte

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

Câu trả lời rất thẳng, kiểm tra một phương pháp đệ quy ngắn hơn ngay bây giờ.

Đã lưu hai byte nhờ @BWO :)

Đã lưu ba byte khác bằng cách sử dụng các ký hiệu thay vì chuỗi


3

Python 3, 93 byte

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

Đây không phải là giải pháp tốt nhất nhưng tôi chấp nhận nó.

Hãy thử trực tuyến!


1
Nếu bạn đã có một biểu thức bạn có thể sử dụng trong việc hiểu danh sách nhưng việc hiểu danh sách của bạn chỉ tồn tại để gợi lên các hiệu ứng phụ của biểu thức đó, một vòng lặp đơn giản đòi hỏi ít byte hơn.
Jonathan Frech

3

R, 65 byte

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

Do thực tế là chúng tôi đang sao chép một chương trình hơi thiếu sót (nó bỏ lỡ mọi thứ tư "nhưng" - nó nên được sử dụng %4 == 1%4 == 3thay vì %3điều kiện), chúng tôi phải sử dụng một cuộc gọi khó xử cvà làm việc trong cơ sở bảy. Tuy nhiên, nó ngắn hơn LOLCODE ...

(Tôi đã hy vọng rằng (3,1,2,3,2,1,2) hoặc một hoán vị tương tự có thể xuất hiện trong lhtập dữ liệu ở đâu đó nhưng nó không giống như vậy)


3

sed -E ,179 150 byte

/^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\ 

Phần khó nhất không phải là xây dựng danh sách mà là phân tích số thập phân.

Có thể lưu 2 byte nếu dòng mới ở cuối không bắt buộc: c\ d .

Vẫn yêu cầu tối ưu hóa.

Dùng thử trực tuyến .

Giải trình

/^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

Bạn có thể thêm một số giải thích xin vui lòng?
dùng285259

1
@ user285259 Xong.
Hidefromkgb


2

F #, 108 106 byte

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"}

Hãy thử trực tuyến!

-2 byte thay đổi từ i=0 to p-1đến i=1 to pvà điều chỉnh modul. Ngoài ra, khá đơn giản.


1
Tôi nhận được một số loại lỗi xây dựng cho liên kết TIO, có lẽ là lỗi cú pháp trong mã kiểm tra?
maxb

Cảm ơn vì điều đó. Giải pháp ban đầu của tôi được in trực tiếp lên bàn điều khiển, nhưng sau đó tôi đã thử trả về một chuỗi và hóa ra nó ngắn hơn khoảng 2 byte. Vì vậy, tôi đã thay đổi mã trong TIO nhưng quên cập nhật chân trang - vẫn đang mong đợi vchức năng in mọi thứ ra.
Ciaran_McCarthy

2
Cạo 2 byte bằng i=1 to p(và điều chỉnh moduli, một cách tự nhiên). Phạm vi đảo ngược là trống rỗng. :)

Đẹp! Tôi đã thêm điều đó. Cảm ơn! :)
Ciaran_McCarthy

2

PHP, 65 68 byte

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

Chạy như ống với -nRhoặc thử trực tuyến .


Có vẻ tốt, nhưng nó tạo ra một dòng mới bổ sung ở giữa cho n = 10
maxb

@maxb Cảm ơn bạn đã gợi ý. Tôi có thể đã sửa nó với 9 byte thêm; nhưng cách tiếp cận khác ngắn hơn.
Tít

2

VBA (Excel), 105, 101, 99 byte

Chỉnh sửa: -4 byte từ Keeta! Cảm ơn!

Chỉnh sửa 2: -2 byte từ Chronocidal! Khốn nạn! (Nhận ra rằng các trường hợp thử nghiệm chỉ hoạt động trong 10. Đã sửa bây giờ)

Vâng, Excel đã đánh bại VBA lần này. Bất cứ điều gì. (Chúng tôi đang đến với bạn)

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

^ Điều này được dán vào cửa sổ Ngay lập tức và xuất ra cửa sổ gỡ lỗi

Ung dung

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 ý tưởng tốt, nhưng không ... Nếu bạn nhìn vào mã đầu tiên của tôi, tôi sử dụng [a1] có nghĩa là Phạm vi / ô .value :) Tôi nên nói rõ hơn đó là một lời giải thích, xin lỗi: /
seadoggie01

1
Vâng, tôi đã thấy điều đó và cố gắng xóa bình luận. Làm thế nào về việc sử dụng i / 3 = i \ 3 thay vì i mod 3 = 0 (và tương tự cho mod 2 = 0). Không thử nó, nhưng nó sẽ làm việc?
Keeta

@Keeta Trước đây tôi chưa bao giờ thấy toán tử \ ... Tôi không nghĩ vậy, nó trả về giá trị của phép chia mà không có phần còn lại ... giống như đối diện với Mod tôi nghĩ
seadoggie01

Một là chia số nguyên và một là dấu phẩy động. 7/3 = 2,3333 trong đó 7 \ 3 = 2 (chia cắt). 6/3 nên là 2 và 6 \ 3 cũng phải là 2 vì vậy nó sẽ hoạt động bất cứ khi nào phần còn lại bằng 0 (tôi nghĩ).
Keeta

1
VBA sẽ tự động nối các đầu ra chức năng, do đó bạn có thể thả &giữa mỗi đầu IIf(..)ra thêm 2 byte
Chronocidal

2

Thạch , 22 byte

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

Một liên kết đơn âm mang lại một danh sách các dòng (dường như đã được cho phép trong các bình luận)

Hãy thử trực tuyến! (chân trang gọi Liên kết bằng cách sử dụngÇvà tham gia với các dòng mới bằng cách sử dụngYin ngầm trong Jelly đập vỡ mọi thứ với nhau nếu có thể)

Làm sao?

Lưu ý đầu tiên rằng chúng tôi có một khoảng thời gian 2×3= =6 do định nghĩa modulo.

Bây giờ lưu ý rằng sáu giá trị đầu tiên là:

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

Vì vậy, danh sách kết quả của các dòng nên được lặp lại các giá trị này (hoặc cắt ngắn) n nối với nhau.

Bây giờ lưu ý rằng tập hợp sức mạnh "Yeah", "But", "No"là:

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

Vì vậy, mỗi thời kỳ là các giá trị 1 chỉ mục này của tập hợp sức mạnh của "Yeah", "But", "No":

5, 4, 3, 2, 7, 1

Mã này tạo danh sách này, nặn nó theo chiều dài n, lập chỉ mục vào tập hợp sức mạnh và sau đó xóa danh sách bên trong (cũng loại bỏ các chuỗi trống, vì các chuỗi là danh sách trong Jelly) ...

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"]

Tôi nghi ngờ rằng nó sẽ nhận được bất kỳ ngắn hơn này. Câu trả lời tuyệt vời, và một lời giải thích tuyệt vời, cũng được thực hiện!
maxb

2

Python 2 , 93 92 83 byte

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

Hãy thử trực tuyến!

9 byte khổng lồ được lưu với lời cảm ơn đến @Jonathan Frech


Bạn có thể sử dụng sự lặp lại chuỗi thay vì lập chỉ mục tuple - ('','Yeah\n')[x%3<1]tương đương với "Yeah\n"*(x%3<1).
Jonathan Frech

@JonathanFrech - rất tuyệt! Kỹ thuật tương tự có thể được áp dụng cho các trường hợp khác là tốt. Cảm ơn nhiều!
ElPedro
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.