Beni seviyor, beni sevmiyor


45

Beni seviyor, beni sevmiyor

Bu basit çocuk oyunu eski, ama hala popüler. Şimdi 21. yüzyılda yaşadığımız için, onu dijitalleştirelim!

Şartname

Rasgele tohum üretemeyen bir dil kullanmıyorsanız, program giriş yapmamalıdır - bu durumda tohumu bir girdi olarak kabul etmenize izin verilir. Göreviniz, rasgele toplam 3 ila 20 satırlık bir çıktı verecek bir program yazmaktır: “Beni seviyor ...” ve “Beni seviyor ...” sırayla oyunda olduğu gibi (ve bir satır daha; okuma).

Ancak bazı kısıtlamalar var. Her satırı newline takip etmelidir. İlk satır "Beni seviyor ..." olmalı. Son satır ("Beni seviyor" veya "Beni sevmiyor") sırasıyla ünlem işareti veya tek bir nokta ile bitmelidir. Son satırdan sonra, “Beni sev!” Olmasına bağlı olarak yeni satırda bir kalp ( <3) veya kırık bir kalp ( </3) basmanız gerekir. veya "Beni sevmiyor." son cümleydi.

İzleyen boşluklara izin verilir.

Örnek çıktı

Çıktı:

Beni seviyor ...
Beni sevmiyor ... Beni
seviyor ...
Beni sevmiyor ... Beni
seviyor!
<3

Başka bir çıktı:

Beni seviyor ...
Beni sevmiyor ... Beni
seviyor ...
Beni sevmiyor.
</ 3

Bu , bu yüzden en kısa giriş kazanır!

Ayrıca, ilk meydan okumam :) İyi şanslar!


Satır sayısının dağılımına ilişkin herhangi bir kısıtlama var mı, yani düzgün bir şekilde rastgele mi olmalı, yoksa 3 ila 20 arasındaki tüm uzunlukların pozitif bir olasılığı olması yeterli mi?
Zgarb

Bunun hakkında düşünmedim, ancak herhangi bir dağıtımın iyi olduğunu söylerdim - bu yüzden aynı şekilde rastgele olmaları gerekmez .
MatthewRock

3 ila 20 ( [3, 20)) mi yoksa 3 (20 ( ) ila 3 [3, 20]) arasında mı?
orlp

1
@MatthewRock Kullanmak istediğimiz dil kendi başına rastgele bir sayı ekleyemiyorsa ne olur? Kullanıcı rastgele bir tohum tedarik edebilir mi?
mınxomaτ

3
@ minxomat Her neyse, bu sadece bir oyun. Devam et, kuralları değiştirdim.
MatthewRock

Yanıtlar:


23

Pyth, 54 53 51 50 48 bayt

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

%2tWZ"<</33Kalp baskısı için tasarruf 1. 1. Buna rağmen en iyisi olduğuna ikna olmadım.
FryAmTheEggman

@FryAmTheEggman İki tasarruf yaptı.
orlp

Son iki diziyi bir araya getirmek bir tane daha kurtarıyor, fakat benim yerine geçmek zorunda kaldım %.
FryAmTheEggman

@".!"Z%hZ"</3iki byte kaydeder
Jakube

Birkaç gündür giriş yapmadığım için bu cevabı kabul ediyorum. Tebrikler!
MatthewRock

23

CJam, 53 50 49 bayt

1 byte tasarruf için Dennis teşekkürler.

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

Burada test et.

açıklama

Kod, dizgiyi bit ve parçalar halinde programın sonunda otomatik olarak basılan istifin üzerine döküyor:

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.

biri CJam'ın kod-golf için özel olarak geliştirildiğini düşünebilir ^^ ^^
larkey 19

11
@larkey ama öyle ...
MatthewRock

@larkey CJam GolfScript'ten türetilmiştir ve GolfScript (adından da anlaşılacağı gibi) golf oynamak için tasarlanmıştır.
Chris Jester-Young,

@ ChrisJester-Young, yanaktan biraz dil biti ;-)
larkey

17

Brainfuck, 2766 bayt (şu anda geçersiz)

Sadece çünkü Sonradan ungolfed versiyonunu ekleyeceğim.

kod

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

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"

Numune

Çalıştırıldığında, program girişi bekleyen etkileşimli bir oturuma girer. Giriş bir sayı olmalıdır. Bu sayı bir tohum olarak kullanılır.

