Ya Tapi Tidak Tapi Ya


46

Rekan saya baru-baru ini mengirimi saya JavaScript sebagai lelucon:

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

Karena kode ini ditulis selama jam kerja, itu jelas merupakan pemborosan besar sumber daya perusahaan. Untuk mencegah kejadian serupa di masa mendatang, kita harus meminimalkan pemborosan jam kerja. Dan karena sudah menjadi rahasia umum bahwa program yang lebih singkat lebih cepat untuk ditulis, kita harus memasukkan kode ini sesingkat mungkin!

Memasukkan

Bilangan bulat non-negatif tunggal. Anda tidak boleh menangani input yang salah.

Keluaran

Program Anda harus menghasilkan keluaran yang identik dengan skrip di atas. Anda harus mengeluarkan satu kata per baris, dan jumlah kata harus konsisten dengan skrip asli.

Diperbolehkan untuk menyertakan karakter spasi spasi non-baris baru di akhir setiap baris (tetapi tidak di awal) karena tidak terlihat. Satu karakter baris baru diizinkan pada akhir output.

Contohnya

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
Bisakah kita mengembalikan daftar baris?
Jo King

10
Pasti menghibur untuk bekerja dengan orang yang lucu! : s Pada catatan yang sedikit lebih serius: nrOfButsvariabelnya agak buruk namanya dan menyesatkan. Tantangan sederhana yang bagus.
Arnauld

10
Apakah kita mendapat bonus jika kalimat terakhir adalah "Tuhan tidak percaya kau mengatakan begitu saja!"
Ciaran_McCarthy

3
@EriktheOutgolfer ifjatuh dan lanjutkan dalam loop saat ini jika kondisinya terpenuhi.
dzaima

4
Codegolf paling Australia belum? Kecuali itu harus "nah"
Nacht - Reinstate Monica

Jawaban:


48

Excel, 78 byte

Mengasumsikan input dalam sel A1, dan bahwa format Wordwrap dihidupkan untuk sel. Gunakan Alt + Enter untuk menambahkan umpan baris dalam string dan perhatikan spasi putih. Hanya menangani input hingga 3570 karena batas fungsi REPT (Keberuntungan mendapatkan sel setinggi itu).

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

Cetak ulang, dengan periode untuk spasi putih

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

Cara kerjanya: Pola ini berulang setiap 6 angka:

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

Masing-masing dapat diekspresikan dengan 9 karakter, sehingga string dibuat dari 54 karakter (9 * 6), kemudian diulang sebesar yang diizinkan oleh Excel. Kemudian dibutuhkan karakter 9 * (jumlah input) yang tersisa sebagai output.

Linefeed untuk yang "tetapi tidak ada" ditempatkan setelah blank sehingga Yeah untuk # 6, # 12, (dll) diformat ke kiri daripada ke kanan, dan sehingga tidak ada linefeed kosong ditambahkan setiap baris ke-6 untuk barang itu.

Keluaran


1
Saya tidak punya cara memverifikasi ini, tetapi deskripsi Anda membuatnya tampak benar. Bisakah Anda menambahkan beberapa pasangan input / output contoh? Salah satu bahasa yang lebih konyol, tapi tetap saja jawaban yang bagus.
Maks

16
@maxb Tidak mungkin konyol ketika mengalahkan bahasa lain.
Keeta

1
Penjelasan hebat dan teknik yang sangat keren. Bekerja di LibreOffice Calc juga, tetapi mungkin perlu bermain dengan format. +1
ElPedro

20

JavaScript (ES6), 59 57 byte

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

Cobalah online!

Bagaimana?

Kami menggunakan fungsi rekursif yang bergerak dari ke 1 daripada dari 0 ke n - 1n10n1 .

Akibatnya, tes dimatikan oleh dibandingkan dengan kode referensi:1

  • jika , output"Ya"n1(mod3)
  • jika , keluaran"Tapi"n1(mod2)
  • jika , keluaran"Tidak"n2(mod3)

