爱我,不爱我


45

爱我,不爱我

这个简单的儿童游戏虽然古老,但仍然很受欢迎。由于我们现在生活在21世纪,因此我们将其数字化!

规格

程序必须不输入任何内容,除非您使用的语言不能生成随机种子-在这种情况下,您可以将种子用作输入。您的任务是编写一个程序,该程序将随机输出总共3到20行(包括3行和20行):“爱我...”和“爱我不...”,就像在游戏中一样(以及另外一行);读)。

但是,有一些限制。每行后应跟换行符。第一行必须是“爱我...”。最后一行(“爱我”或“不爱我”)应分别以感叹号或单个点结束。在最后一行之后,您需要在新行中输出一个heart(<3)或一个破碎的heart(</3),具体取决于是否“爱我!” 或“不爱我”。是最后一句话。

允许尾随空格。

示例输出

输出:

爱我...

爱我...
爱我...不
爱我... 爱我!
<3

另一个输出:

爱我...

爱我...
爱我... 不爱我。
</ 3

这是,因此最短的条目将获胜!

另外,我的第一个挑战:)祝你好运!


对行数的分布是否有任何限制,即它应该是一致随机的,还是3到20之间的所有长度都具有正概率?
Zgarb 2015年

我没有考虑这一点,但是我想说任何分布都是很好的-因此它们不必一律是随机的。
MatthewRock 2015年

是3到20([3, 20))还是3到20([3, 20])之间?
orlp 2015年

1
@MatthewRock如果我们要使用的语言不能自己播种随机数怎么办?用户可以提供随机种子吗?
mınxomaτ

3
@minxomat不管怎么说,这只是一个游戏。继续,更改规则。
MatthewRock

Answers:


23

Pyth,54 53 51 50 48字节

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

%2tWZ"<</33为心脏打印节省了费用1.不相信这是最好的方法。
FryAmTheEggman 2015年

@FryAmTheEggman使它保存两个。
orlp 2015年

将最后两个字符串合并在一起可以保存另一个字符串,但是我不得不切换回我的%
FryAmTheEggman 2015年

@".!"Z%hZ"</3保存两个字节
Jakube 2015年

由于几天没有任何条目,我接受这个答案。恭喜你!
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(顾名思义)专为打高尔夫球设计的。
克里斯·杰斯特·杨

@ ChrisJester-Young,这有点讽刺;-)
larkey

17

Brainfuck,2766字节(当前无效)

只是因为。稍后我将添加一个非高尔夫版本。

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

伪码

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迭代来计算结果:)。

编译/运行

您需要对此进行快速解释。我测试过的在线解释器无法处理执行速度。ips(每秒迭代次数)应大于100,000,000。所以我想出了另一种解决方案。

这是用Brainfuck编写的Brainfuck to C编译器。您可以使用任何在线解释器将我的代码转换为纯C。我建议使用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敢于在Brainfuck中编写PRNG ...
AdmBorkBork

@TimmyD有更好的方法可以在BF中编写PRNG,但大多数方法都是基于时间的(运行程序,并在某个时间点停止执行,然后读取内存),但这需要用户交互和两个单独的程序,这是反对的规则。
mınxomaτ

3
不错的伪代码。更多的人应该这样做,尤其是因为如果您不了解高尔夫球语言的一半,那么它们基本上是不可读的。
The_Basset_Hound

3
不幸的是,您的输出是错误的。最后的“爱我”应以感叹号结尾(因此,“爱我!”),而“不爱我”应以点结尾(“不爱我”。)。
MatthewRock 2015年

1
我们可以有一些RNG的伪代码吗?
Beta Decay 2015年

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 2015年

@ETHproductions继续吧,只要您对那些心脏感到满意,哈哈(以及为什么我不使用警报...出于某种原因,我确信自己的箭头功能会更短,但是需要使用返回键否定它。) )。实际上,我现在还通过其他技巧将其降低到104 =)
Mwr247

党...不错的工作:)我一直在清理我的,但总是在104结束了
ETHproductions

对我来说,突破是将长度/迭代变量通过向后串联来组合,并在初始化中定义心脏。我曾经尝试过,但积蓄很少,但是您简化了心脏操作,效率更高。
Mwr247