Tohum: 1 (rastgele sayı 5, 218.158.042 işlem alıyor)

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

Tohum: 3 (rastgele sayı 20, 463,253,048 işlem alır)

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

Sonucu hesaplamanızı öneririm 6, çünkü 2,105,900,375sonucu hesaplamak için yinelemeler yapılır :).

Derleme / Çalıştırma

Bunun için hızlı bir tercümana ihtiyacınız var. Test ettiğim hiçbir çevrimiçi tercüman çalıştırma hızını kaldıramaz. İps (saniye başına yineleme) daha fazla olmalıdır 100,000,000. Bu yüzden başka bir çözüm buldum.

Bu, Brainfuck'ta yazılmış, C'ye derleyici olan bir Brainfuck. Sen kullanmanızı öneririz saf C. I kodumu transpile için herhangi bir çevrimiçi tercüman kullanabilirsiniz brainfuck.tk . Kodumu stdin girişine yapıştırın, bu kodu kod girişine yapıştırın:

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

Kaynağı indirin ve derleyin:

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

Ayrıca çevrimiçi olarak C kodunun bir kopyasını da çalıştırabilirsiniz: via. CodingGround .

optimizasyonları

Hala yapılacak bazı işler var, ancak hücrenin yeniden kullanımı neredeyse en uygun seviyede.

Uyarılar

Kelimeleri veya cümleleri tohum olarak kullanabilirsiniz:

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
Brainfuck'ta bir PRNG yazma
cüretine

@TimmyD PRNG'leri BF'ye yazmanın daha iyi yolları vardır, ancak çoğu zamana dayalıdır (programı çalıştırın ve yürütmeyi bir noktada durdurun, ardından belleği okuyun), ancak bunun için kullanıcı etkileşimi ve karşı olan iki ayrı program gerekir kurallar.
mınxomaτ

3
Güzel sözde kod. Daha fazla insan bunu yapmalı, özellikle golf dillerinin yarısı bilmezseniz temelde okunamıyor.
The_Basset_Hound 16'15

3
Ne yazık ki çıktınız yanlış. Son olarak “Beni seviyor” ünlemiyle bir ünlem işaretiyle bitmeli (yani, “Beni seviyor!”) Ve “Beni sevmiyor” tek bir nokta ile bitmeli (“Beni sevmiyor”).
MatthewRock

1
RNG'nin bir sahte kodunu alabilir miyiz?
Beta Çürüme

7

Javascript (ES6), 119 104 99 98 bayt

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

İyi bir! Kalbi oluşturmak için ve muhtemelen her satırın oluşturulmasında dize birleştirmeyi kullanmak daha kısa olabilir. Cevabımdaki new Datenumarayı kullanırsam sorun olur mu?
ETHProductions

@ETHproductions Bana bu kalpleri haha ​​kullanarak iyi olduğun sürece devam et (neden uyarıcı kullanmamıştım ... nedense kendimi ok fonksiyonlarının daha kısa olacağına ikna ettim, ancak geri dönüşe ihtiyaç duymam da bunu olumsuzluyor.) .). Aslında şimdi sadece 104 gibi bazı diğer püf noktaları ile aldım =)
Mwr247 15:15

Dang ... güzel iş :) ben benimkini yeniden düzenleyerek tutmak, ancak her zaman 104 de sona
ETHproductions

Benim için atılım, uzunluk / yineleme değişkenini geriye doğru birleştirerek ve başlangıçtaki kalpleri tanımlayarak birleştirmekti. Bir süre önce az bir tasarrufla denedim, ancak kalbinizin sadeleştirilmesi çok daha etkili oldu.
Mwr247

Bekle bir dakika ... Bunu deniyorum, anladım Loves me not... Loves me... Loves me not! <3 ve Loves me not... Loves me... Loves me not... Loves me. </3. Bunu düzeltmek için şartlı şartlardan birini değiştirmeniz gerekeceğini düşünüyorum. EDIT: Oh, sadece ''ve ' not'dördüncü satırında geçiş yapın.
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]

Kullanımları from random import*yerine import randomve randintyerine randrangebirkaç byte kaydedin. Muhtemelen golf oynamak için bazı baytlar kalmıştır.


