รักฉันอย่ารักฉัน


45

รักฉันอย่ารักฉัน

เกมสำหรับเด็กที่เรียบง่ายนี้เก่า แต่ยังคงได้รับความนิยม เนื่องจากเราอาศัยอยู่ในศตวรรษที่ 21 ตอนนี้มาแปลงเป็นดิจิทัล!

สเปค

โปรแกรมต้องไม่มีการป้อนข้อมูลยกเว้นว่าคุณกำลังใช้ภาษาที่ไม่สามารถสร้างเมล็ดพันธุ์แบบสุ่มในกรณีนี้คุณจะได้รับอนุญาตให้รับเมล็ดเป็นอินพุต งานของคุณคือการเขียนโปรแกรมที่จะให้ผลลัพธ์แบบสุ่มรวม 3 ถึง 20 บรรทัดรวม: "รักฉัน ... " และ "รักฉันไม่ ... " ในทางกลับกันเช่นเดียวกับในเกม (และอีกหนึ่งบรรทัด; การอ่าน)

อย่างไรก็ตามมีข้อ จำกัด บางประการ แต่ละบรรทัดควรขึ้นบรรทัดใหม่ บรรทัดแรกต้องเป็น "รักฉัน ... " บรรทัดสุดท้าย (เช่น "รักฉัน" หรือ "ไม่รักฉันไม่ได้") ควรลงท้ายด้วยเครื่องหมายอัศเจรีย์หรือจุดเดียวตามลำดับ หลังจากบรรทัดสุดท้ายคุณจะต้องส่งออกทั้งหัวใจ ( <3) หรือหัวใจที่แตกสลาย ( </3) ในบรรทัดใหม่ขึ้นอยู่กับว่า "รักฉัน!" หรือ "รักฉันไม่ได้" เป็นประโยคสุดท้าย

อนุญาตให้มีช่องว่างต่อท้ายได้

ตัวอย่างผลลัพธ์

เอาท์พุท:

รักฉัน ...
ไม่
รักฉัน ...
รักฉัน... รักฉันไม่ ...
รักฉัน!
<3

เอาท์พุทอื่น:

รักฉัน ...
ไม่
รักฉัน ...
รักฉัน... ไม่รักฉัน
</ 3

นี่คือดังนั้นรายการที่สั้นที่สุดชนะ!

ความท้าทายแรกของฉัน :) ขอให้โชคดี!


มีข้อ จำกัด ใด ๆ เกี่ยวกับการแจกแจงของจำนวนบรรทัดเช่นควรสุ่มอย่างสม่ำเสมอหรือเพียงพอหรือไม่ที่ความยาวทั้งหมดระหว่าง 3 ถึง 20 มีความเป็นไปได้ในเชิงบวก
Zgarb

ฉันไม่ได้คิดถึงเรื่องนี้ แต่ฉันบอกว่าการกระจายตัวใด ๆ ก็ดี - ดังนั้นพวกเขาไม่จำเป็นต้องสุ่มอย่างสม่ำเสมอ
MatthewRock

มันคือ 3 ถึง 20 ( [3, 20)) หรือ 3 รวมถึง 20 ( [3, 20])?
orlp

1
@MatthewRock จะเกิดอะไรขึ้นหากภาษาที่เราต้องการใช้ไม่สามารถทำการสุ่มตัวเลขด้วยตนเองได้? ผู้ใช้สามารถจัดหาเมล็ดพันธุ์แบบสุ่มได้หรือไม่?
mınxomaτ

3
@minxomat ไม่ว่ามันจะเป็นแค่เกม ต่อไปเปลี่ยนกฎ
MatthewRock

คำตอบ:


23

Pyth, 54 53 51 50 48 ไบต์

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

%2tWZ"<</33สำหรับการพิมพ์หัวใจช่วยประหยัด 1. ไม่เชื่อว่านี่เป็นวิธีที่ดีที่สุด
FryAmTheEggman

@FryAmTheEggman ทำให้ประหยัดสอง
orlp

