Mencintai saya, tidak mencintai saya

45

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 , sehingga entri terpendek menang!

Juga, tantangan pertama saya :) Semoga Sukses!

MatthewRock
sumber
Apakah ada batasan pada distribusi jumlah garis, yaitu, apakah harus acak acak, atau apakah itu cukup bahwa semua panjang antara 3 dan 20 memiliki probabilitas positif?
Zgarb
Saya tidak memikirkan hal ini, tetapi saya akan mengatakan bahwa distribusi apa pun baik-baik saja - jadi mereka tidak harus acak secara seragam.
MatthewRock
Apakah 3 hingga 20 ( [3, 20)) atau 3 hingga termasuk 20 ( [3, 20])?
orlp
1
@MatthewRock Bagaimana jika bahasa yang ingin kita gunakan tidak dapat membuat nomor acak sendiri? Bisakah pengguna menyediakan seed secara acak?
mınxomaτ
3
@ minxomat Apapun, itu hanya permainan. Ayo, ubah aturannya.
MatthewRock

Jawaban:

23

Pyth, 54 53 51 50 48 byte

pj+*3\.bm+W~!Z"Loves me"" not"+3O18@".!"Z%hZ"</3
orlp
sumber
%2tWZ"<</33untuk pencetakan jantung menghemat 1. Tidak yakin ini adalah cara terbaik.
FryAmTheEggman
@FryAmTheEggman Membuatnya menghemat dua.
orlp
Menggabungkan dua string terakhir bersama-sama menghemat satu lagi, tetapi saya harus kembali ke saya %.
FryAmTheEggman
@".!"Z%hZ"</3menghemat dua byte
Jakube
Karena tidak ada entri selama beberapa hari, saya menerima jawaban ini. Selamat!
MatthewRock
23

CJam, 53 50 49 byte

Terima kasih kepada Dennis untuk menghemat 1 byte.