3
Değişiklik "LLoovveess mmee n o t"[i%2::2].strip()gereksiz yere karmaşık görünüyor. Yapamaz "Loves me"+~i%2*" not"mısın
xnor,

Hatta ["Loves me","Loves me not"][i%2]daha da uygun, çünkü artık karakterleri .strip()ve birkaç alanı boşa harcıyorsunuz . Ama evet, xnor kodunu kullanın
nitro2k01

6

Javascript (ES6), 110 102 bayt

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

Bu kısa ama eğlenceli küçük bir meydan okumaydı. Daha fazla kısaltmak mümkün olabilir. Bazı bayt tasarruf püf noktaları için Mwr247'ye teşekkürler!

repeat()105 bayt kullanan alternatif sürüm :

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 yerleşik isimler. Oh iyi. Önerilerinizi bekliyoruz!


Etkileyici yoğunlaşma. Yine de merak ediyorum, neden 18+3|0?
Mwr247

@ Mwr247 Ah, ah, bu benim kullandığım zamandı Math.random(). Sanırım şimdi gerekli değil.
ETHProductions

5

Perl, 85

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

5

Ruby, 91 bayt

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

5

Ortak Lisp 106 104 bayt

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

Bu, yalnızca uygun bir sırayı (örn. Cmucl, sbcl, clisp) kontrol etmeyen lisp'ler üzerinde çalışır, ccl, varsayılan güvenlik seviyesinde daireselliği kontrol eder ve hata verir. ecl sonsuza dek döngüde kalacak.

Açıklama:

#1=(1 0 . #1#)ihtiva eden bir yuvarlak bir liste üretir, 1ve 0ve subsequzunluğu [3,20] listesini (bu şekilde, sadece taşınabilir olmayan parçası yapmak için kullanılan subseqsadece (örneğin, dairesel olmayan) listelerinde çalışmak için standart gereklidir).

Formatımız şimdi bir 1 0 1 0...uzunluk listesi üzerinde çalışıyor [3,20]

formatYönergelerin açıklaması :

~{ bu listeyi tekrar eder

~[ve ardından herhangi bir sayı ~;ile sonlandırılırsa ~], format argümanının değerini temel alarak Nth öğesini seçer. Bu, burada bir ~[irade içindeki ilk maddenin “beni sevmiyor” davası ve ikincisi “beni seviyor” olacağı için kullanılır. ~[Bir ayırıcıyla birlikte ~:;varsayılan bir durum seçildiğini unutmayın.

~#[~[argüman hariç gibi çalışır , kalan argüman sayısıdır. 0 kalan argüman sonunda olduğumuz anlamına gelir, varsayılan durum yazdırmaktır...

~:* argüman listesini bir konum yedekler, bu da doğru karavanı basmamızı sağlar.


1
Bu #lisp IRC kanalı tarafından yapılan bir grup çalışmasıydı. Akıllı yinelemeli biçim dizgisi ve müteakip kesmek için phf'a çok teşekkürler.
Jason,

4

Julia, 98 bayt

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 kabuğu, 193 bayt

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 bayt

  • çevrilmiş i%2==0içini%2<1
  • Döngü { ... }için kesilmiş parantez for, hareketlie bildirimi döngüye
  • yeniden sipariş edilen şartlamalar
  • kaldırılmış değiştiricileri ve gereksiz parantezleri, elden geçirilmiş Randomkullanım ve artışi

Not: Bu sitede biçimlendirme için aşağıya newline eklenir, yukarıdaki sayı tek satırdır.

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
Herkesi kaldırarak 13 bayt kaydedebilirsiniz.
Işık

@Luminous Yine de bir tane tutmak zorunda kalacağım main()...
hjk

@TimmyD İkincisi.
RK.

4

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

(biraz ♥♥♥ hile ile ♥♥♥)

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

Ayrıca 1f494'te kırılmış bir kalp Unicode noktası var, ancak onu uygulayan bir yazı tipi bulmakta zorluk çektim.


Bu 120 karakter ve 122 bayt gösterir ...
AdmBorkBork

1
Sana ihtiyacım olduğunu sanmıyorum O=0, çünkü Cotomatik ilklendir int için 0?
FryAmTheEggman 16:15

@FryAmTheEggman İyi bul! Önceki bir sürümde, main(o,O)başlatılması gereken yerde O vardı.
Jens

Güzel, bunu sevdim! timeRasgele bir sayı kullanmayı düşünmedim ... Zeki!
MatthewRock

@MatthewRock Eğer düşünürseniz, kullanan diğer tüm programlar srand(time(0))cevaplarını aynı frekansta değiştirecektir. Srand tamamen işe yaramaz :-)
Jens

4

Python 2, 161 159 156 144 bayt

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]

Bu sadece rastgele sayıyı almak için 39 bayt.

Çamurlu deniz hayvanlarına , fryamtheeggman'a ve orlp'e yardımları için teşekkür ederim .

PYG , 109 bayt

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 deyimini tek bir satırda yapabilirsiniz. ayrıca yapabilirsinizimport random as r
Blue

Ayrıca son print deyiminin içeriğini yukarıdaki satıra koyabilirsiniz.
Mavi,

Bence 3 bayttan tasarruf print'</3'if i%2 else'<3'etmek print['<3','</3'][i%2]için değişiklik yapabilirsiniz .
Kade

Evet gerçekten yapabilirim; Teşekkürler!
Celeo

Teşekkürler! İlginçtir import random as r;a=r.randrange(3,21)ve import random;a=random.randrange(3,21)aynı uzunluktadır.
Celeo

3

PowerShell, 121 119 111 Bayt

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

Düzenleme - aslında "Loves me"beyan etmek yerine açıkça belirtilmesi daha kısadır$l

Edit2 - for()boru hatları ile golf döngüleri olabilir unuttum ... durr ...

O kadar da eski püskü değil. $(...)Basılı dizgiyi dinamik olarak ayarlamak için satır içi kod yürütme bloklarını kullanır for(). Bunun bir kaç baytı kurtarmak için Get-önünde bir örtülü kullanması nedeniyle Random, bunun bazı PowerShell sürümlerinde son derece yavaş çalışabileceğini unutmayın. Referans

Açıklama için aşağıda genişletilmiş:

# 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 bayt

C ++ da .. çünkü .. Neden olmasın? :)

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