Ini memungkinkan kita untuk menyimpan case yang lebih sederhana sebagai entri pertama dari array pencarian kami, di mana kita dapat mendefinisikan s : variabel yang menahan salah satuatau string kosong.n0(mod3)s"But\n"

Dua entri lainnya didefinisikan sebagai "Yeah\n" + sdan s + "No\n"masing - masing.

Catatan: Dengan iterasi dari ke 0 , kita dapat mendefinisikan s pada entri pertama juga, tetapi itu akan menelan biaya dua kurung tambahan .n-10s

Berkomentar

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

Cobalah online!


2
Ini terlihat luar biasa (saya akan benci untuk kode ini!), Tetapi dalam kasus uji 10 2 "Tidak" dan 3 "Tapi" dibalik ... Jadi Ya, tapi tidak: D
seadoggie01

2
Aduh, pikir aku bisa mengoptimalkan sana. Ini adalah pola yang rumit. Saya memperbaikinya sekarang.
JosiahRyanW

1
Saya suka cara itu membaca
LocustHorde

4
Apakah VISIBLE "But"merujuk pada kurangnya celana dalam program?
JDL

12

Ruang kosong , 315 304 300 277 276 byte

Berkat @ JoKing untuk -11 byte (mengurangi jumlah label yang digunakan dari 8 menjadi 7), dan -24 byte lebih banyak (mengubah aliran umum program dan mengurangi jumlah label yang digunakan dari 7 menjadi 5 dalam proses).

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

Huruf S(spasi), T(tab), dan N(baris baru) ditambahkan hanya sebagai penyorotan.
[..._some_action]ditambahkan sebagai penjelasan saja.

Cobalah online (dengan spasi, tab, dan baris baru saja).

Whitespace jelas bukan bahasa yang tepat untuk tantangan ini .. Di Whitespace baik loop dan jika-pernyataan dibuat dengan label dan melompat ke label, dan karena mereka bukan jika-elseif-selain kasus tetapi beberapa jika-kasus, itu berarti saya harus melompat kembali setelah setiap jika, membuatnya cukup lama itu berarti saya harus sedikit memodifikasi cek untuk melewati beberapa cetakan (terima kasih @ JoKing ).

Penjelasan dalam pseudo-code:

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)

Penjelasan tambahan:

Secara umum, itu loop dari input ke 0, mendorong baris baru dan kata terbalik (jadi dalam urutan "\ noN", "\ ntuB", "\ nhaeY" bukannya "Yeah \ n", "Tapi \ n "," Tidak \ n "). Dan setelah input di-looped ke 0 dan semua karakter berada di stack, itu akan mencetak karakter-karakter tersebut secara terbalik (jadi urutan output yang benar).

Namun lebih mendalam: Meskipun kita perlu mencetak kata-kata dalam kisaran (input, 0], itu akan mengulang dalam rentang itu [input, 0). Karena itu, kita dapat menggunakan tanda centang if(i%3 == 2)untuk "\ noN" (atau sebenarnya, if(i%3 != 2)lewati dorongan "\ noN"), dan kami menggunakan tanda centang if(i%2 != 1)untuk "\ ntuB" (atau sebenarnya, if(i%2 == 0)lewati dorongan dari "\ ntuB" ). Hanya setelah dua pemeriksaan ini, kami mengurangi iterasi isebanyak 1. Dan kemudian melakukan pemeriksaanif(i%3 == 0) untuk menekan "\ nhaeY", sama seperti dalam kode contoh JS dalam deskripsi tantangan. Melewati dengan tanda centang jika tidak masuk ke label dan kembali dari label dengan tanda jika disimpan 23 byte.