Imr3+{"Loves me"X!:X" not"*'.3*N}*&"!."X=N'<'/X*3

Uji di sini.

Penjelasan

Kode hanya membuang string dalam potongan-potongan ke tumpukan, yang dicetak secara otomatis di akhir program:

Imr3+         e# Generate a random number in [3,20]
{             e# Execute this block that many times.
  "Loves me"  e#   Push "Loves me", we always need that.
  X!:X        e#   Toggle X (initially 1) between 0 and 1 and leave it on the stack.
  " not"*     e#   Repeat " not" that many times, removing it on every other line.
  '.3*N       e#   Push "..." and a newline.
}*
&             e# Set intersection of "..." and newline, turning them into an empty array.
"!."X=        e# Select "!" or "." based on the last value of X.
N'<           e# Push a newline and "<".
'/X*          e# Include "/" or not depending on the last value of X.
3             e# Push a 3.
Martin Ender
sumber
orang bisa membayangkan CJam akan dikembangkan secara eksklusif untuk kode-golf ^^
larkey
11
@larkey tapi itu ...
MatthewRock
@larkey CJam berasal dari GolfScript, dan GolfScript (seperti namanya) yang dirancang untuk bermain golf.
Chris Jester-Young
@ ChrisJester-Young itu agak
menjengkelkan
17

Brainfuck, 2766 byte (saat ini tidak valid)

Hanya karena. Saya akan menambahkan versi yang tidak disunat nanti.

Kode

>+<+[>[>[-]+<-]>[<+>>+[->,----------[<+>[>>>>>>>>>+<<<<<<<<<-]>>>>>>>>>[>+<<<<<<<<<<+>>>>>>>>>-]<<<<<<<<<[>>>>>>>>>+<<<<<<<<<-]]<]<-]>>>>>>>>>>>>>>[<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>-]<<<<<<<<<<<<<<<[>[-]+<-]>[<+>>>>>>>>>>>>[<<<<<<<<<<+>>>>>>>>>>-]>[<<<<<<<<<<+>>>>>>>>>>-]<<<<<<<<+++++++[<+++++++++++>-]<[<<[>>>>>>>>>>+<<<<<<<+<<<-]>>>[<<<+>>>-]<<[>>>>>>>>>+<<<<<<<+>+<<<-]>>>[<<<+>>>-]<[>>>>>>>>+[<<<<<<<+>+>>>>>>-]<<<<<<[>>>>>>+<<<<<<-]+<[>-<[-]]>[>>>>>+<<<<<-]<<-]<-]++++++[>++++++++<-]>-[<<[>>>>>>>>>+<<<<<<<<+<-]>[<+>-]>-]<<<[-]>[-]+++++[<+++++>-]<[>>>>>>>>>>>+[<<<<<<<<<<+>+>>>>>>>>>-]<<<<<<<<<[>>>>>>>>>+<<<<<<<<<-]+<[>-<[-]]>[>>>>>>>>+<<<<<<<<-]<<-]++++++[>>>>>>>>>>+++++++++<<<<<<<<<<-]>>>>>>>>>>[<<+<<<<<<<<+>>>>>>>>>>-]<<<<<<<<<<[>>>>>>>>>>+<<<<<<<<<<-]>>>>>>>[-]>[<+<<<<<<<+>>>>>>>>-]<<<<<<<<[>>>>>>>>+<<<<<<<<-]>>>>>>>>>[-]++++++++++++++++++++<<[<<<+>>>-]>>[<<<<<<<<+>+<<+>>>>>>>>>-]<<<<<<<<<[>>>>>>>>>+<<<<<<<<<-]>>[>>[<+<<<+>>>>-]<<<<[>>>>+<<<<-]+>>>[<<->>>-<<<<->>>[-]]<<<[>>[-]+<<-]>>-]>>[>>>-<<<[-]]<<<[-]>>>>>>>>[-]<[>+<<<<<<<<<+>>>>>>>>-]<<<<<<<<[>>>>>>>>+<<<<<<<<-]>>>>>>>>>>>>[-]+++<<<[<<<<<+>>>>>-]>>>[<<<<<<<<<<<+>+<<+>>>>>>>>>>>>-]<<<<<<<<<<<<[>>>>>>>>>>>>+<<<<<<<<<<<<-]>>[>>[<+<<<+>>>>-]<<<<[>>>>+<<<<-]+>>>[<<->>>-<<<<->>>[-]]<<<[>>[-]+<<-]>>-]<[>>>>>>>>-<<<<<<<<[-]]>>>[-]>>>[<<<<<<<+>>>>>>>-]<<<<<<<[>>>>>>>-<<<<<<<[-]]>>>>>>>>>[<<<<<<<<<+>+>>>>>>>>-]<<<<<<<<[>>>>>>>>+<<<<<<<<-]<[>>>>>>>[-]-<<<<<<<[-]]>>>>>>>[>>>>>>+<<<<<<<<<<<<<<<->>>>>>>>>[-]]<<<<<<<<-]>>>>>>>>>>>>>>>[<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>-]<<<<<<<<<<<<<<<<[>[-]+<-]>[<+>>+++++++++++[>+++++++>++++++++++>+++++++++>+++>++++<<<<<-]>-.>+.+++++++.>++.<---.>>-.<<------.>.>>++...[-]<[-]<[-]<[-]<[-]<++++++++++.[-]>>>>>>>[-]>[<+<<<<<<<+>>>>>>>>-]<<<<<<<<[>>>>>>>>+<<<<<<<<-]>>>>>>>->[-]<[>+<-][-]>[<+<<<<<<<+>>>>>>>>-]<<<<<<<<[>>>>>>>>+<<<<<<<<-]>>>>>>>>>[-]<<[<<<<<<+>>>>>>-]->>[<<<<<<<<-<+>>>>>>>>>-]<<<<<<<<<[>>>>>>>>>+<<<<<<<<<-]>[>>>>>>+<<<<<<[-]]<->>>>>>>[<<<<<<<->>>>>>>-]<<<<<<<[>>>>>>>+<<<<<<<-]>>>>>>>[>>>>>>>>+<<<<<<<<<<<<<<<<<->>>>>>>>>[-]]<<<<<<<<-]<[>[-]+<-]>[<+>>++++++[>++++++++++<-]>.---------.[-]<<<-<->>-]>>>>>>>>>>>>>>>>[<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>>>>>>-]<<<<<<<<<<<<<<<<<[>[-]+<-]>[<+>>+++++++++++[>+++++++>++++++++++>+++++++++>+++>++++<<<<<-]>-.>+.+++++++.>++.<---.>>-.<<------.>.>.<<+.+.+++++.>>>++...[-]<[-]<[-]<[-]<[-]<++++++++++.[-]>>>>>>>[-]>[<+<<<<<<<+>>>>>>>>-]<<<<<<<<[>>>>>>>>+<<<<<<<<-]>>>>>>>->[-]<[>+<-][-]>[<+<<<<<<<+>>>>>>>>-]<<<<<<<<[>>>>>>>>+<<<<<<<<-]>>>>>>>>>[-]<<[<<<<<<+>>>>>>-]->>[<<<<<<<<-<+>>>>>>>>>-]<<<<<<<<<[>>>>>>>>>+<<<<<<<<<-]>[>>>>>>+<<<<<<[-]]<->>>>>>>[<<<<<<<->>>>>>>-]<<<<<<<[>>>>>>>+<<<<<<<-]>>>>>>>[>>>>>>>+<<<<<<<<<<<<<<<<->>>>>>>>>[-]]<<<<<<<<-]<[>[-]+<-]>[<+>>++++++[>++++++++++<-]>.-------------.++++.<<<<->>-]<<]

Kodesemu

loop
    get a random byte
until random byte is >2 and <21

point to byte
[
    output "Loves me..."
    decrease byte by 1
    if byte is 0
        output "<3"
        exit
    eif
    output "Loves me not..."
    decrease byte by 1
]
output "</3"

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)