Canlı: 210 193 184 168

Umarım değişikliklerimden herhangi birinin platforma bağlı olmadığını umuyorum.

Yardım için Ben Voigt'e teşekkürler . Ayrıca tüm yorumlar sayesinde çok yardımcı oldular.


Humn .. sadece 3 ile 20 arasında bir fark var. Bunu daha sonra düzelteceğim. Muhtemelen 2 bayt daha katar ...j=3+(int)(rand()*17.0/RAND_MAX)
wendelbsilva

Sen değiştirerek bir çok kaydedebilirsiniz #define c coutve using namespace std;tarafındanauto&c=std::cout;
Ben Voigt

Ayrıca bazılarını da kaydedinint i=0,j=rand()*20.0/RAND_MAX;while(i<j)
Ben Voigt

Merhaba, bir hata buldum: Son satır "Beni seviyor!" Değil, "Beni seviyor!" Olmalı.
MatthewRock

1
Tamam diyebilirim - C ve C ++ benzer. Ve şimdi bu kod Java'dan daha uzun ...
MatthewRock

3

Groovy, 110 bayt

Harika bir aşk türü:

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 bayt

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]

Sonuncusu hariç her Loves me( not)?birinin ...ve yeni bir satırın geldiğini gözlemleyin . Yani bu bir işe benziyor join.


Biraz geç ama ".!\n\n<</33"[n%2::2]2 bayt daha kısa.
FryAmTheEggman 17:15

@FryAmTheEggman Evet, bunu gördüm ama Loovjo'dan çalmamaya karar verdim. Bu arada başka birisi de tam olarak bu çözümü yayınladı. [omuz silkme]
DLosc

Ben fark başkasının ilanı vardı, ama ben eminim benim yorum P: Bunu kullanmak böylece isterseniz, bunun içinde olduğunu ilk oldu
FryAmTheEggman

2

R, 141 132 128 114 111 109 bayt

kod

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 kodundan ilham aldım .

Düzenleme 1: Şimdi kod, Martin'nin işaret ettiği gibi son noktalama işaretini doğru şekilde verir
Düzenleme 2: for döngüsünü saf bir şekilde değiştirdi ve kalpleri son satır dizisine dahil etti.
Düzenleme 3: Kaldırılan {}ve değiştirilen +(x==k)*2için +2*!x<k
Edit 4: döngü için Geri kaldırıldı ()gelen (i%%2)+1
Edit 5: Yazdı me4 kez kaldırıldısep=""


