Mencintai aku, tidak mencintaiku
Game anak-anak sederhana ini sudah tua, tetapi masih populer. Karena kita hidup di abad ke-21 sekarang, mari kita mendigitalkannya!
Spesifikasi
Program tidak boleh mengambil input, kecuali jika Anda menggunakan bahasa yang tidak dapat menghasilkan seed acak - dalam hal ini Anda diizinkan untuk mengambil seed sebagai input. Tugas Anda adalah menulis sebuah program yang akan menghasilkan secara acak total 3 hingga 20 baris inklusif: "Mencintai saya ..." dan "Mencintai saya tidak ..." secara bergantian, seperti dalam permainan (dan satu baris tambahan; pertahankan bacaan).
Namun, ada beberapa batasan. Setiap baris harus diikuti oleh baris baru. Baris pertama harus "Mencintai saya ...". Baris terakhir (baik "Loves me" atau "Loves me not") harus diakhiri dengan tanda seru atau satu titik. Setelah baris terakhir, Anda perlu menampilkan hati ( <3
) atau patah hati ( </3
) di baris baru, tergantung apakah "Mencintai saya!" atau "Tidak mencintaiku." adalah kalimat terakhir.
Trailing whitespace diizinkan.
Contoh Output
Keluaran:
Mencintai saya ...
Mencintai saya tidak ...
Mencintai saya ...
Mencintai saya tidak ...
Mencintai saya!
<3
Output lain:
Mencintai saya ...
Mencintai saya tidak ...
Mencintai saya ...
Mencintai saya tidak.
</ 3
Ini adalah kode-golf , sehingga entri terpendek menang!
Juga, tantangan pertama saya :) Semoga Sukses!
sumber
[3, 20)
) atau 3 hingga termasuk 20 ([3, 20]
)?Jawaban:
Pyth,
5453515048 bytesumber
%2tWZ"<</33
untuk pencetakan jantung menghemat 1. Tidak yakin ini adalah cara terbaik.%
.@".!"Z%hZ"</3
menghemat dua byteCJam,
535049 byteTerima kasih kepada Dennis untuk menghemat 1 byte.
Uji di sini.
Penjelasan
Kode hanya membuang string dalam potongan-potongan ke tumpukan, yang dicetak secara otomatis di akhir program:
sumber
Brainfuck, 2766 byte (saat ini tidak valid)
Hanya karena. Saya akan menambahkan versi yang tidak disunat nanti.
Kode
Kodesemu
Sampel
Saat dijalankan, program memasuki sesi interaktif menunggu input. Masukan harus berupa angka. Nomor ini digunakan sebagai benih.
Seed: 1 (angka acak 5, membutuhkan 218.168.042 operasi)
Seed: 3 (angka acak adalah 20, membutuhkan 463.253.048 operasi)
Saya sarankan agar Anda tidak melakukan seeded
6
, karena dibutuhkan2,105,900,375
iterasi untuk menghitung hasilnya :).Kompilasi / Menjalankan
Anda memerlukan penerjemah cepat untuk ini. Tidak ada juru bahasa online yang saya uji yang dapat menangani kecepatan eksekusi. Eips (iterasi per detik) harus lebih dari
100,000,000
. Jadi saya datang dengan solusi lain.Ini adalah kompiler Brainfuck to C yang ditulis dalam Brainfuck. Anda dapat menggunakan penerjemah online apa pun untuk mengubah kode saya menjadi murni C. Saya sarankan menggunakan brainfuck.tk . Tempel kode saya di input stdin, lewati kode ini di input kode:
Unduh sumber dan kompilasi:
Anda juga dapat menjalankan salinan kode C online di sini: via. CodingGround .
Optimalisasi
Masih ada beberapa pekerjaan yang harus dilakukan, tetapi penggunaan kembali sel hampir optimal.
Catatan
Anda dapat menggunakan kata atau frasa sebagai seed:
sumber
Javascript (ES6),
1191049998 bytesumber
new Date
trik dalam jawaban saya?Loves me not... Loves me... Loves me not! <3
danLoves me not... Loves me... Loves me not... Loves me. </3
. Saya pikir Anda harus mengubah salah satu syarat untuk memperbaikinya. EDIT: Oh, cukup alihkan''
dan' not'
di baris keempat.Python, 147
Menggunakan
from random import*
alih - alihimport random
danrandint
bukannyarandrange
menyimpan beberapa byte. Mungkin ada beberapa byte yang tersisa untuk golf.sumber
"LLoovveess mmee n o t"[i%2::2].strip()
tampaknya rumit tanpa perlu. Tidak bisakah kamu melakukannya"Loves me"+~i%2*" not"
?["Loves me","Loves me not"][i%2]
lebih optimal, karena Anda sekarang membuang-buang karakter.strip()
dan beberapa ruang. Tapi ya, gunakan kodeJavascript (ES6),
110102 byteIni adalah tantangan kecil pendek tapi menyenangkan. Dimungkinkan untuk mempersingkat lebih banyak. Terima kasih kepada Mwr247 untuk beberapa trik penghematan byte!
Versi alternatif menggunakan
repeat()
, 105 byte:Darn JS 5 + -char nama bawaan. Baiklah. Saran diterima!
sumber
18+3|0
?Math.random()
. Kira itu tidak perlu sekarang.Perl, 85
sumber
Ruby, 91 byte
sumber
Common Lisp
106104 bytesIni hanya bekerja pada lisps yang tidak memeriksa urutan yang tepat (misalnya cmucl, sbcl, clisp) ccl akan memeriksa bundar dan kesalahan pada tingkat keamanan standar. ECL akan berulang selamanya.
Penjelasan:
#1=(1 0 . #1#)
menghasilkan daftar bundar yang mengandung1
dan0
dansubseq
digunakan untuk membuat daftar panjang [3,20] (ini adalah satu-satunya bagian non-portabel, karenasubseq
hanya diperlukan oleh standar untuk bekerja pada daftar yang tepat (yaitu non-lingkaran)).Format kami sekarang beroperasi pada daftar
1 0 1 0...
panjang [3,20]Penjelasan
format
arahan:~{
mengulangi daftar ini~[
diikuti oleh sejumlah~;
dan diakhiri dengan~]
akan memilih item ke-N, berdasarkan nilai argumen format. Ini digunakan di sini sehingga item pertama dalam kasus~[
akan menjadi "tidak mencintaiku" kasus dan yang kedua kasus "mencintaiku". Perhatikan bahwa dengan~[
pemisah~:;
memilih kasing standar.~#[
berfungsi seperti~[
kecuali argumen adalah jumlah argumen yang tersisa. 0 argumen yang tersisa berarti kita pada akhirnya, huruf default adalah mencetak...
~:*
mencadangkan daftar argumen satu posisi, yang memungkinkan kita untuk mencetak trailer yang benar.sumber
Julia, 98 byte
Tidak Disatukan:
sumber
UNIX shell, 193 byte
sumber
Java,
210209203200177 bytemembaliki%2==0
kei%2<1
{ ... }
kawat gigi untukfor
-loop, pindahe
deklarasi loopRandom
penggunaan ulang dan penambahan untuki
Catatan: baris baru ditambahkan di bawah ini untuk pemformatan di situs ini, hitungan di atas adalah untuk satu baris.
Tidak Disatukan:
sumber
main()
...C,
123, 121, 109106 karakter (108 byte)(dengan sedikit kecurangan ♥♥♥ ♥♥♥)
Ada juga titik Unicode yang patah hati pada 1f494, tapi saya kesulitan menemukan font yang mengimplementasikannya.
sumber
O=0
, karenaC
inisialisasi otomatis ke0
?main(o,O)
mana harus diinisialisasi.time
angka acak ... Pintar!srand(time(0))
akan mengubah jawaban mereka dengan frekuensi yang sama. Srand benar-benar tidak berguna :-)Python 2,
161159156144 byteIni 39 byte hanya untuk mendapatkan nomor acak.
Terima kasih banyak untuk muddyfish , fryamtheeggman , dan orlp atas bantuan mereka.
PYG , 109 byte
sumber
import random as r
print'</3'if i%2 else'<3'
untukprint['<3','</3'][i%2]
menyimpan 3 byte.import random as r;a=r.randrange(3,21)
danimport random;a=random.randrange(3,21)
panjangnya sama.PowerShell,
121119111 BytesSunting - sebenarnya lebih pendek untuk secara eksplisit menyertakan
"Loves me"
daripada mendeklarasikan$l
Edit2 - lupa bahwa saya dapat melakukan
for()
loop golf dengan pipelining ... selama ...Tidak terlalu buruk. Menggunakan blok eksekusi kode sebaris
$(...)
untuk menyesuaikan string yang dicetak secara dinamis saat kamifor()
-looping. Perhatikan bahwa karena ini menggunakan implisitGet-
di depanRandom
untuk menyimpan beberapa byte, ini dapat beroperasi sangat lambat pada versi PowerShell tertentu. ReferensiDiperluas di bawah ini untuk klarifikasi:
sumber
C ++,
210193184168 byteDi C ++ .. karena .. Kenapa tidak? :)
Hidup:
210193184168Semoga saja perubahan saya tidak tergantung platform.
Terima kasih kepada Ben Voigt untuk bantuannya. Juga, terima kasih untuk semua komentar, mereka sangat membantu.
sumber
j=3+(int)(rand()*17.0/RAND_MAX)
#define c cout
danusing namespace std;
denganauto&c=std::cout;
int i=0,j=rand()*20.0/RAND_MAX;while(i<j)
Groovy, 110 byte
Jenis cinta yang asyik:
sumber
Python 2, 117 byte
Perhatikan bahwa setiap
Loves me( not)?
diikuti oleh...
dan baris baru, kecuali yang terakhir. Jadi ini sepertinya pekerjaanjoin
.sumber
".!\n\n<</33"[n%2::2]
2 byte lebih pendek.R,
141132128114111109 byteKode
Tidak disatukan
Saya telah mengambil beberapa inspirasi dari kode Eric Brooks .
Sunting 1: Sekarang kode dengan benar mengeluarkan tanda baca terakhir seperti yang ditunjukkan oleh Martin
Sunting 2: Mengubah for for loop menjadi sapply dan memasukkan hati di dalam string baris terakhir.
Sunting 3: Menghapus
{}
dan mengubah+(x==k)*2
ke+2*!x<k
Sunting 4: Kembali ke untuk loop dan menghapus
()
dari(i%%2)+1
Sunting 5: Menulis
me
4 kali dan menghapussep=""
sumber
R,
119111105 byteSuntingan 1,2: Pengodean dua opsi secara eksplisit menghemat ruang.
sumber
=
untuk tugas alih-alih<-
dan yang lain dengan melakukanx%%2>0
di tempatx%%2==1
. Perhatikan juga bahwa ini tidak menangani baris terakhir dengan benar; harus ada.
atau!
lebih daripada...
. (Lihat contoh keluaran dalam pertanyaan.)x%%2>0
; hanyax%%2
C 226 byte
(Dengan pemformatan)
sumber
Python 2, 115 byte
sumber
PHP,
191187146165 BytesTidak Disatukan:
48,49 byte untuk pyth dan cjam ... wow :)
sumber
mSL,
178176156154 byteSunting 1: Diubah
== 0
menjadi< 1
Sunting 2: Menghapus spasi yang tidak perlu, terima kasih AlexA!
Sunting 3: Tanda kurung dihapus
sumber
Perl, 97 byte
Versi yang dapat dibaca:
sumber
Hassium , 265 Bytes
Jawabannya sudah golf.
sumber
</3
.rnd = new Random();rnd.next(0,2);
1000 kali, distribusinya OK. Namun, jika saya mengeksekusirnd = new Random();
sekali danrnd.next(0,2);
1000 kali, saya selalu mendapatkan persis 5330
s dan 4671
s.C # (160)
Kode ini terinspirasi oleh jawaban dari hjk , kredit jatuh kepadanya.
Tidak Disatukan:
sumber
Lua,
137132 byteMungkin bisa bermain golf lebih banyak, tetapi ini dia untuk saat ini:
Penjelasan kode dan ungolfed:
Sunting: Memotong sebagian spasi putih.
sumber
Jelly , 55 byte (tidak bersaing?)
Cobalah online!
Seperti biasa Jelly mengisap dengan string.
sumber
PowerShell ,
8588 byte+3 byte terima kasih Veskah: Itu poin yang bagus.
Cobalah online!
sumber
of *3* to 20 lines inclusive
. Terima kasih!