ผสานสองสตริงที่ผ่านมาร่วมกันช่วยอีกคนหนึ่ง %แต่ผมต้องเปลี่ยนกลับไปเป็นของฉัน
FryAmTheEggman

@".!"Z%hZ"</3บันทึกสองไบต์
Jakube

เนื่องจากไม่ได้เข้ามาสองสามวันฉันจึงยอมรับคำตอบนี้ ขอแสดงความยินดี!
MatthewRock

23

CJam, 53 50 49 ไบต์

ขอบคุณ Dennis ที่ช่วยประหยัด 1 ไบต์

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

ทดสอบที่นี่

คำอธิบาย

โค้ดจะดัมพ์สตริงเป็นบิตและส่วนบนสแต็กซึ่งถูกพิมพ์โดยอัตโนมัติเมื่อสิ้นสุดโปรแกรม:

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.

ใคร ๆ ก็จินตนาการได้ว่า CJam นั้นจะได้รับการพัฒนาสำหรับรหัสกอล์ฟโดยเฉพาะ ^^
larkey

11
@larkey แต่มันคือ ...
MatthewRock

@larkey CJam มาจาก GolfScript และ GolfScript (ตามชื่อของมันหมาย) ถูกออกแบบมาสำหรับการเล่นกอล์ฟ
Chris Jester-Young

@ ChrisJester-Young มันเป็นเรื่องเล็ก ๆ น้อย ๆ ที่แก้มลิ้น ;-)
larkey

17

Brainfuck, 2766 ไบต์ (ปัจจุบันไม่ถูกต้อง)

เพียงเพราะว่า. ฉันจะเพิ่มเวอร์ชันที่ไม่อัปโหลดในภายหลัง

รหัส

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

pseudocode

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"

ตัวอย่าง

เมื่อรันโปรแกรมจะเข้าสู่เซสชันแบบโต้ตอบเพื่อรออินพุต อินพุตควรเป็นตัวเลข หมายเลขนี้ใช้เป็นเมล็ด

เมล็ดพันธุ์: 1 (หมายเลขสุ่มคือ 5 ใช้เวลา 218,168,042 การดำเนินการ)

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

เมล็ดพันธุ์: 3 (หมายเลขสุ่มคือ 20 ใช้การดำเนินการ 463,253,048 ครั้ง)

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

ฉันขอแนะนำว่าคุณไม่ได้เพาะเมล็ด6เพราะจะต้อง2,105,900,375คำนวณซ้ำเพื่อให้ได้ผลลัพธ์ :)

รวบรวม / วิ่ง

คุณต้องการล่ามที่รวดเร็วสำหรับเรื่องนี้ ไม่มีล่ามออนไลน์ที่ฉันทดสอบไม่สามารถรองรับความเร็วในการทำงาน IP ที่ (ซ้ำต่อวินาที) 100,000,000ควรจะมากกว่า ดังนั้นฉันจึงคิดวิธีแก้ปัญหาอื่น

นี่คือคอมไพเลอร์ Brainfuck ถึง C ที่เขียนใน Brainfuck คุณสามารถใช้ล่ามออนไลน์ใด ๆ ที่ transpile รหัสของฉันที่จะบริสุทธิ์ซีผมขอแนะนำให้ใช้brainfuck.tk วางรหัสของฉันในอินพุต stdin ผ่านโค้ดนี้ในการป้อนรหัส:

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

ดาวน์โหลดแหล่งที่มาและรวบรวม:

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

นอกจากนี้คุณยังสามารถเรียกใช้สำเนารหัส C ออนไลน์ได้ที่นี่: ผ่าน CodingGround

การเพิ่มประสิทธิภาพ

ยังคงมีงานที่ต้องทำ แต่เซลล์กลับมาใช้ใหม่เกือบจะดีที่สุด

หมายเหตุ

คุณสามารถใช้คำหรือวลีเป็นเมล็ด:

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 สำหรับการมีความกล้าที่จะเขียน PRNG ใน Brainfuck ...
AdmBorkBork