1              
Loves me...    
Loves me not...
Loves me...    
Loves me not...
Loves me...    
<3             

Seed: 3 (angka acak adalah 20, membutuhkan 463.253.048 operasi)

3
Loves me...
Loves me not...
(...)
Loves me...
Loves me not...
</3

Saya sarankan agar Anda tidak melakukan seeded 6, karena dibutuhkan 2,105,900,375iterasi 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:

gcc.exe -c main.c -o main.o
gcc.exe main.o -o loveme.exe

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:

Programming Puzzles & Code Golf
Loves me...
Loves me not...
Loves me...
Loves me not...
Loves me...
Loves me not...
Loves me...
Loves me not...
Loves me...
Loves me not...
Loves me...
Loves me not...
Loves me...
Loves me not...
Loves me...
Loves me not...
Loves me...
<3
mınxomaτ
sumber
3
+1 karena memiliki keberanian untuk menulis PRNG di Brainfuck ...
AdmBorkBork
@TimmyD Ada cara yang lebih baik untuk menulis PRNG di BF, tetapi kebanyakan dari mereka berdasarkan waktu (menjalankan program, dan menghentikan eksekusi di beberapa titik, kemudian membaca memori), tetapi itu akan memerlukan interaksi pengguna dan dua program terpisah, yang bertentangan dengan aturan.
mınxomaτ
3
Kodesemu yang bagus. Lebih banyak orang harus melakukan itu, terutama karena setengah bahasa golf pada dasarnya tidak dapat dibaca jika Anda tidak mengetahuinya.
The_Basset_Hound
3
Sayangnya output Anda salah. Terakhir "Loves me" harus diakhiri dengan tanda seru (jadi, "Loves me!"), Dan "Loves me not" harus diakhiri dengan satu titik ("Loves me not.").
MatthewRock
1
Bisakah kita memiliki pseudocode RNG?
Beta Decay
7

Javascript (ES6), 119 104 99 98 byte

for(i=new Date%18+3,s=i&1?`!
<3`:`.
</3`;i--;)s=`...
Loves me`+(i&1?' not':'')+s
alert(s.slice(4))
Mwr247
sumber
Bagus Mungkin lebih pendek untuk menggunakan penggabungan string untuk menciptakan hati, dan mungkin dalam penciptaan setiap baris. Keberatan jika saya menggunakan new Datetrik dalam jawaban saya?
ETHproduksi
@ ETHproductions Pergi untuk itu, selama Anda baik-baik saja dengan saya menggunakan hati-hati itu haha ​​(dan mengapa saya tidak menggunakan peringatan ... untuk beberapa alasan saya meyakinkan diri saya bahwa fungsi panah akan lebih pendek, tetapi perlu kembali meniadakan itu .. .). Saya sebenarnya baru saja turun ke 104 sekarang dengan beberapa trik lain juga =)
Mwr247
Sial ... pekerjaan bagus :) Saya terus menata ulang milik saya, tetapi selalu berakhir pada 104.
ETHproduksi
Terobosan bagi saya adalah menggabungkan variabel panjang / iterasi dengan menggabungkan ke belakang, dan mendefinisikan hati dalam inisialisasi. Saya mencobanya beberapa waktu lalu dengan sedikit penghematan, tetapi penyederhanaan hati Anda membuatnya jauh lebih efisien.
Mwr247
Tunggu sebentar ... Mencoba ini, saya mengerti Loves me not... Loves me... Loves me not! <3dan Loves 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.
ETHproduksi
6

