Yêu tôi, yêu tôi không


45

Yêu tôi, yêu tôi không

Trò chơi trẻ em đơn giản này đã cũ, nhưng vẫn phổ biến. Vì chúng ta đang sống ở thế kỷ 21 bây giờ, hãy số hóa nó!

Đặc điểm kỹ thuật

Chương trình phải không có đầu vào, trừ khi bạn đang sử dụng ngôn ngữ không thể tạo hạt giống ngẫu nhiên - trong trường hợp đó, bạn được phép lấy hạt giống làm đầu vào. Nhiệm vụ của bạn là viết một chương trình sẽ xuất ngẫu nhiên tổng cộng từ 3 đến 20 dòng: "Yêu tôi ..." và "Yêu tôi không ..." lần lượt, như trong trò chơi (và thêm một dòng; đọc).

Tuy nhiên, có một số hạn chế. Mỗi dòng nên được theo sau bởi dòng mới. Dòng đầu tiên phải là "Yêu tôi ...". Dòng cuối cùng ("Yêu tôi" hoặc "Không yêu tôi") sẽ kết thúc bằng dấu chấm than hoặc một dấu chấm duy nhất, tương ứng. Sau dòng cuối cùng, bạn cần xuất ra một trái tim ( <3) hoặc một trái tim tan vỡ ( </3) trong dòng mới, tùy thuộc vào việc "Yêu tôi!" hoặc "Yêu tôi không." là câu cuối cùng

Khoảng trắng Trailing được cho phép.

Ví dụ đầu ra

Đầu ra:

Yêu tôi ...
Yêu tôi không ...
Yêu tôi ...
Yêu tôi không ...
Yêu tôi!
<3

Đầu ra khác:

Yêu tôi ...
Yêu tôi không ...
Yêu tôi ...
Yêu tôi không.
</ 3

Đây là , vì vậy bài dự thi ngắn nhất sẽ thắng!

Ngoài ra, thử thách đầu tiên của tôi :) Chúc may mắn!


Có bất kỳ hạn chế nào đối với việc phân phối số lượng dòng, nghĩa là nó phải ngẫu nhiên đồng đều hay đủ để tất cả các độ dài từ 3 đến 20 có xác suất dương?
Zgarb

Tôi đã không nghĩ về điều này, nhưng tôi nói rằng mọi phân phối đều ổn - vì vậy chúng không phải là ngẫu nhiên thống nhất.
MatthewRock

Là 3 đến 20 ( [3, 20)) hoặc 3 lên đến 20 ( [3, 20])?
orlp

1
@MatthewRock Điều gì xảy ra nếu ngôn ngữ chúng ta muốn sử dụng không thể tự tạo một số ngẫu nhiên? Người dùng có thể cung cấp một hạt giống ngẫu nhiên?
mınxomaτ

3
@minxomat Dù gì đi nữa, đó chỉ là một trò chơi. Tiếp tục, thay đổi các quy tắc.
MatthewRock

Câu trả lời:


23

Pyth, 54 53 51 50 48 byte

pj+*3\.bm+W~!Z"Loves me"" not"+3O18@".!"Z%hZ"</3

%2tWZ"<</33cho in trái tim tiết kiệm 1. Mặc dù không tin rằng đây là cách tốt nhất.
FryAmTheEggman

@FryAmTheEggman Làm cho nó tiết kiệm hai.
orlp

Hợp nhất hai chuỗi cuối cùng với nhau sẽ cứu một chuỗi khác, nhưng tôi phải chuyển lại cho tôi %.
FryAmTheEggman

@".!"Z%hZ"</3lưu hai byte
Jakube

Vì đã không có mục nào trong vài ngày, tôi chấp nhận câu trả lời này. Xin chúc mừng!
MatthewRock

23

CJam, 53 50 49 byte

Cảm ơn Dennis vì đã tiết kiệm 1 byte.

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

Kiểm tra nó ở đây.

Giải trình

Mã chỉ cần kết xuất chuỗi theo bit và miếng lên ngăn xếp, được in tự động vào cuối chương trình:

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.

người ta có thể tưởng tượng rằng CJam sẽ được phát triển dành riêng cho môn đánh gôn ^^
larkey

11
@larkey nhưng đó là ...
MatthewRock

@larkey CJam có nguồn gốc từ GolfScript và GolfScript (như tên gọi của nó) được thiết kế để chơi gôn.
Chris Jester-Young

@ ChrisJester-Young, nó hơi
khóe miệng

17

Brainfuck, 2766 byte (hiện không hợp lệ)

Chỉ vì. Tôi sẽ thêm một phiên bản chưa được chỉnh sửa sau.

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