Juga, dalam Whitespace nilai karakter disimpan dalam tumpukan sebagai nilai unicode mereka (yaitu 10untuk baris baru, 65untuk 'A', 97untuk 'a', dll.). Karena saya sudah perlu mengulang-ulang tumpukan untuk mencetak karakter, saya juga dapat menggunakan tip spasi putih saya untuk menurunkan byte-count dengan menambahkan konstanta ke nilai angka, sebelum mencetaknya sebagai karakter.
Konstanta ini 104dalam hal ini, yang dihasilkan dengan program Java ini yang saya juga gunakan untuk golf jawaban Whitespace saya sebelumnya . Itu juga alasan mengapa ini bagian dari kode:

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

memiliki nilai -94untuk baris baru, 7untuk 'o', dan -26untuk 'N'. Karena menambahkan konstanta dari 104akan memberikan nilai unicode dengan benar 10,111 dan 78untuk karakter ini masing-masing.


1
Saya pasti tidak mengharapkan jawaban Whitespace. Kerja bagus!
Maks

@ Maxb Terima kasih! Sayangnya itu sedikit lebih lama dari yang diharapkan karena 8 label yang dibutuhkan .. Tapi saya sudah senang itu berfungsi. :)
Kevin Cruijssen

Couldn't you halve the labels by skipping to the next if statement if the condition is false? e.g. if i modulo-3 != 1 jump to next if else push NO
Jo King

1
@JoKing Ah wait, I misunderstood a part of your pseudo-code. My first issue about not retrieving i before the if(i is 0) call PRINT is true, but your other is checking the i before subtracting it and skipping over the prints. Pretty smart actually. Will continue implementing it.
Kevin Cruijssen

1
Nah, jika Anda melompat ke awal loop, itu akan menjalankan pernyataan if lagi dan langsung kembali ke fungsi cetak. Mungkin ini menghemat satu byte jika Anda mengubah label lingkaran ke label kosong
Jo King


11

Perl 6 , 63 50 byte

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

Cobalah online!

Blok kode anonim yang mengambil nomor dan mengembalikan daftar baris

Penjelasan:

{                                                }   # 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 (warisan) , 27 25 24 byte

Disimpan 1 byte berkat Kevin Cruijssen .

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

Cobalah online!

Penjelasan

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, Anda mengalahkan saya untuk itu .. Akan memposting jawaban. Lagi pula, Anda lebih pendek, jadi +1 dari saya .. Penggunaan yang bagus ×, tidak memikirkan hal itu!
Kevin Cruijssen

Wow, saya suka penjelasan yang satu ini. Best pribadi saya adalah 44 byte di CJam.
Maks

@ Maxb: Saya tentu saja akan menambahkan penjelasan. Saya hanya memeriksa untuk melihat apakah saya dapat menurunkan golf lebih dulu;)
Emigna

Anda dapat menghapus Θsekarang bahwa Anda tidak lagi menggunakan ×, karena Ïhanya akan melihat 1s saja, sehingga mengabaikan 2(dan 0tentu saja).
Kevin Cruijssen

@KevinCruijssen: Terima kasih! Tidak yakin bagaimana saya melewatkannya: 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'))]

Cobalah online!

-2 byte, terima kasih atas ovs


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

Cobalah online!

-4 byte, terima kasih atas ovs

-4 bytes, thanks to Jo King


86 bytes by combining the two and returning as a list of lines
Jo King

@JoKing Thanks, didn't know that I could return instead of printing when wrote it.
TFeld

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


6

Groovy (function), 79 bytes

Since initially submitting my answer, I've looked through some historic discussions here about what constitutes a suitable answer. Since it seems commonly accepted to provide just a method in Java (including return type and parameter declarations), here is a shorter, Groovy, method which has the method return value be the answer. Use of def means that the return type is inferred.

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

Unlike the original answer below, which loops from 0 up to n-1, this one calls itself from n down to 1, but decrements the input for the rest of the line in the recursive call.

Try it online!

Groovy (program), 87 bytes

Groovy scripts don't require certain common imports, so this can be a program printing the answer to Java's STDOUT without having to declare System.out. before print. It also provides some common utility methods, such as this toLong() which allows us to parse the input argument reasonably consicely.