@ TimmyD มีวิธีที่ดีกว่าในการเขียน PRNG ใน BF แต่ส่วนใหญ่เป็นแบบเวลา (เรียกใช้โปรแกรมและหยุดการทำงานในบางจุดจากนั้นอ่านหน่วยความจำ) แต่ต้องมีการโต้ตอบกับผู้ใช้และสองโปรแกรมแยกจากกัน กฎระเบียบ.
mınxomaτ

3
รหัสลับที่ดี ผู้คนจำนวนมากควรทำเช่นนั้นโดยเฉพาะอย่างยิ่งเมื่อครึ่งภาษาการตีกอล์ฟไม่สามารถอ่านได้ถ้าคุณไม่รู้
The_Basset_Hound

3
น่าเสียดายที่ผลลัพธ์ของคุณผิด สุดท้าย "รักฉัน" ควรลงท้ายด้วยเครื่องหมายอัศเจรีย์ (เช่น "รักฉัน!") และ "รักฉันไม่ได้" ควรลงท้ายด้วยจุดเดียว ("รักฉันไม่ได้")
MatthewRock

1
เราสามารถใช้ pseudocode ของ RNG ได้ไหม?
เบต้าการสลายตัว

7

Javascript (ES6), 119 104 99 98 ไบต์

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

สิ่งที่ดี! มันอาจจะสั้นกว่าที่จะใช้การต่อสตริงเพื่อสร้างหัวใจและอาจเป็นไปได้ในการสร้างของแต่ละบรรทัด ถ้าฉันใช้new Dateเล่ห์เหลี่ยมในคำตอบของฉัน
ETHproductions

@ETHproductions ไปเลยตราบใดที่คุณสบายดีกับฉันโดยใช้หัวใจเหล่านั้นฮ่าฮ่า (และทำไมฉันไม่ใช้การแจ้งเตือน ... ด้วยเหตุผลบางอย่างที่ฉันเชื่อว่าตัวเองฟังก์ชั่นลูกศรจะสั้นลง แต่ต้องการกลับปฏิเสธว่า .. .) ที่จริงฉันเพิ่งได้รับถึง 104 ตอนนี้มีเทคนิคอื่น ๆ เช่นกัน =)
Mwr247

แดง ... เป็นงานที่ดี :) ฉันจัดเรียงทุ่นระเบิดใหม่ แต่ก็จบลงที่ 104 เสมอ
ETHproductions

ความก้าวหน้าสำหรับฉันคือการรวมตัวแปรความยาว / การทำซ้ำโดยการต่อกลับกันและกำหนดหัวใจในการเริ่มต้น ฉันลองมาพักหนึ่งแล้วประหยัดอีกเล็กน้อย แต่การทำให้หัวใจของคุณง่ายขึ้นทำให้มีประสิทธิภาพมากขึ้น
Mwr247

รอสักครู่ ... พยายามนี้ผมได้รับและLoves me not... Loves me... Loves me not! <3 Loves me not... Loves me... Loves me not... Loves me. </3ฉันคิดว่าคุณจะต้องเปลี่ยนเงื่อนไขข้อใดข้อหนึ่งเพื่อแก้ไขปัญหานี้ แก้ไข: โอ้เพียงแค่สลับ''และ' not'ในบรรทัดที่สี่
ETHproductions

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]

ใช้from random import*แทนimport randomและrandintแทนที่จะrandrangeบันทึกสองสามไบต์ อาจมีบางไบต์เหลือที่จะตีกอล์ฟ


3
การสลับ"LLoovveess mmee n o t"[i%2::2].strip()ดูเหมือนซับซ้อนโดยไม่จำเป็น คุณทำ"Loves me"+~i%2*" not"ไม่ได้เหรอ
xnor

ยิ่ง["Loves me","Loves me not"][i%2]กว่านั้นดีกว่าเนื่องจากตอนนี้คุณกำลังเสียตัวอักษร.strip()และช่องว่างสองสามช่อง แต่ใช่ใช้รหัสของ
xnor

6

Javascript (ES6), 110 102 ไบต์

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