Python, 147

from random import*;t=randint(3,20)
print"\n".join("LLoovveess  mmee  n o t"[i%2::2].strip()+"..."*(i<t-1)for i in range(t))+"!.\n\n<<3/ 3"[t%2::2]

Menggunakan from random import*alih - alih import randomdan randintbukannya randrangemenyimpan beberapa byte. Mungkin ada beberapa byte yang tersisa untuk golf.

Loovjo
sumber
3
Pergantian "LLoovveess mmee n o t"[i%2::2].strip()tampaknya rumit tanpa perlu. Tidak bisakah kamu melakukannya "Loves me"+~i%2*" not"?
xnor
Bahkan ["Loves me","Loves me not"][i%2]lebih optimal, karena Anda sekarang membuang-buang karakter .strip()dan beberapa ruang. Tapi ya, gunakan kode
xnor
6

Javascript (ES6), 110 102 byte

a='';for(i=j=new Date%18+3;i--;)a+='Loves me'+(j-i&1?'':' not')+(i?`...
`:j&1?`!
<3`:`.
</3`);alert(a)

Ini 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:

a='';for(i=j=new Date%18+3;i;)a+='Loves me'+' not'.repeat(j-i--&1)+(i?`...
`:j&1?`!
<3`:`.
</3`);alert(a)

Darn JS 5 + -char nama bawaan. Baiklah. Saran diterima!

Produksi ETH
sumber
Kondensasi yang mengesankan. Saya penasaran, mengapa 18+3|0?
Mwr247
@ Mwr247 Oh, ya, itu sejak saya menggunakannya Math.random(). Kira itu tidak perlu sekarang.
ETHproduksi
5

Perl, 85

print$_?'...
':'','Loves me',$c=$_%2?' not':''for 0..3+rand 18;print$c?'.
</3':'!
<3'
Dom Hastings
sumber
5

Ruby, 91 byte