1

R, 119 111 105 bayt

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

Düzenlemeler 1,2: İki seçeneğin kodlanması açıkça yer tasarrufu sağlıyor.


1
Sen kullanarak bir bayt kaydedebilirsiniz =atama için yerine <-başka yaparak x%%2>0yerine x%%2==1. Ayrıca bunun son satırı doğru işlemeyeceğini unutmayın; olmalı .ya da !değil olmalı .... (Bkz.
Alex A.

1
@Alex A. İkisine de gerek x%%2>0yok; sadecex%%2
Flounderer

İyi puanlar, teşekkürler. Geri dönüp bitişi düzeltmem gerekiyor
Eric Brooks

1

C 226 bayt

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

(Biçimlendirme ile)

#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
Döndürme türünü main'ten (-5 bayt) kaldırın, i ve j'yi varsayılan türle (-8 bayt, -3, j'de varsayılan 0 olduğundan daha fazla) global hale getirin, NULL (-3) yerine 0 kullanın. Diğer şeyler - sadece bir değişken kullanın ve döngüyü geri saymaya devam edin. Golf oynarken genellikle stdio almanıza gerek kalmaz.
aragaer

1

Python 2, 115 bayt

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 Bayt

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

Pyth ve cjam için 48,49 bayt ... vay :)


$ İ% 2 == 0 ila $ i% 2 <1 (x2) ve $ i% 2! =% 0 ila% i> 2> 0 (x2) değiştirildi
Marek Bettman

üçlü operatörlerin her zaman en iyi cevap olmadığı ortaya çıkıyor :)
Marek Bettman

1

mSL, 178 176 156 154 bayt

Düzenleme 1: Değiştirildi == 0için < 1
Edit 2: Kaldırılan gereksiz boşluk, teşekkürler Alexa!
Düzen 3: Kaldırılan parantezler

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
Çözümünüz şu anda 176 bayt, 177 değil. Tüm boşluklar gerekli mi? Değilse, yalnızca gereksiz boşlukları kaldırarak kodunuzu önemli miktarda kısaltabilirsiniz.
Alex A.

@AlexA. Ah, neden 177 yazdığımı bilmiyorum ve boşlukların gerekliliğine dikkat çektiğiniz için teşekkürler, gerçekten de gerekli değil!
Denny

1

Perl, 97 bayt

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

Okunabilir sürüm:

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

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

Cevap golf oynadı.


Çözümünüz şu anda 458 bayt , 523 değil. Gereksiz boşlukları kaldırarak ve değişken adlarını kısaltarak puanınızı artırabilirsiniz. Örnekler için diğer Hassium çözümüne bakın .
Alex A.

1
Diğer Hassium cevabında belirttiğim gibi, rasgele sayı üreteci son derece taraflı görünüyor. Bu 500 kez en son sürüm ile koştum ve sadece iki tane var </3.
Dennis,

+ Dennis Rastgele jeneratör doğrudan C # Rastgele sayı üretecinin üzerine inşa edilmiştir. Bakınız: github.com/HassiumTeam/Hassium/blob/master/src/Hassium/…
Jacob Misirian 16:15

3
Doğru ekilmiş gibi görünmüyor. rnd = new Random();rnd.next(0,2);1000 kez çalıştırırsam , dağıtım tamam demektir. Ancak, bir rnd = new Random();kez ve rnd.next(0,2);1000 kez uygularsam , her zaman tam olarak 533 0s ve 467 1s elde ederim .
Dennis,

1

C # (160)

Kod esinlenerek cevap dan HJK , kredi ona gider.

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 bayt

Muhtemelen çok daha fazla golf oynayabilir, ama şimdi burada:

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

Kod açıklaması ve asılsız olanlar:

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

Düzenleme: Bir boşluk bıraktı.



1

PowerShell , 85 88 bayt

+3 bayt teşekkürler Veskah: Bu iyi bir nokta.

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

Çevrimiçi deneyin!


1
Bu, özellikleri nasıl okuduğumda, minimum satır sayısının altında olan "Beni Seviyor, Beni Sevmiyor </ 3" ü oluşturabilir.
Veskah

Gerçekten de of *3* to 20 lines inclusive. Teşekkürler!
mazzy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.