นี่เป็นความท้าทายเล็กน้อยที่สั้น แต่สนุก อาจเป็นไปได้ที่จะย่อให้สั้นลง ขอบคุณ Mwr247 สำหรับเทคนิคการประหยัดไบต์!

เวอร์ชันอื่นที่ใช้repeat()105 ไบต์:

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 ชื่อในตัว โอ้ดี ยินดีต้อนรับข้อเสนอแนะ!


การควบแน่นที่น่าประทับใจ ฉันอยากรู้ว่าทำไม18+3|0?
Mwr247

@ Mwr247 โอ้ duh Math.random()นั่นคือเมื่อผมใช้ คิดว่ามันไม่จำเป็นตอนนี้
ETHproductions



5

Lisp สามัญ106 104 ไบต์

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

ใช้งานได้เฉพาะกับ lisps ที่ไม่ตรวจสอบลำดับที่เหมาะสม (เช่น cmucl, sbcl, clisp) ccl จะตรวจสอบการเวียนและข้อผิดพลาดในระดับความปลอดภัยเริ่มต้น ecl จะวนซ้ำตลอดไป

คำอธิบาย:

#1=(1 0 . #1#)สร้างรายการวงกลมที่มี1และ0และsubseqใช้เพื่อสร้างรายการความยาว [3,20] (นี่เป็นเพียงส่วนที่ไม่สามารถพกพาsubseqได้เท่านั้นตามที่มาตรฐานกำหนดให้ทำงานกับรายการที่เหมาะสม (เช่นไม่ใช่วงกลม)

รูปแบบของเรากำลังทำงานในรายการ1 0 1 0...ความยาว [3,20]

คำอธิบายของformatคำสั่ง:

~{ วนซ้ำในรายการนี้

~[ตามด้วยหมายเลขใด ๆ~;และถูกยกเลิกด้วย~]จะเลือกรายการ Nth ตามค่าของอาร์กิวเมนต์รูปแบบ นี่ใช้ที่นี่เพื่อให้ไอเท็มแรกใน a ~[จะเป็นเคส "love me not" และอันที่สองเป็นเคส "love me" โปรดทราบว่าด้วย~[ตัวคั่นของ~:;เลือกกรณีเริ่มต้น

~#[ทำงานเหมือน~[ยกเว้นอาร์กิวเมนต์คือจำนวนของอาร์กิวเมนต์ที่เหลือ 0 อาร์กิวเมนต์ที่เหลือหมายความว่าเราอยู่ท้ายที่สุดกรณีเริ่มต้นคือการพิมพ์...

~:* สำรองรายการอาร์กิวเมนต์หนึ่งตำแหน่งซึ่งช่วยให้เราสามารถพิมพ์ตัวอย่างที่ถูกต้อง


1
นี่เป็นความพยายามของกลุ่มโดย #lisp IRC channel ขอบคุณมากสำหรับ phf สำหรับรูปแบบสตริงซ้ำที่ฉลาดและแฮ็คย่อย
Jason

4

Julia ขนาด 98 ไบต์

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

Ungolfed:

# 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

เชลล์ UNIX ขนาด 193 ไบต์

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 ไบต์

  • พลิกi%2==0ไปที่i%2<1
  • { ... }วงเล็บปีกกาที่ถูกตัดสำหรับfor-loop, ย้ายeการประกาศไปที่ลูป
  • สั่งใหม่เงื่อนไข
  • ลบตัวดัดแปลงและวงเล็บที่ไม่จำเป็นRandomการใช้งานที่ทำใหม่และการเพิ่มขึ้นสำหรับi

หมายเหตุ: มีการเพิ่มบรรทัดใหม่ด้านล่างสำหรับการจัดรูปแบบบนไซต์นี้การนับด้านบนใช้สำหรับบรรทัดเดียว

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

Ungolfed:

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
คุณสามารถบันทึก 13 ไบต์โดยการลบสาธารณะ
ส่องสว่าง

@Luminous ผมยังจะต้องเก็บหนึ่งสำหรับmain()แม้ว่า ...
HJK

@ TimmyD ฉันสองที่
RK

4

C, 123, 121, 109 106 ตัวอักษร (108 ไบต์)

(โกงนิดหน่อย♥♥♥♥♥♥)

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

นอกจากนี้ยังมีหัวใจที่แตกสลายจุด Unicode ที่ 1f494 แต่ฉันมีปัญหาในการหาตัวอักษรซึ่งการดำเนินการนั้น


สิ่งนี้แสดงให้เห็นถึง 120 ตัวอักษรและ 122 ไบต์ ...
AdmBorkBork

1
ฉันไม่คิดว่าคุณต้องการO=0เพราะCการเริ่มต้นอัตโนมัติ ints เพื่อ0?
FryAmTheEggman

@FryAmTheEggman ดีมาก! ในรุ่นก่อนหน้าฉันมี O ในmain(o,O)ที่ที่จะต้องเริ่มต้น
เจนส์

ดีฉันชอบมัน! ฉันไม่คิดว่าจะใช้timeเป็นตัวเลขสุ่ม ... ฉลาด!
MatthewRock

@MatthewRock หากคุณคิดเกี่ยวกับโปรแกรมอื่น ๆ ที่ใช้srand(time(0))จะเปลี่ยนคำตอบด้วยความถี่เดียวกัน srand จะไม่ได้ผลสมบูรณ์ :-)
Jens

4

Python 2, 161 159 156 144 ไบต์

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]

เป็น 39 ไบต์เพียงเพื่อให้ได้ตัวเลขสุ่ม

ขอบคุณมากสำหรับmuddyfish , fryamtheeggmanและorlpสำหรับความช่วยเหลือของพวกเขา

PYG , 109 ไบต์

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

คุณสามารถทำคำสั่งช่วงในบรรทัดเดียว คุณสามารถทำได้import random as r
บลู

คุณยังสามารถใส่เนื้อหาของคำสั่งพิมพ์ล่าสุดลงบนบรรทัดด้านบน
บลู

ฉันคิดว่าคุณสามารถเปลี่ยนprint'</3'if i%2 else'<3'ไปprint['<3','</3'][i%2]เพื่อประหยัด 3 ไบต์
Kade

ใช่ฉันทำได้ ขอบคุณ!
Celeo

ขอบคุณ! ที่น่าสนใจimport random as r;a=r.randrange(3,21)และimport random;a=random.randrange(3,21)มีความยาวเท่ากัน
Celeo

3

PowerShell, 121 119 111 ไบต์

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

แก้ไข - สั้นกว่าจริง ๆ เพื่อรวมไว้อย่างชัดเจน"Loves me"แทนที่จะประกาศ$l

แก้ไข 2 - ลืมไปเลยว่าฉันสามารถตีfor()ห่วงได้โดยการวางท่อ ... durr ...

ไม่โทรมเกินไป ใช้บล็อกการดำเนินการแบบอินไลน์$(...)เพื่อปรับสตริงที่พิมพ์แบบไดนามิกในขณะที่เรากำลังfor()-loop โปรดทราบว่าเนื่องจากการใช้งานนี้โดยปริยายGet-ในด้านหน้าของRandomเพื่อประหยัดไบต์คู่นี้อาจทำงานช้ามากในรุ่น PowerShell บางอย่าง การอ้างอิง

ขยายด้านล่างเพื่อความกระจ่าง:

# 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 ไบต์

ใน C ++ .. เพราะ .. ทำไมล่ะ :)

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

มีชีวิต: 210 193 184 168

หวังว่าการเปลี่ยนแปลงใด ๆ ของฉันจะไม่ขึ้นอยู่กับแพลตฟอร์ม

ขอบคุณBen Voigtสำหรับความช่วยเหลือ ขอบคุณทุกความคิดเห็นพวกเขามีประโยชน์มาก


หืมม .. เพิ่งรู้ว่ามัน 3 ถึง 20 ฉันจะแก้ไขทีหลัง อาจจะเพิ่มอีก 2 ไบต์ ...j=3+(int)(rand()*17.0/RAND_MAX)
wendelbsilva