(n=3+rand(18)).times{|i|puts"Loves me"+[""," not"][i%2]+(i<n-1?"...":i%2>0?".
</3":"!
<3")}
daniero
sumber
5

Common Lisp 106 104 bytes

(format t"~{Loves me~[ not~]~#[~:*~[.~%</~;!~%<~]3~:;...~]~%~}"(subseq'#1=(1 0 . #1#)0(+ 3(random 18))))

Ini 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 mengandung 1dan 0dan subseqdigunakan untuk membuat daftar panjang [3,20] (ini adalah satu-satunya bagian non-portabel, karena subseqhanya 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 formatarahan:

~{ 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.

Jason
sumber
1
Ini adalah upaya kelompok oleh saluran IRC #lisp. Banyak terima kasih kepada phf untuk format-string yang cerdas dan peretasan subseq.
Jason
4

Julia, 98 byte

r=rand(3:20)
for i=1:r println("Loves me"*(i%2>0?" not":"")*(i<r?"...":i%2>0?".\n</3":"!\n<3"))end

Tidak Disatukan:

# Define a random number 3 ≤ r ≤ 20
r = rand(3:20)

for i = 1:r
    # The loveless lines occur when i is even
    println("Loves me" *
            (i % 2 > 0 ? " not" : "") *
            (i < r ? "..." : i % 2 > 0 ? ".\n</3" : "!\n<3"))
end
Alex A.
sumber
4

UNIX shell, 193 byte

t=$(seq 2 19|shuf|head -1)
l=t
p=...
while [ $t -ge 0 ];do
case $l:$t in t:0)p=!;h=\<3;;f:0)p=.;h=\</3;;esac
case $l in t)l=f;n=;; f)l=t;n=\ not;;esac
t=$((t-1))
echo Loves me$n$p
done
echo $h
Alois Mahdal
sumber
4

Java, 210 209 203 200 177 byte

  • membalik i%2==0kei%2<1
  • dipangkas { ... }kawat gigi untuk for-loop, pindah edeklarasi loop
  • memesan kembali kondisional
  • menghapus pengubah dan tanda kurung yang tidak perlu, Randompenggunaan ulang dan penambahan untuki

Catatan: baris baru ditambahkan di bawah ini untuk pemformatan di situs ini, hitungan di atas adalah untuk satu baris.

class F{public static void main(String[]a){for(int e=3+(int)(Math.random()*18),i=0;++i<=e;)
System.out.println("Loves me"+(i%2>0?i<e?"...":"!\n<3":" not."+(i<e?"..":"\n</3")));}}

Tidak Disatukan:

class F {
    public static void main(String[] a) {
        for (int e = 3 + (int) (Math.random() * 18), i = 0; ++i <= e; )
            System.out.println("Loves me" + (i % 2 > 0 ? i < e ? "..." : "!\n<3"
                    : " not." + (i < e ? ".." : "\n</3")));
    }
}
hjk
sumber
1
Anda dapat menyimpan 13 byte dengan menghapus publik.
Luminous
@ Luminous Aku masih harus menyimpan satu untuk main()...
hjk
@TimmyD Aku yang kedua.
RK.
4

C, 123, 121, 109 106 karakter (108 byte)

(dengan sedikit kecurangan ♥♥♥ ♥♥♥)

O;main(o){for(o=time(O)%18+3;o-O++;printf("Loves me%s%s\n",O&1?"":" not",o-O?"...":O%2?"!\n♥":".\n</3"));}

Ada juga titik Unicode yang patah hati pada 1f494, tapi saya kesulitan menemukan font yang mengimplementasikannya.

Jens
sumber
Ini menunjukkan 120 karakter dan 122 byte ...
AdmBorkBork
1
Saya tidak berpikir Anda perlu O=0, karena Cinisialisasi otomatis ke 0?
FryAmTheEggman
@FryAmTheEggman Bagus temukan! Dalam versi sebelumnya saya memiliki O di main(o,O)mana harus diinisialisasi.
Jens
Bagus saya suka itu! Saya tidak berpikir untuk menggunakan timeangka acak ... Pintar!
MatthewRock
@ MatthewRock Jika Anda memikirkannya, semua program lain yang menggunakan srand(time(0))akan mengubah jawaban mereka dengan frekuensi yang sama. Srand benar-benar tidak berguna :-)
Jens
4

Python 2, 161 159 156 144 byte

from random import*;a=randrange(3,21)
for i in range(a):print'Loves me'+i%2*' not'+('...'if i!=a-1 else'.'if i%2 else'!')
print['<3','</3'][i%2]

Ini 39 byte hanya untuk mendapatkan nomor acak.

Terima kasih banyak untuk muddyfish , fryamtheeggman , dan orlp atas bantuan mereka.

PYG , 109 byte

a=RR(3,21)
for i in R(a):P('Loves me'+i%2*' not'+('...'if i!=a-1 else'.'if i%2 else'!'))
P(['<3','</3'][i%2])
Celeo
sumber
Anda dapat melakukan pernyataan rentang dalam satu baris. Anda juga dapat melakukannyaimport random as r
Biru
Anda juga dapat memasukkan konten pernyataan cetak terakhir ke baris di atas.
Biru
Saya pikir Anda dapat mengubah print'</3'if i%2 else'<3'untuk print['<3','</3'][i%2]menyimpan 3 byte.
Kade
Ya memang saya bisa; Terima kasih!
Celeo
Terima kasih! Menariknya, import random as r;a=r.randrange(3,21)dan import random;a=random.randrange(3,21)panjangnya sama.
Celeo
3

PowerShell, 121 119 111 Bytes

$i=2..19|Random;1..$i|%{"Loves me$(if(!($_%2)){" not"})..."};"Loves me$(if(!($i%2)){"!`n<"}else{" not.`n</"})3"

Sunting - 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 kami for()-looping. Perhatikan bahwa karena ini menggunakan implisit Get-di depan Randomuntuk menyimpan beberapa byte, ini dapat beroperasi sangat lambat pada versi PowerShell tertentu. Referensi

Diperluas di bawah ini untuk klarifikasi:

# Create a collection of (2,3,4,...18,19) and pipe it as input to Get-Random
$i = 2..19 | Get-Random

# Create a collection of (1,2,...$i-1,$i) and pipe it to seed a ForEach-Object loop
1..$i | ForEach-Object {
  if(!($_%2)) {
    # If the input number is even, we're on an even line
    Write-Output "Loves me not..."
  }
  Else {
    # The input number is odd
    Write-Output "Loves me..."
  }
}
If(!($i%2)) {
  # Our random number is odd
  Write-Output "Loves me!"
  Write-Output "<3"
}
Else {
  # Our random number is even
  Write-Output "Loves me not."
  Write-Output "</3"
}
AdmBorkBork
sumber
3

C ++, 210 193 184 168 byte

Di C ++ .. karena .. Kenapa tidak? :)