Mã giả

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"

Mẫu vật

Khi chạy, chương trình bước vào một phiên tương tác chờ đầu vào. Đầu vào phải là một số. Số này được sử dụng như một hạt giống.

Hạt giống: 1 (số ngẫu nhiên là 5, thực hiện 218.168.042 thao tác)

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

Hạt giống: 3 (số ngẫu nhiên là 20, mất 463.253.048 thao tác)

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

Tôi khuyên bạn không nên chọn 6, vì phải 2,105,900,375lặp đi lặp lại để tính kết quả :).

Biên dịch / Chạy

Bạn cần một thông dịch viên nhanh chóng cho việc này. Không có thông dịch viên trực tuyến nào tôi đã thử nghiệm có thể xử lý tốc độ thực hiện. Các ips (lặp lại mỗi giây) nên nhiều hơn 100,000,000. Vì vậy, tôi đã đưa ra một giải pháp khác.

Đây là trình biên dịch Brainfuck to C được viết bằng Brainfuck. Bạn có thể sử dụng bất kỳ trình thông dịch trực tuyến nào để dịch mã của tôi thành thuần C. Tôi đề nghị sử dụng brainfuck.tk . Dán mã của tôi vào đầu vào stdin, qua mã này trong đầu vào mã:

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

Tải về nguồn và biên dịch nó:

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

Bạn cũng có thể chạy một bản sao của mã C trực tuyến tại đây: thông qua. Mã hóa .

Tối ưu hóa

Vẫn còn một số việc phải làm, nhưng việc sử dụng lại tế bào là gần như tối ưu.

Nhận xét

Bạn có thể sử dụng các từ hoặc cụm từ làm hạt giống:

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

3
+1 vì có sự táo bạo để viết PRNG bằng Brainfuck ...
admBorkBork

@TimmyD Có nhiều cách tốt hơn để viết PRNG trong BF, nhưng hầu hết chúng đều dựa trên thời gian (chạy chương trình và dừng thực thi tại một số điểm, sau đó đọc bộ nhớ), nhưng điều đó đòi hỏi sự tương tác của người dùng và hai chương trình riêng biệt, chống lại những quy định.
mınxomaτ

3
Mã giả đẹp. Nhiều người nên làm điều đó, đặc biệt là vì một nửa ngôn ngữ chơi golf về cơ bản là không thể đọc được nếu bạn không biết chúng.
The_Basset_Hound

3
Thật không may đầu ra của bạn là sai. "Yêu tôi" lần cuối nên kết thúc bằng một dấu chấm than (vì vậy, "Yêu tôi!") Và "Yêu tôi không" nên kết thúc bằng một dấu chấm đơn ("Yêu tôi không.").
MatthewRock

1
Chúng ta có thể có một số mã giả của 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))

Tốt một! Nó có thể ngắn hơn để sử dụng nối chuỗi để tạo trái tim, và có thể trong việc tạo ra mỗi dòng. Nếu tôi sử dụng new Datemánh khóe trong câu trả lời của tôi?
Sản xuất ETH

@ETHproductions Đi cho nó, miễn là bạn ổn với tôi bằng cách sử dụng những trái tim đó haha ​​(và tại sao tôi không sử dụng cảnh báo ... vì một số lý do tôi đã thuyết phục bản thân các chức năng mũi tên sẽ ngắn hơn, nhưng cần trả lại phủ nhận rằng .. .). Bây giờ tôi thực sự đã hạ nó xuống còn 104 với một số thủ thuật khác =)
Mwr247

Dang ... công việc tốt :) Tôi tiếp tục sắp xếp lại của tôi, nhưng luôn kết thúc ở 104.
Sản phẩm ETH

Bước đột phá đối với tôi là kết hợp biến độ dài / lặp bằng cách nối ngược và xác định trái tim trong khởi tạo. Tôi đã thử nó một thời gian trước với ít tiền tiết kiệm, nhưng sự đơn giản hóa trái tim của bạn làm cho nó hiệu quả hơn nhiều.
Mwr247