คุณสามารถประหยัดได้มากโดยการแทนที่#define c coutและusing namespace std;โดยauto&c=std::cout;
Ben Voigt

ประหยัดบางส่วนด้วยint i=0,j=rand()*20.0/RAND_MAX;while(i<j)
Ben Voigt

สวัสดีพบข้อบกพร่อง: บรรทัดสุดท้ายควรเป็น "รักฉัน!" ไม่ใช่ "รักฉัน"
MatthewRock

1
ฉันว่ามันโอเค - C และ C ++ เหมือนกัน และตอนนี้รหัสนี้มีความยาวมากกว่า Java ...
MatthewRock

3

Groovy ขนาด 110 ไบต์

ความรักชนิดแรงกล้า:

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 ไบต์

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]

สังเกตว่าทุกคนLoves me( not)?ตามมาด้วย...และขึ้นบรรทัดใหม่ยกเว้นบรรทัดสุดท้าย joinดังนั้นลักษณะเช่นนี้งานสำหรับ


ช้าไปหน่อย แต่".!\n\n<</33"[n%2::2]สั้นกว่า 2 ไบต์
FryAmTheEggman

@FryAmTheEggman ใช่ฉันเห็นแล้ว แต่ตัดสินใจที่จะไม่ขโมยจาก Loovjo ในระหว่างนี้มีคนโพสต์วิธีการแก้ปัญหานั้นอย่างแน่นอน [
shrug

ฉันไม่ได้สังเกตเห็นคนอื่นโพสต์ แต่ฉันค่อนข้างมั่นใจว่าความคิดเห็นของฉันเป็นคนแรกที่มีในนั้นดังนั้นคุณสามารถใช้มันหากคุณต้องการ: P
FryAmTheEggman

2

R, 141 132 128 114 111 109 ไบต์

รหัส

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

Ungolfed

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)

ฉันได้รับแรงบันดาลใจจากโค้ดEric Brooks

แก้ไข 1: ตอนนี้รหัสถูกต้องแสดงเครื่องหมายวรรคตอนสุดท้ายอย่างถูกต้องตามที่มาร์ติน
แก้ไข 2: เปลี่ยนสำหรับลูปเป็น sapply และรวมหัวใจภายในสตริงบรรทัดสุดท้าย
แก้ไข 3: ลบ{}และเปลี่ยน+(x==k)*2เป็น+2*!x<k
แก้ไข 4: กลับไปที่สำหรับลูปและลบออก()จาก(i%%2)+1
แก้ไข 5: เขียนme4 ครั้งและลบsep=""


1

R, 119 111 105 ไบต์

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

แก้ไข 1,2: การเข้ารหัสสองตัวเลือกอย่างชัดเจนคือประหยัดพื้นที่


1
คุณสามารถบันทึกไบต์โดยใช้=สำหรับการกำหนดมากกว่า<-และอีกโดยทำในสถานที่ของx%%2>0 x%%2==1นอกจากนี้โปรดทราบว่านี่ไม่สามารถจัดการบรรทัดสุดท้ายได้อย่างถูกต้อง ควรจะมี.หรือมากกว่า! ...(ดูตัวอย่างผลลัพธ์ในคำถาม)
อเล็กซ์ A.

1
@Alex A. คุณไม่จำเป็นต้องใช้x%%2>0ทั้ง; เพียงแค่x%%2
Flounderer

จุดดีขอบคุณ ฉันต้องย้อนกลับไปและแก้ไขตอนจบ
Eric Brooks

1

C 226 ไบต์

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

(พร้อมการจัดรูปแบบ)

#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
ลบประเภทส่งคืนจาก main (-5 bytes), สร้าง i และ j global ด้วยชนิดเริ่มต้น (-8 bytes, -3 เพิ่มเติมเนื่องจากค่าเริ่มต้นที่ 0 ใน j), ใช้ 0 แทน NULL (-3) สิ่งอื่น ๆ - ใช้เพียงตัวแปรเดียวและทำให้การนับวนลงอาจ โดยทั่วไปไม่จำเป็นต้องนำเข้า stdio เมื่อเล่นกอล์ฟ
aragaer