#include <iostream>
main(){auto&c=std::cout;srand(time(0));int i,j=3+rand()%18;while(i++<j)c<<"Loves me"<<(i%2?"":" not")<<(i==j?"":"...\n");c<<(j%2?"!\n<3":".\n</3");}

Hidup: 210 193 184 168

Semoga saja perubahan saya tidak tergantung platform.

Terima kasih kepada Ben Voigt untuk bantuannya. Juga, terima kasih untuk semua komentar, mereka sangat membantu.

wendelbsilva
sumber
Humn .. baru sadar 3 sampai 20. Saya akan memperbaikinya nanti. Mungkin akan menambah 2 byte lagi ...j=3+(int)(rand()*17.0/RAND_MAX)
wendelbsilva
Anda dapat menghemat banyak dengan mengganti #define c coutdan using namespace std;denganauto&c=std::cout;
Ben Voigt
Simpan juga denganint i=0,j=rand()*20.0/RAND_MAX;while(i<j)
Ben Voigt
Halo, temukan bug: Baris terakhir adalah "Loves me!", Bukan "Loves me."
MatthewRock
1
Saya akan mengatakan tidak apa-apa - C dan C ++ serupa. Dan sekarang kode ini lebih panjang dari Jawa ...
MatthewRock
3

Groovy, 110 byte

Jenis cinta yang asyik:

int r=Math.random()*18;print((0..r+2).collect{"Loves me"+" not"*(it%2)}.join('...\n')+['!\n<3','.\n</3'][r%2])
Christoph Leuzinger
sumber
2

Python 2, 117 byte

from random import*
n=randint(3,20)
print"...\n".join("Loves me"+i%2*" not"for i in range(n))+[".\n</3","!\n<3"][n%2]

Perhatikan bahwa setiap Loves me( not)?diikuti oleh ...dan baris baru, kecuali yang terakhir. Jadi ini sepertinya pekerjaan join.

DLosc
sumber
Agak terlambat tetapi ".!\n\n<</33"[n%2::2]2 byte lebih pendek.
FryAmTheEggman
@FryAmTheEggman Ya, saya memang melihat itu tetapi memutuskan untuk tidak mencurinya dari Loovjo. Sementara itu, orang lain telah memposting persis solusi itu. [mengangkat bahu]
DLosc
Saya tidak melihat ada orang lain yang mempostingnya, tetapi saya cukup yakin komentar saya adalah yang pertama, sehingga Anda dapat menggunakannya jika Anda mau: P
FryAmTheEggman
2

R, 141 132 128 114 111 109 byte

Kode

k=sample(3:23,1);for(i in 1:k)cat("Loves",c("me not...\n","me...\n","me not.\n</3","me!\n<3")[1+i%%2+2*!i<k])

Tidak disatukan

k <- sample(3:23, 1)        # Generates random "k" number from 3 to 23
for(i in 1:k) {             # Loop this block increasing i from 1 until k by 1
  cat                       # Concatenate and paste everything inside this block
  ("Loves",                 # Push "Loves" on every iterations of the loop
      c(                    # Create a vector of strings
        "me not...\n",      # Push string to the index "1" of vector
        "me...\n",          #   to the index "2"
        "me not.\n</3",     #   to the index "3"
        "me!\n<3"           #   to the index "4"
        )[1+i%%2            # Subset the vector by the index (1 or 2)
          +2*!i<k])}        #   if final iteration of loop then index += 2 (3 or 4)

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)*2ke +2*!x<k
Sunting 4: Kembali ke untuk loop dan menghapus ()dari (i%%2)+1
Sunting 5: Menulis me4 kali dan menghapussep=""

Mutador
sumber
1

R, 119 111 105 byte