Đợi một chút ... Thử cái này, tôi hiểu Loves me not... Loves me... Loves me not! <3Loves me not... Loves me... Loves me not... Loves me. </3. Tôi nghĩ bạn sẽ phải thay đổi một trong những điều kiện để khắc phục điều này. EDIT: Ồ, chỉ cần chuyển đổi ''' not'trong dòng thứ tư.
Sản xuất ETH

6

Con trăn, 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]

Sử dụng from random import*thay vì import randomrandintthay vì randrangeđể lưu một vài byte. Có lẽ có một số byte còn lại để chơi golf.


3
Sự xen kẽ "LLoovveess mmee n o t"[i%2::2].strip()có vẻ phức tạp không cần thiết. Bạn không thể làm gì "Loves me"+~i%2*" not"?
xnor

Thậm chí ["Loves me","Loves me not"][i%2]là tối ưu hơn, vì bây giờ bạn đang lãng phí ký tự .strip()và một vài khoảng trống. Nhưng có, sử dụng mã của xnor
nitro2k01

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)

Đây là một thử thách ngắn nhưng thú vị. Có thể rút ngắn nhiều hơn. Cảm ơn Mwr247 cho một số thủ thuật tiết kiệm byte!

Phiên bản thay thế sử dụng 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)

Tên tích hợp Darn JS 5 +. Ồ tốt Gợi ý chào mừng!


Ngưng tụ ấn tượng. Tôi tò mò mặc dù, tại sao 18+3|0?
Mwr247

@ Mwr247 Oh, duh, đó là từ khi tôi sử dụng Math.random(). Đoán không cần thiết bây giờ.
Sản xuất ETH

5

Perl, 85

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

5

Ruby, 91 byte

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

5

Lisp 106 104 byte phổ biến

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

Điều này chỉ hoạt động trên các lisps không kiểm tra trình tự thích hợp (ví dụ: cmucl, sbcl, clisp) ccl sẽ kiểm tra tính tuần hoàn và lỗi ở mức an toàn mặc định. ecl sẽ lặp mãi mãi.

Giải trình:

#1=(1 0 . #1#)tạo ra một danh sách vòng tròn chứa 10subseqđược sử dụng để tạo một danh sách có độ dài [3,20] (đây là phần không di động subseqduy nhất, theo tiêu chuẩn chỉ yêu cầu để làm việc trên danh sách thích hợp (tức là không phải hình tròn)).

Định dạng của chúng tôi hiện đang hoạt động trên một danh sách 1 0 1 0...có độ dài [3,20]

Giải thích về formatchỉ thị:

~{ lặp đi lặp lại trong danh sách này

~[theo sau bởi bất kỳ số lượng ~;và kết thúc với ~]sẽ chọn mục thứ N, dựa trên giá trị của đối số định dạng. Điều này được sử dụng ở đây để mục đầu tiên trong ~[trường hợp sẽ là trường hợp "yêu tôi không" và trường hợp thứ hai là trường hợp "yêu tôi". Lưu ý rằng với ~[dấu phân cách ~:;chọn trường hợp mặc định.

~#[hoạt động như ~[ngoại trừ đối số là số lượng đối số còn lại. 0 đối số còn lại có nghĩa là chúng ta ở cuối, trường hợp mặc định là in...

~:* sao lưu danh sách đối số một vị trí, cho phép chúng tôi in đoạn giới thiệu chính xác.


1
Đây là một nỗ lực nhóm của kênh #lisp IRC. Rất cám ơn phf cho chuỗi định dạng lặp thông minh và hack 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

Ung dung:

# 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

4

Shell UNIX, 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

4

Java, 210 209 203 200 177 byte

  • lật i%2==0đếni%2<1
  • tỉa { ... }niềng răng cho for-loop, chuyển ekhai để lặp
  • đặt hàng lại có điều kiện
  • gỡ bỏ sửa đổi và dấu ngoặc đơn không cần thiết, Randomsử dụng lại và gia tăng choi

Lưu ý: xuống dòng được thêm vào dưới đây để định dạng trên trang web này, số lượng trên là cho một đơn dòng.

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

Ung dung:

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

1
Bạn có thể lưu 13 byte bằng cách loại bỏ công khai.
Sáng

@Lum Tôi vẫn sẽ cần giữ một cái main()mặc dù ...
hjk

@TimmyD Tôi thứ hai mà.
RK.

4

C, 123, 121, 109 106 ký tự (108 byte)

(với một chút ♥♥♥ gian lận ♥♥♥)

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

Cũng có một điểm Unicode trái tim tan vỡ ở 1f494, nhưng tôi gặp khó khăn khi tìm một phông chữ thực hiện nó.


Điều này hiển thị 120 ký tự và 122 byte ...
admBorkBork

1
Tôi không nghĩ bạn cần O=0, vì Ctự động khởi tạo ints thành 0?
FryAmTheEggman

@FryAmTheEggman Tìm tốt! Trong phiên bản trước tôi đã có O ở main(o,O)nơi nó phải được khởi tạo.
Jens

Tuyệt tôi thích nó! Tôi đã không nghĩ đến việc sử dụng timenhư một số ngẫu nhiên ... Thông minh!
MatthewRock

@MatthewRock Nếu bạn nghĩ về nó, tất cả các chương trình khác sử dụng srand(time(0))sẽ thay đổi câu trả lời của họ với cùng tần suất. Srand hoàn toàn vô dụng :-)
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]

Đó là 39 byte chỉ để lấy số ngẫu nhiên.

Một lời cảm ơn lớn đến cá bùn , fryamtheeggmanorlp vì sự giúp đỡ của họ.

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

Bạn có thể thực hiện câu lệnh phạm vi trong một dòng duy nhất. bạn cũng có thể làmimport random as r
Màu xanh

bạn cũng có thể đặt nội dung của câu lệnh in cuối cùng lên dòng trên.
Màu xanh

Tôi nghĩ rằng bạn có thể thay đổi print'</3'if i%2 else'<3'để print['<3','</3'][i%2]tiết kiệm 3 byte.
Kade

Vâng thực sự tôi có thể; cảm ơn!
Celeo

Cảm ơn! Thật thú vị, import random as r;a=r.randrange(3,21)import random;a=random.randrange(3,21)có cùng chiều dài.
Celeo

3

PowerShell, 121 119 111 byte

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

Chỉnh sửa - thực sự ngắn hơn để bao gồm rõ ràng "Loves me"hơn là khai báo$l

Edit2 - quên rằng tôi có thể chơi for()các vòng golf bằng cách đặt ống dẫn ...

Không quá xấu. Sử dụng các khối thực thi mã nội tuyến $(...)để tự động điều chỉnh chuỗi in khi chúng tôi đang kết for()nối. Lưu ý rằng vì điều này sử dụng một ẩn Get-ở phía trước Randomđể lưu một vài byte, nên điều này có thể hoạt động cực kỳ chậm trên các phiên bản PowerShell nhất định. Tài liệu tham khảo

Mở rộng dưới đây để làm rõ:

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

3

C ++ 210 193 184 168 byte

Trong C ++ .. bởi vì .. Tại sao không? :)

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

Trực tiếp: 210 193 184 168

Chỉ hy vọng rằng bất kỳ thay đổi của tôi không phụ thuộc vào nền tảng.

Cảm ơn Ben Voigt đã giúp đỡ. Ngoài ra, nhờ tất cả các ý kiến, họ đã rất hữu ích.


Humn .. chỉ cần nhận ra từ 3 đến 20. Tôi sẽ sửa nó sau. Có lẽ sẽ thêm 2 byte nữa ...j=3+(int)(rand()*17.0/RAND_MAX)
wendelbsilva

Bạn có thể tiết kiệm rất nhiều bằng cách thay thế #define c coutusing namespace std;bằngauto&c=std::cout;
Ben Voigt

Cũng lưu một số vớiint i=0,j=rand()*20.0/RAND_MAX;while(i<j)
Ben Voigt

Xin chào, đã tìm thấy một lỗi: Dòng cuối cùng phải là "Yêu tôi!" Chứ không phải "Yêu tôi".
MatthewRock

1
Tôi muốn nói là ổn - C và C ++ tương tự nhau. Và ngay bây giờ mã này dài hơn Java ...
MatthewRock

3

Groovy, 110 byte

Một loại tình yêu hấp dẫn:

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

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]

Quan sát rằng mọi thứ Loves me( not)?được theo sau ...và một dòng mới, ngoại trừ cái cuối cùng. Vì vậy, điều này trông giống như một công việc cho join.


Một chút muộn nhưng ".!\n\n<</33"[n%2::2]ngắn hơn 2 byte.
FryAmTheEggman

@FryAmTheEggman Vâng, tôi đã thấy điều đó nhưng quyết định không ăn cắp nó từ Loovjo. Trong khi đó, một người khác đã đăng chính xác giải pháp đó. [nhún vai]
DLosc

Tôi đã không nhận thấy người khác đăng nó, nhưng tôi khá chắc chắn rằng bình luận của tôi là người đầu tiên có nó trong đó, vì vậy bạn có thể sử dụng nó nếu bạn muốn: P
FryAmTheEggman

2

R, 141 132 128 114 111 109 byte

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

Ung dung

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)

Tôi đã lấy một số cảm hứng từ Eric Brooks .

Chỉnh sửa 1: Bây giờ mã xuất ra chính xác dấu chấm câu cuối như được chỉ ra bởi Martin
Chỉnh sửa 2: Thay đổi vòng lặp for thành một sapply và bao gồm các trái tim trong chuỗi dòng cuối cùng.
Chỉnh sửa 3: Đã xóa {}và thay đổi +(x==k)*2thành +2*!x<k
Chỉnh sửa 4: Quay lại cho vòng lặp và xóa ()khỏi (i%%2)+1
Chỉnh sửa 5: Đã viết me4 lần và xóasep=""


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

Chỉnh sửa 1,2: Mã hóa hai tùy chọn rõ ràng là tiết kiệm không gian.


1
Bạn có thể lưu một byte bằng cách sử dụng =để gán hơn là một byte <-khác bằng cách thực hiện x%%2>0thay thế x%%2==1. Cũng lưu ý rằng điều này không xử lý chính xác dòng cuối cùng; nên có một .hoặc !hơn .... (Xem ví dụ đầu ra trong câu hỏi.)
Alex A.

1
@Alex A. Bạn cũng không cần x%%2>0; chỉx%%2
Flounderer

Điểm tốt, cảm ơn. Tôi cần quay lại và sửa kết thúc
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)?"":"/");}

(Có định dạng)

#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;
}

1
Xóa loại trả về khỏi main (-5 byte), tạo i và j toàn cầu với loại mặc định (-8 byte, -3 nhiều hơn vì 0 mặc định trong j), sử dụng 0 thay vì NULL (-3). Những thứ khác - chỉ sử dụng một biến và làm cho vòng lặp đếm ngược có thể. Nhập stdio thường không cần thiết khi chơi 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]

1

PHP, 191 187 146 165 byte

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

Ung dung:

$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 cho pyth và cjam ... wow :)


Đã thay đổi $ i% 2 == 0 thành $ i% 2 <1 (x2) và $ i% 2! = 0 thành $ i% 2> 0 (x2)
Marek Bettman

hóa ra các nhà điều hành ternary không phải là câu trả lời tốt nhất mọi lúc :)
Marek Bettman

1

mSL, 178 176 156 154 byte

Chỉnh sửa 1: Thay đổi == 0thành < 1
Chỉnh sửa 2: Đã xóa các khoảng trắng không cần thiết, cảm ơn AlexA!
Chỉnh sửa 3: Xóa dấu ngoặc đơn

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

1
Giải pháp của bạn hiện là 176 byte, không phải 177. Có phải tất cả các khoảng trắng đều cần thiết không? Nếu không, bạn có thể rút ngắn mã của mình một lượng đáng kể chỉ bằng cách xóa khoảng trắng không cần thiết.
Alex A.

@AlexA. Ồ không biết tại sao tôi viết 177, và cảm ơn vì đã chỉ ra sự cần thiết của khoảng trắng, nó thực sự không cần thiết!
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

Phiên bản dễ đọc:

$_="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

1

Kali , 265 byte

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

Câu trả lời đã được đánh golf.


Giải pháp của bạn hiện là 458 byte , không phải 523. Bạn có thể cải thiện điểm số của mình bằng cách xóa các khoảng trắng không cần thiết và rút ngắn tên biến. Xem các giải pháp Kali khác cho ví dụ.
Alex A.

1
Như tôi đã lưu ý về câu trả lời khác của Kali, trình tạo số ngẫu nhiên dường như cực kỳ sai lệch. Tôi đã chạy 500 lần với phiên bản mới nhất và chỉ có hai </3.
Dennis

+ Dennis Trình tạo ngẫu nhiên được xây dựng trực tiếp trên đầu trình tạo số ngẫu nhiên C #. Xem: github.com/HassiumTeam/Hassium/blob/master/src/Hassium/...
Jacob Misirian

3
Nó dường như không được gieo hạt chính xác. Nếu tôi thực hiện rnd = new Random();rnd.next(0,2);1000 lần, phân phối là OK. Tuy nhiên, nếu tôi thực hiện rnd = new Random();một lần và rnd.next(0,2);1000 lần, tôi luôn nhận được chính xác 533 0giây và 467 1giây.
Dennis

1

C # (160)

Mã được lấy cảm hứng từ câu trả lời từ hjk , tín dụng cho anh ta.

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

Ung dung:

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

1

Lua, 137 132 byte

Có lẽ có thể chơi golf nhiều hơn nữa, nhưng bây giờ nó là:

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

Giải thích mã và không được mã hóa:

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

Chỉnh sửa: Cắt bỏ một số khoảng trắng.



1

PowerShell , 85 88 byte

+3 byte cảm ơn Veskah: Đó là một điểm tốt.

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

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


1
Điều này có thể tạo ra "Yêu tôi, Yêu tôi không </ 3", dựa trên cách tôi đọc thông số kỹ thuật, nằm dưới số dòng tối thiểu.
Veskah

Thật vậy of *3* to 20 lines inclusive. Cảm ơn!
mazzy
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.