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
nrOfButs
variabelnya agak buruk namanya dan menyesatkan. Tantangan sederhana yang bagus.if
jatuh dan lanjutkan dalam loop saat ini jika kondisinya terpenuhi.Jawaban:
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).
Cetak ulang, dengan periode untuk spasi putih
Cara kerjanya: Pola ini berulang setiap 6 angka:
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.
sumber
JavaScript (ES6),
5957 byteCobalah online!
Bagaimana?
Kami menggunakan fungsi rekursif yang bergerak dari ke 1 daripada dari 0 ke n - 1n 1 0 n−1 .
Akibatnya, tes dimatikan oleh dibandingkan dengan kode referensi:1
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.n≡0(mod3) s
"But\n"
Dua entri lainnya didefinisikan sebagai
"Yeah\n" + s
dans + "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 - 1 0 s
Berkomentar
sumber
LOLCODE , 257 byte
Cobalah online!
sumber
VISIBLE "But"
merujuk pada kurangnya celana dalam program?Ruang kosong ,
315304300277276 byteBerkat @ 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).
Huruf
S
(spasi),T
(tab), danN
(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 lamaitu berarti saya harus sedikit memodifikasi cek untuk melewati beberapa cetakan (terima kasih @ JoKing ).Penjelasan dalam pseudo-code:
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 centangif(i%3 == 2)
untuk "\ noN" (atau sebenarnya,if(i%3 != 2)
lewati dorongan "\ noN"), dan kami menggunakan tanda centangif(i%2 != 1)
untuk "\ ntuB" (atau sebenarnya,if(i%2 == 0)
lewati dorongan dari "\ ntuB" ). Hanya setelah dua pemeriksaan ini, kami mengurangi iterasii
sebanyak 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
10
untuk baris baru,65
untuk 'A',97
untuk '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
104
dalam 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:memiliki nilai
-94
untuk baris baru,7
untuk 'o', dan-26
untuk 'N'. Karena menambahkan konstanta dari104
akan memberikan nilai unicode dengan benar10
,111
dan78
untuk karakter ini masing-masing.sumber
if i modulo-3 != 1 jump to next if else push NO
i
before theif(i is 0) call PRINT
is true, but your other is checking thei
before subtracting it and skipping over the prints. Pretty smart actually. Will continue implementing it.Python 3 ,
8582 byteCobalah online!
Python 3 ,
7976 byteJawaban Port of Keeta tentang Excel .
Cobalah online!
sumber
Perl 6 ,
6350 byteCobalah online!
Blok kode anonim yang mengambil nomor dan mengembalikan daftar baris
Penjelasan:
sumber
C (gcc) , 75 byte
Cobalah online!
C (gcc) , 60 + 11 = 71 byte (menggunakan
-D$=||puts(
)Cobalah online!
sumber
05AB1E (warisan) ,
272524 byteDisimpan 1 byte berkat Kevin Cruijssen .
Cobalah online!
Penjelasan
sumber
×
, tidak memikirkan hal itu!Θ
sekarang bahwa Anda tidak lagi menggunakan×
, karenaÏ
hanya akan melihat1
s saja, sehingga mengabaikan2
(dan0
tentu saja).Python 2 , 73 byte
Cobalah online!
sumber
Python 2 ,
979592908381 byteCobalah online!
-2 byte, terima kasih atas ovs
Python 3 ,
92908583 byteCobalah online!
-4 byte, terima kasih atas ovs
-4 bytes, thanks to Jo King
sumber
len(w)<3
->'N'in w
, 81 bytes :len(w)%2
->(w<'N')
Canvas, 27 bytes
Try it here!
sumber
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.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.
beforeprint
. It also provides some common utility methods, such as thistoLong()
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.
Try it online!
sumber
Retina 0.8.2 , 45 byte
Cobalah online! Penjelasan:
Konversikan input ke unary.
Untuk setiap bilangan bulat
0...n-1
, buat tiga baris teks, satu untuk setiap kata, masing-masing dengani
1
s sebelumnya, kecuali untukNo
, yang memiliki dua1
s tambahan sehingga kami menghitung(i+2)%3==0
yang setara dengani%3==1
.Hapus pasangan
1
sebelumB
.Hapus
1
s dalam kelompok tiga di tempat lain.Hapus semua baris yang masih memiliki a
1
.sumber
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!Java 10,
10099 byte-1 byte terima kasih kepada @ OlivierGrégoire .
Cobalah online.
Penjelasan:
sumber
++i%3>1
kemungkinan akan menghemat satu bytePowershell,
7574726766 byte-1 byte terima kasih TessellatingHeckler
Naskah uji dan penjelasan:
Keluaran:
Skrip langsung, 72 byte:
sumber
======
. It generatesYeah,But,No
strings only. The test script shows a separator for easier reading of the results only.(" Yeah\nBut No But Yeah But\nNo "*($j="$args")|% s*t 32)[1..$j]-ne''
Haskell , 71 byte
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 .:sumber
C # (Visual C # Interactive Compiler) ,
10599949689bytesCobalah online!
sumber
x++%3==1?
bisa++x%3>1?
. Orang lain hanya memberi tip untuk jawaban Java saya, tetapi hal yang sama berlaku untuk jawaban C # Anda. :)Pip ,
373533 byte(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:
dan output
a
elemen pertama menggunakan pengindeksan siklik.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):Seperti sebelumnya, hasil akhir disatukan dan dicetak secara otomatis.
sumber
Attache , 48 byte
Cobalah online!
Penjelasan
sumber
C (gcc) ,
7771747269 byteSudah 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)
Cobalah online!
sumber
j
menyelamatkan Anda dua byte.n-~-i
setara dengann-i+1
- bukani<n+1
- dan tidak benar-benar menyimpan byte ...Ruby, 69
7274BytesJawaban yang sangat mudah, memeriksa metode yang lebih pendek, rekursif sekarang.
Disimpan dua byte berkat @BWO :)
Menyimpan tiga byte lainnya dengan menggunakan simbol, bukan string
sumber
Python 3, 93 byte
Ini bukan solusi yang terbaik, tetapi saya mengambilnya.
Cobalah online!
sumber
R, 65 bytes
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 toc
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)sumber
sed -E,
179150 byteBagian 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
sumber
Bersih , 116 byte
Cobalah online!
sumber
F #,
108106 byteCobalah online!
-2 byte berubah dari
i=0 to p-1
kei=1 to p
dan menyesuaikan modulos. Terlepas dari itu, cukup mudah.sumber
v
fungsi untuk mencetak semuanya.i=1 to p
(dan sesuaikan moduli, secara alami). Rentang terbalik kosong. :)PHP,
6568 byteJalankan sebagai pipa dengan
-nR
atau coba online .sumber
VBA (Excel),
105, 101,99 BytesEdit: -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)
^ Ini disisipkan ke jendela Segera dan output ke jendela debug
Tidak disatukan
sumber
&
masingIIf(..)
- masing untuk tambahan 2 byteJelly , 22 byte
Tautan monadik yang menghasilkan daftar garis (yang tampaknya diizinkan dalam komentar)
Cobalah online! (catatan kaki menyebut Tautan menggunakan
Ç
dan bergabung dengan baris baru menggunakanY
sejak pencetakan implisit di Jelly menghancurkan segalanya bersama jika itu bisa)Bagaimana?
Catatan pertama yang kita miliki adalah periode2 × 3 = 6 karena definisi modulo.
Sekarang perhatikan bahwa enam nilai pertama adalah:
Jadi daftar garis yang dihasilkan harus nilai-nilai ini diulangi (atau terpotong) untuk panjang
n
bersama.Sekarang perhatikan bahwa set daya
"Yeah", "But", "No"
adalah:Jadi setiap periode adalah nilai-nilai 1-diindeks dari set daya
"Yeah", "But", "No"
: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) ...sumber
Python 2 ,
939283 byteCobalah online!
Besar 9 byte disimpan dengan berkat @Jonathan Frech
sumber
('','Yeah\n')[x%3<1]
setara dengan"Yeah\n"*(x%3<1)
.