x<-sample(3:20,1);cat(rep(c("Loves me...\n","Loves me not...\n"),x)[1:x]);cat(ifelse(x%%2==1,"<3","</3"))

Suntingan 1,2: Pengodean dua opsi secara eksplisit menghemat ruang.

Eric Brooks
sumber
1
Anda dapat menyimpan byte dengan menggunakan =untuk tugas alih-alih <-dan yang lain dengan melakukan x%%2>0di tempat x%%2==1. Perhatikan juga bahwa ini tidak menangani baris terakhir dengan benar; harus ada .atau !lebih daripada .... (Lihat contoh keluaran dalam pertanyaan.)
Alex A.
1
@Alex A. Anda juga tidak perlu x%%2>0; hanyax%%2
Flounderer
Poin yang bagus, terima kasih. Saya harus kembali dan memperbaiki akhirnya
Eric Brooks
1

C 226 byte

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void main(){srand(time(NULL));int i=rand()%18+3;int j;for(j=0;j<i;j++)printf("Loves me%s%s\n",(j%2)?" not":"",(j==i-1)?(j%2)?".":"!":"...");printf("<%s3\n",(j%2)?"":"/");}

(Dengan pemformatan)

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    srand(time(NULL));
    int i = rand()%18 + 3;
    int j;
    for (j = 0; j < i; j++)
        printf("Loves me%s%s\n", (j % 2) ? " not" : "", (j==i-1) ? (j % 2) ? "." : "!" : "...");
    printf("<%s3\n", (j%2) ? "" : "/");
    return 0;
}
tonysdg
sumber
1
Hapus tipe return dari main (-5 bytes), buat i dan j global dengan tipe default (-8 bytes, -3 lebih karena default 0 in j), gunakan 0 bukan NULL (-3). Hal-hal lain - gunakan hanya satu variabel dan buat loop menghitung mungkin. Impor stdio biasanya tidak diperlukan saat bermain golf.
aragaer
1

Python 2, 115 byte

from random import*
n=randint(2,20)
print'...\n'.join('Loves me'+i%2*' not'for i in range(n))+'.!\n\n<</33'[n%2::2]
SimonPJ
sumber
1

PHP, 191 187 146 165 Bytes

$x=rand(5,22);for($i=2;++$i<=$x;){echo"\nLoves me";if($i%2<1)echo" not";if($i<$x)echo"...";if($i==$x&&$i%2<1){echo".\n</3\n";}elseif($i==$x&&$i%2>0){echo"!\n<3\n";}}

Tidak Disatukan:

$x=rand(5,22);
for($i=2;++$i<=$x;){
    echo "\nLoves me";
    if($i%2<1) echo " not";
    if($i<$x) echo "...";
    if($i==$x && $i%2<1){
        echo ".\n</3\n";
    }
    elseif($i==$x && $i%2>0){
        echo "!\n<3\n";
    }
}

48,49 byte untuk pyth dan cjam ... wow :)

Marek Bettman
sumber
Mengubah $ i% 2 == 0 menjadi $ i% 2 <1 (x2) dan $ i% 2! = 0 ke $ i% 2> 0 (x2)
Marek Bettman
Ternyata operator ternary bukan jawaban terbaik setiap saat :)
Marek Bettman
1

mSL, 178 176 156 154 byte

Sunting 1: Diubah == 0menjadi < 1
Sunting 2: Menghapus spasi yang tidak perlu, terima kasih AlexA!
Sunting 3: Tanda kurung dihapus

alias l {
var %n 1
while %n <= $rand(3,20) {
var %m $+(Love me,$iif($calc(%n % 2) < 1,$chr(32) $+ not),...)
echo %m
inc %n
}
echo $iif(n isin %m,</3,<3)
}
Denny
sumber
1
Solusi Anda saat ini 176 byte, bukan 177. Apakah semua ruang putih diperlukan? Jika tidak, Anda dapat mempersingkat kode Anda dengan jumlah yang signifikan hanya dengan menghapus spasi yang tidak dibutuhkan.
Alex A.
@AlexA. Oh tidak tahu mengapa saya menulis 177, dan terima kasih telah menunjukkan perlunya spasi putih, itu memang tidak diperlukan!
Denny
1

Perl, 97 byte

$_='She loves me...
'x(3+rand 18);s/(me.*?)me/$1me not/gs;s/e...
$/e!
<3/;s/t...
$/t.
<\/3/;print