Essentially the Java 10 answer, but leveraging Groovy's shorter loop syntax and ability to evaluate truthy statements.

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

Try it online!


Welcome to PPCG! Great first answer! I haven't coded any Groovy myself, but might I suggest running your code on TIO? That way, it can be validated by others, and enjoyed by all.
maxb

1
@ Maxb Terima kasih! Saya telah menambahkan satu :)
archangel.mjj

Jawaban pertama yang bagus dan selamat datang di PPCG.
ElPedro

5

Retina 0.8.2 , 45 byte

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

A`1

Cobalah online! Penjelasan:

.+
$*

Konversikan input ke unary.

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

Untuk setiap bilangan bulat 0...n-1, buat tiga baris teks, satu untuk setiap kata, masing-masing dengan i 1s sebelumnya, kecuali untuk No, yang memiliki dua 1s tambahan sehingga kami menghitung (i+2)%3==0yang setara dengan i%3==1.

+`11B
B

Hapus pasangan 1sebelum B.

111

Hapus 1s dalam kelompok tiga di tempat lain.

A`1

Hapus semua baris yang masih memiliki a 1.


Oh, sekarang saya melihat 11No¶untuk menghitung (i+2)%3==0(jadi ketiganya adalah jika-cek ==0) terlihat sangat jelas, tapi saya tidak akan memikirkannya sendiri, jadi sebenarnya cukup cerdik. +1 dari saya, jawaban yang bagus!
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 terima kasih kepada @ OlivierGrégoire .

Cobalah online.

Penjelasan:

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>1kemungkinan akan menghemat satu byte
Olivier Grégoire

@ OlivierGrégoire Ah, tentu saja. Terima kasih!
Kevin Cruijssen

5

Powershell, 75 74 72 67 66 byte

-1 byte terima kasih TessellatingHeckler

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

Naskah uji dan penjelasan:

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

Keluaran:

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

Skrip langsung, 72 byte:

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

1
Jawaban bagus! Apakah mungkin untuk menambahkan beberapa output ke jawabannya, karena tidak termasuk penerjemah online?
Maks

The answer scriptblock does not return ======. It generates Yeah,But,No strings only. The test script shows a separator for easier reading of the results only.
mazzy

Penggunaan hashtable itu pintar. Saya perlu mengingatnya.
AdmBorkBork


1
@mazzy Saya dapat memformulasikan ulang milik Anda, tetapi masih belum bisa mengalahkan 67 (ganti keduanya \ n dengan baris baru nyata)(" 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]

Cobalah online!

Penjelasan

Cukup sederhana, menyimpan dua byte dengan menggunakan [1..n]alih-alih [0..n-1]dan menyesuaikan sisanya: (?)Tes operator mengambil empat argumen, mengembalikan daftar kosong atau string yang disediakan sebagai singleton jika hasilnya benar.

Dengan mengeruk argumen keempat (?)kita dapat menggunakan (<>)untuk menggabungkan hasil dari masing-masing fungsi, yaitu .:

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


4

Pip , 37 35 33 byte

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

(Catat spasi setelahnya But.) Mengambil input sebagai argumen baris perintah.Cobalah online!

Penjelasan

Penjelasan ini untuk versi sebelumnya - lihat di bawah untuk changelog

Terinspirasi oleh jawaban Jo King's Perl 6 . Kami membangun daftar ini:

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

dan output aelemen pertama menggunakan pengindeksan siklik.

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

Pembaruan: Saya menyadari bahwa saya tidak perlu menggunakan ganti untuk mengubah 0/1/2 menjadi string - saya dapat menggunakan angka-angka itu untuk mengindeks ke dalam daftar secara langsung. Untuk melakukan ini, kita harus memastikan angka multi-digit dipecah menjadi daftar digit mereka (jika tidak, kita akan memilih indeks 10 daripada indeks 1 dan 0). Untungnya, menggunakan daftar bersarang sembarang sebagai indeks di Pip berfungsi seperti yang diharapkan, memberikan daftar hasil (bersarang). Untuk input 3, kami mendapatkan perkembangan data ini (di mana _mewakili baris baru):

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

Seperti sebelumnya, hasil akhir disatukan dan dicetak secara otomatis.


4

Attache , 48 byte

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

Cobalah online!

Penjelasan

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

Sudah ada jawaban C yang lebih baik di sini, tetapi yang satu ini bersifat rekursif dan butuh beberapa waktu untuk langsung jadi saya mempostingnya.

Turun ke 69 byte berkat @ceilingcat dan @JonathanFrech

(Saya tidak pernah berpikir untuk menggunakan n- ~ -i di tempat 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"));}

Cobalah online!


@ JonathanFrech Bagus tapi tidak bekerja untuk nol, atau 5
cleblanc

@cleblanc Oh, maaf. Tidak menyadari ... Setidaknya menghapus jmenyelamatkan Anda dua byte.
Jonathan Frech

1
70 byte - termasuk byte yang disimpan @ ceilingcat.
Jonathan Frech

1
n-~-isetara dengan n-i+1- bukan i<n+1- dan tidak benar-benar menyimpan byte ...
Jonathan Frech

3

Ruby, 69 72 74 Bytes

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

Jawaban yang sangat mudah, memeriksa metode yang lebih pendek, rekursif sekarang.

Disimpan dua byte berkat @BWO :)

Menyimpan tiga byte lainnya dengan menggunakan simbol, bukan string


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

Ini bukan solusi yang terbaik, tetapi saya mengambilnya.

Cobalah online!


1
Jika Anda sudah memiliki ekspresi yang dapat Anda gunakan dalam pemahaman daftar tetapi pemahaman daftar Anda hanya ada untuk membangkitkan efek samping ekspresi itu, dataran untuk loop membutuhkan lebih sedikit byte.
Jonathan Frech

3

R, 65 bytes

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

Due to the fact that we are replicating a slightly flawed program (it misses out every fourth "but" — it should have used %4 == 1 and %4 == 3 rather than %3 conditions), we have to use an awkward call to c and work in base seven. Still, it's shorter than LOLCODE...

(I was hoping that (3,1,2,3,2,1,2) or a similar permutation might appear in the lh dataset somewhere but it doesn't look like it)


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\ 

Bagian tersulit adalah tidak membuat daftar tetapi untuk mengurai angka desimal.

2 byte dapat disimpan jika baris baru di akhir tidak diperlukan: c\ d.

Masih membutuhkan optimasi.

Cobalah online .

Penjelasan

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

Bisakah Anda menambahkan beberapa penjelasan?
user285259

1
@ user285259 Selesai.
hidefromkgb

2

Bersih , 116 byte

import StdEnv,Data.List
r=cycle
$n=[e\\_<-[1..n]&a<-r["Yeah","",""]&b<-r["But",""]&c<-r["","No",""],e<-[a,b,c]|e>""]

Cobalah online!


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

Cobalah online!

-2 byte berubah dari i=0 to p-1ke i=1 to pdan menyesuaikan modulos. Terlepas dari itu, cukup mudah.


1
Saya mendapatkan semacam kesalahan build untuk tautan TIO, mungkin kesalahan sintaksis dalam kode pengujian?
Maks

Terima kasih untuk itu. Solusi asli saya dicetak langsung ke konsol, tetapi kemudian saya mencoba mengembalikan urutan dan ternyata lebih pendek sekitar 2 byte. Jadi saya mengubah kode di TIO tetapi lupa untuk memperbarui catatan kaki - yang masih mengharapkan vfungsi untuk mencetak semuanya.
Ciaran_McCarthy

2
Cukur 2 byte dengan i=1 to p(dan sesuaikan moduli, secara alami). Rentang terbalik kosong. :)

Bagus! Saya telah menambahkan itu. Terima kasih! :)
Ciaran_McCarthy

2

PHP, 65 68 byte

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

Jalankan sebagai pipa dengan -nRatau coba online .


Ini terlihat bagus, tetapi menghasilkan baris baru ekstra di tengah untuk n = 10
maks

@ Maxb Terima kasih atas petunjuknya. Saya bisa memperbaikinya dengan 9 byte tambahan; tetapi pendekatan lainnya lebih pendek.
Titus

2

VBA (Excel), 105, 101, 99 Bytes

Edit: -4 byte dari Keeta! Terima kasih!

Edit 2: -2 byte dari Chronocidal! Woot! (Menyadari bahwa kasus uji hanya berfungsi untuk 10. Memperbaiki sekarang)

Ya, Excel mengalahkan VBA kali ini. Masa bodo. (Kami datang untukmu)

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

^ Ini disisipkan ke jendela Segera dan output ke jendela debug

Tidak disatukan

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 ide bagus, tapi tidak ... Jika Anda melihat kode pertama saya, saya menggunakan [a1] yang berarti Range / cell .value :) Saya seharusnya membuatnya lebih jelas bahwa itu adalah penjelasan, maaf: /
seadoggie01

1
Ya, saya melihat itu dan mencoba menghapus komentar. Bagaimana kalau menggunakan i / 3 = i \ 3 bukannya i mod 3 = 0 (dan sama untuk mod 2 = 0). Belum mencobanya, tetapi apakah ini akan berhasil?
Keeta

@ Geeta Saya belum pernah melihat operator \ sebelumnya ... Saya tidak berpikir begitu, ia mengembalikan nilai pembagian tanpa sisanya ... seperti kebalikan dari Mod saya pikir
seadoggie01

Satu adalah pembagian integer dan satu adalah titik mengambang. 7/3 = 2.3333 di mana 7 \ 3 = 2 (pembagian terpotong). 6/3 harus 2, dan 6 \ 3 juga harus 2 sehingga harus bekerja setiap kali sisanya nol (saya pikir).
Keeta

1
VBA akan secara otomatis menggabungkan output fungsi, sehingga Anda dapat menjatuhkan &masing IIf(..)- masing untuk tambahan 2 byte
Chronocidal

2

Jelly , 22 byte

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

Tautan monadik yang menghasilkan daftar garis (yang tampaknya diizinkan dalam komentar)

Cobalah online! (catatan kaki menyebut Tautan menggunakanÇdan bergabung dengan baris baru menggunakanYsejak pencetakan implisit di Jelly menghancurkan segalanya bersama jika itu bisa)

Bagaimana?

Catatan pertama yang kita miliki adalah periode 2×3=6 karena definisi modulo.

Sekarang perhatikan bahwa enam nilai pertama adalah:

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

Jadi daftar garis yang dihasilkan harus nilai-nilai ini diulangi (atau terpotong) untuk panjang nbersama.

Sekarang perhatikan bahwa set daya "Yeah", "But", "No"adalah:

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

Jadi setiap periode adalah nilai-nilai 1-diindeks dari set daya "Yeah", "But", "No":

5, 4, 3, 2, 7, 1

Kode membuat daftar ini, membentuknya memanjang n, mengindeks ke set daya, dan kemudian menghapus daftar bagian dalam (yang juga menghilangkan string kosong, karena string adalah daftar di 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"]

Saya ragu itu akan menjadi lebih pendek dari ini. Jawaban yang fantastis, dan penjelasan yang bagus, bagus sekali!
Maks

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

Cobalah online!

Besar 9 byte disimpan dengan berkat @Jonathan Frech


Anda bisa menggunakan pengulangan string alih-alih tuple indexing - ('','Yeah\n')[x%3<1]setara dengan "Yeah\n"*(x%3<1).
Jonathan Frech

@ JonathanFrech - sangat keren! Teknik serupa dapat diterapkan pada kasus-kasus lain juga. Terimakasih banyak!
ElPedro
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.