1

PHP, 191 187 146 165 ไบต์

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

Ungolfed:

$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 ไบต์สำหรับ pyth และ cjam ... ว้าว :)


เปลี่ยน $ i% 2 == 0 เป็น $ i% 2 <1 (x2) และ $ i% 2! = 0 เป็น $ i% 2> 0 (x2)
Marek Bettman

ผลัดกันออกมาประกอบ ternary ไม่ได้คำตอบที่ดีที่สุดตลอดเวลา :)
มาเร็ค Bettman

1

mSL, 178 176 156 154 ไบต์

แก้ไข 1: เปลี่ยน== 0เป็น< 1
แก้ไข 2: ลบช่องว่างที่ไม่จำเป็นออกขอบคุณ AlexA!
แก้ไข 3: ลบวงเล็บ

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
วิธีแก้ปัญหาของคุณในปัจจุบันคือ176ไบต์ไม่ใช่ 177 ช่องว่างทั้งหมดจำเป็นหรือไม่ หากไม่เป็นเช่นนั้นคุณสามารถย่อรหัสของคุณให้สั้นลงได้โดยเพียงแค่ลบช่องว่างที่ไม่ต้องการออก
Alex A.

@AlexA โอ้ไม่รู้ว่าทำไมฉันถึงเขียน 177 และขอบคุณที่ชี้ให้เห็นความจำเป็นของช่องว่างมันไม่จำเป็นจริงๆ!
Denny

1

Perl, 97 ไบต์

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

รุ่นที่อ่านได้:

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

ฮัสเซียม , 265 ไบต์

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

คำตอบได้รับการ golfed


โซลูชันของคุณในปัจจุบันมีขนาด 458 ไบต์ไม่ใช่ 523 คุณสามารถเพิ่มคะแนนของคุณได้โดยการลบช่องว่างที่ไม่จำเป็นและลดชื่อตัวแปร ดูตัวอย่างโซลูชัน Hassium อื่น ๆ
Alex A.

1
ดังที่ฉันได้กล่าวไว้ในคำตอบของ Hassium ตัวสร้างตัวเลขสุ่มน่าจะเอนเอียงอย่างมาก ฉันวิ่ง 500 </3ครั้งกับรุ่นใหม่ล่าสุดและมีเพียงสอง
Dennis

+ เดนนิสตัวสร้างแบบสุ่มถูกสร้างขึ้นโดยตรงจากตัวสร้างหมายเลขแบบสุ่ม C # โปรดดู: github.com/HmiumTeam/Hmium/blob/master/src/Hmium/ …
Jacob Misirian

3
ดูเหมือนว่าจะไม่ได้รับเมล็ดอย่างถูกต้อง หากฉันดำเนินการrnd = new Random();rnd.next(0,2);1,000 ครั้งการแจกแจงก็โอเค อย่างไรก็ตามถ้าฉันรันrnd = new Random();หนึ่งครั้งและrnd.next(0,2);1,000 ครั้งฉันจะได้ 533 0s และ 467 1s เสมอ
Dennis

1

C # (160)

รหัสได้แรงบันดาลใจจากคำตอบจากhjkเครดิตไปให้เขา

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

Ungolfed:

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 ไบต์

อาจจะสามารถเล่นกอล์ฟได้มากขึ้น แต่ตอนนี้เป็นตอนนี้:

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

คำอธิบายรหัสและไม่ได้รับเกียรติ:

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

แก้ไข: ตัดช่องว่างบางส่วนออก



1

PowerShell , 85 88 ไบต์

+3 ไบต์ขอบคุณ Veskah: นั่นเป็นจุดที่ดี

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

ลองออนไลน์!


1
สิ่งนี้สามารถสร้าง "รักฉันรักฉันไม่ใช่ </ 3" ซึ่งขึ้นอยู่กับว่าฉันอ่านรายละเอียดได้ต่ำกว่าจำนวนบรรทัดขั้นต่ำหรือไม่
Veskah

of *3* to 20 lines inclusiveจริง ขอบคุณ!
mazzy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.