Versi yang dapat dibaca:

$_="She loves me...\n"x(3+rand 18);
s/(me.*?)me/$1me not/gs;
s/e...$/e!\n<3/;
s/t...$/t.\n<\/3/;
print
bopjesvla
sumber
1

Hassium , 265 Bytes

func main(){rnd=new Random();times=rnd.next(3,21);println("Loves me...");for(x=0;x<times-1;x++){if(x%2==0)println("Loves me not...");else println("Loves me...");}if((times-1)%2==0){println("Loves me not.");println("</3");}else{println("Loves me!");println("<3");}}

Jawabannya sudah golf.

Yakub Misirian
sumber
Solusi Anda saat ini adalah 458 byte , bukan 523. Anda dapat memperbaiki skor Anda dengan menghapus spasi yang tidak perlu dan memperpendek nama variabel. Lihat solusi Hassium lainnya untuk contoh.
Alex A.
1
Seperti yang saya perhatikan pada jawaban Hassium lainnya, generator angka acak tampaknya sangat bias. Saya menjalankan ini 500 kali dengan versi terbaru dan hanya mendapat dua </3.
Dennis
+ Dennis Generator acak dibangun langsung di atas generator nomor acak C #. Lihat: github.com/HassiumTeam/Hassium/blob/master/src/Hassium/…
Jacob Misirian
3
Tampaknya tidak diunggulkan dengan benar. Jika saya mengeksekusi rnd = new Random();rnd.next(0,2);1000 kali, distribusinya OK. Namun, jika saya mengeksekusi rnd = new Random();sekali dan rnd.next(0,2);1000 kali, saya selalu mendapatkan persis 533 0s dan 467 1s.
Dennis
1

C # (160)

Kode ini terinspirasi oleh jawaban dari hjk , kredit jatuh kepadanya.

class P{static void Main(){for(int e=3+new Random().Next(0,18),i=0;++i<=e;)Console.WriteLine("Loves me"+(i%2>0?i<e?"...":"!\n<3":" not."+(i<e?"..":"\n</3")));}}

Tidak Disatukan:

class P
{
    private static void Main()
    {
        for (int e = 3 + new Random().Next(0, 18), i = 0; ++i <= e;)
            Console.WriteLine("Loves me" + (i % 2 > 0 ? i < e ? "..." : "!\n<3" : " not." + (i < e ? ".." : "\n</3")));
    }
}
Abbas
sumber
1

Lua, 137 132 byte

Mungkin bisa bermain golf lebih banyak, tetapi ini dia untuk saat ini:

t=math.random(3,20)for i=1,t do io.write(i%2==0 and"Loves me"or"Loves me not")print(i==t and(i%2==0 and"!\n<3"or".\n</3")or"...")end

Penjelasan kode dan ungolfed:

t=math.random(3,20) --Generates a random number between 1 and 30. We need to assign it to a variable to check if the loop is over later.
for i=1,t do
  io.write(i%2==0 and"Loves me"or"Loves me not") --If i%2 is 0 write without a newline Loves me, if not print Loves me not.
  print(i==t and (i%2==0 and"!\n<3" or ".\n</3") or "...") --If it is not the end of the loop, put ..., else if we ended on an even print ! a newline, and then a heart, but if we ended on an odd put ., a newline and a broken heart :(
end

Sunting: Memotong sebagian spasi putih.

TreFox
sumber
1

Jelly , 55 byte (tidak bersaing?)

“¢zḞzƘFq»,;¥“ not”ṁ18X+2¤j“...¶”µċ⁷Ḃ©”/ẋ;3⁾¶<;®ị⁾.!¤;⁸;

Cobalah online!

Seperti biasa Jelly mengisap dengan string.

Erik the Outgolfer
sumber
1

PowerShell , 85 88 byte

+3 byte terima kasih Veskah: Itu poin yang bagus.

0..(1..19|Random)|%{($l='Loves me')+' not'*($n=$_%2)+'...'}
$l+('!
<3',' not.
</3')[!$n]

Cobalah online!

mazzy
sumber
1
Ini dapat menghasilkan "Loves me, Loves me not </ 3", yang, berdasarkan cara saya membaca spesifikasi, berada di bawah jumlah minimum baris.
Veskah
Memang of *3* to 20 lines inclusive. Terima kasih!
mazzy