等一下......尝试,我得到Loves me not... Loves me... Loves me not! <3Loves me not... Loves me... Loves me not... Loves me. </3。我认为您必须更改其中一个条件来解决此问题。编辑:哦,只需切换''' not'在第四行。
ETHproductions 2015年

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 randomrandint代替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的代码
nitro2k01 2015年

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哦,是的,那是我用过的Math.random()。猜猜现在没有必要了。
ETHproductions 2015年

5

Perl,85岁

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

5

Ruby,91个字节

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

5

通用Lisp 106104字节

(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和的循环列表,0subseq用于生成长度为[3,20]的列表(这是唯一不可移植的部分,subseq只有标准需要在正确的(即非循环)列表上进行操作)。

现在,我们的格式适用于1 0 1 0...长度为[3,20] 的列表

format指令说明:

~{ 遍历此列表

~[后跟任意数量的~;并以终止,~]将根据format参数的值选择第N个项目。在此使用此选项,以便a中的第一项~[为“不爱我”案例,第二项为“爱我”案例。请注意,使用~[分隔符~:;选择默认情况。

~#[~[除了参数是剩余参数的数量之外,其他功能类似。剩余的0个参数表示我们在最后,默认情况是打印...

~:* 将参数列表备份一个位置,这使我们可以打印正确的预告片。


1
这是#lisp IRC频道的共同努力。非常感谢phf提供了聪明的迭代格式字符串和subseq hack。
杰森

4

朱莉娅,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

取消高尔夫:

# 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 Shell,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==0i%2<1
  • -loop的{ ... }大括号修剪后for,将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")));}}

取消高尔夫:

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
通过删除public,可以节省13个字节。
发光的

@Luminous我仍然需要保留一个main()……
hjk 2015年

@TimmyD我第二个。
RK。

4

C,123、121、109106个字符(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"));}

在1f494处还有一个心碎的 Unicode点,但是我很难找到实现它的字体。


显示了120个字符和122个字节...
AdmBorkBork

1
我认为您不需要O=0,因为C将int自动初始化为0
FryAmTheEggman

@FryAmTheEggman很好找到!在以前的版本中,我在main(o,O)必须对其进行初始化的位置输入了O。
詹斯(Jens)2015年

很好,我喜欢!我没想到使用time随机数...聪明!
MatthewRock

@MatthewRock如果您考虑一下,所有其他使用程序srand(time(0))都会以相同的频率更改其答案。这个名言是完全没用的:-)
詹斯(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个字节,只是用来获取随机数。

非常感谢泥泞鱼鱼苗奥尔普的帮助。

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

您可以在一行中执行range语句。您也可以这样做import random as r
蓝色

您还可以将最后一个打印语句的内容放在上面的行中。
蓝色

我想,你可以改变print'</3'if i%2 else'<3',以print['<3','</3'][i%2]节省3个字节。
卡德(Kade)2015年

是的,的确可以。谢谢!
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

Edit2-忘记了我可以for()通过流水线打高尔夫球... durr ...

不是太寒酸。使用内联代码执行块$(...)for()循环时动态调整打印的字符串。请注意,由于此操作使用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的帮助。另外,感谢所有评论,它们非常有帮助。


Humn ..刚意识到它的3到20。可能会再增加2个字节...j=3+(int)(rand()*17.0/RAND_MAX)
wendelbsilva 2015年

您可以通过更换节省了大量的#define c coutusing namespace std;通过auto&c=std::cout;
本·福格特

还可以用int i=0,j=rand()*20.0/RAND_MAX;while(i<j)
Ben Voigt 2015年

您好,发现了一个错误:最后一行应该是“爱我!”,而不是“爱我”。
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那里窃取它。同时,其他人也发布了该解决方案。[耸耸肩]
DLosc

我没有注意到有人发布它,但是我很确定我的评论是其中第一条评论,因此,如果您想使用它,可以使用它: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])

不打高尔夫球

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:将for循环更改为sapply,并在最后一行字符串中包含了心形符号。
编辑3:删除了,{}然后更改+(x==k)*2+2*!x<k
编辑4:返回for循环,并()(i%%2)+1
编辑5:me删除了4次,然后删除了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。还要注意,这不能正确处理最后一行;应该有一个.!而不是...。(请参阅问题中的示例输出。)
Alex A.

1
@AlexA。您也不需要x%%2>0;也可以。只是x%%2
Flounderer

好点,谢谢。我需要回过头来修正结局
Eric Brooks 2015年

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个字节),使i和j成为默认类型的全局变量(-8个字节,由于j中的默认值为0,所以增加了-3个),使用0而不是NULL(-3)。其他事情-仅使用一个变量并使循环倒计数。打高尔夫球时通常不需要导入stdio。
aragaer 2015年

1

Python 2,115字节

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个字节

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

取消高尔夫:

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

pyth和cjam的48,49字节...哇:)


将$ i%2 == 0更改为$ i%2 <1(x2),将$ i%2!= 0更改为$ i%2> 0(x2)
Marek Bettman

事实证明,三元运算符并非始终是最佳答案:)
Marek 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,并且感谢您指出了空格的必要性,实际上并不需要它!
丹尼

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

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

答案已经打了。


您的解决方案当前为458个字节,而不是523 个字节。您可以通过删除不必要的空格并缩短变量名来提高得分。有关示例,请参见其他Hassium解决方案
Alex A.

1
正如我在其他Hassium答案中所指出的那样,随机数生成器似乎有很大的偏差。我用最新版本运行了500次,但只有两次</3
丹尼斯2015年

+ Dennis随机数生成器直接建立在C#随机数生成器的顶部。请参阅:github.com/HassiumTeam/Hassium/blob/master/src/Hassium/...
雅各布Misirian

3
它似乎没有正确播种。如果执行rnd = new Random();rnd.next(0,2);1000次,则分配正常。但是,如果执行rnd = new Random();一次和执行rnd.next(0,2);1000次,我总是得到533 0秒和467 1秒。
丹尼斯

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

取消高尔夫:

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

Jelly,55个字节(不竞争?)

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

在线尝试!

像往常一样,果冻很烂。


1

PowerShell85 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。谢谢!
疯狂
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.