Любить мене, не любить мене


45

Любить мене, не любить мене

Ця проста дитяча гра стара, але все ще популярна. Оскільки ми зараз живемо у 21 столітті, давайте оцифруємо це!

Специфікація

Програма не повинна брати жодного вводу, якщо ви не використовуєте мову, яка не може генерувати випадкові насіння - у такому випадку вам дозволяється приймати насіння як вхід. Ваше завдання - написати програму, яка буде виводити випадковим чином загалом від 3 до 20 рядків включно: "Любить мене ..." і "Любить мене не ..." по черзі, як у грі (і один додатковий рядок; тримай читання).

Однак існують деякі обмеження. Кожен рядок повинен супроводжуватися новим рядком. Перший рядок повинен бути "Любить мене ...". Останній рядок (або "Любить мене", або "Не любить мене") повинен закінчуватися знаком оклику або однією крапкою відповідно. Після останнього рядка у новому рядку потрібно вивести або серце ( <3), або розбите серце ( </3), залежно від того, "любить мене!" або "Не любить мене". було останнє речення.

Доступні пробіли з пробілами дозволені.

Приклад Вихід

Вихід:

Любить мене ...
любить мене не
любить ...
любить мене не
любить ... любить мене!
<3

Інший вихід:

Любить мене ... не
любить мене ...
любить мене ... не
любить мене.
</ 3

Це , тому найкоротший запис виграє!

Також мій перший виклик :) Удачі!


Чи існують обмеження щодо розподілу кількості рядків, тобто, чи має бути рівномірно випадковий вигляд, чи достатньо, щоб усі довжини між 3 та 20 мали позитивну ймовірність?
Згарб

Я не думав про це, але скажу, що будь-який розподіл є нормальним - тому вони не повинні бути однаково випадковими.
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 байт

Завдяки Деннісу за збереження 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 це було трохи
тріском

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 to C, написаний Brainfuck. Ви можете використовувати будь-який онлайн-перекладач, щоб перевести мій код на чистий 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 за сміливість написати PRNG у Brainfuck ...
AdmBorkBork

@TimmyD Існують кращі способи запису PRNG в BF, але більшість з них засновані на часі (запустіть програму і зупиніть виконання в якийсь момент, а потім прочитайте пам'ять), але це вимагатиме взаємодії з користувачем та двох окремих програм, що проти правила.
mınxomaτ

3
Гарний псевдокод. Більше людей повинні робити це, тим більше, що половина мов для гольфу в основному нечитабельна, якщо ви їх не знаєте.
The_Basset_Hound

3
На жаль, ваш результат неправильний. Останнє «Любить мене» має закінчуватися знаком оклику (так, «Люби мене!»), А «Любить мене не» має закінчуватися одинарною крапкою («Любить мене не»).
MatthewRock

1
Чи можемо ми мати якийсь псевдокод 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. Я думаю, вам доведеться змінити один із умов, щоб виправити це. EDIT: О, просто переключіть ''і ' not'на четвертий рядок.
ETHproductions

6

Пітона, 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
nitro2k01

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?
M24r

@ Mwr247 О, так, це було з того часу, коли я використовував Math.random(). Здогадайтесь, зараз це не потрібно.
ETHproductions


5

Рубін, 91 байт

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

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директив:

~{ повторює цей список

~[після чого будь-яка кількість ~;і закінчується з ~]вибором N-го елемента, виходячи зі значення аргументу формату. Це використовується тут, щоб першим пунктом у ~[заповіті був випадок "любить мене не", а другий - випадок "любить мене". Зауважте, що з ~[роздільником ~:;вибирає регістр за замовчуванням.

~#[працює як, ~[крім аргументу, кількість аргументів, що залишилися. 0 решти аргументів означає, що ми в кінці, справа за замовчуванням - це друк...

~:* створює резервну копію списку аргументів на одній позиції, що дозволяє нам надрукувати правильний трейлер.


1
Це було груповим зусиллям на каналі #lisp IRC. Величезне спасибі phf за розумний ітеративний формат-рядок та хакер підсекцій.
Джейсон

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

Безголівки:

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 Я другий, що.
РК.

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автоматично ініціалізувати вставки до 0?
FryAmTheEggman

@FryAmTheEggman Хороша знахідка! У попередній версії я мав O main(o,O)там, де його потрібно було ініціалізувати.
Єнс

Приємно, мені це подобається! Я не думав використовувати timeяк випадкове число ... Розумний!
MatthewRock

@MatthewRock Якщо ви подумаєте про це, всі інші програми, що використовують srand(time(0)), змінять свою відповідь з однаковою частотою. Сранд абсолютно марний :-)
Єнс

4

Пітон 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])

Виконувати діапазон можна в одному рядку. ви також можете зробитиimport random as r
Blue

ви також можете помістити вміст останнього твердження про друк на рядок вище.
Синій

Я думаю , що ви можете змінити , print'</3'if i%2 else'<3'щоб print['<3','</3'][i%2]врятувати 3 байта.
Каде

Так, я справді можу; Дякую!
Селео

Дякую! Цікаво, що import random as r;a=r.randrange(3,21)і import random;a=random.randrange(3,21)однакової довжини.
Селео

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 байт

У С ++ .. бо .. Чому ні? :)

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

Live: 210 193 184 168

Просто сподіваюся, що будь-які мої зміни не залежать від платформи.

Дякую Бену Вогту за допомогу. Також завдяки всім коментарям вони були дуже корисними.


Осінь .. просто зрозумій свої 3 до 20. Я це виправлю пізніше. Можливо, додасть ще 2 байти ...j=3+(int)(rand()*17.0/RAND_MAX)
wendelbsilva

Ви можете заощадити багато, замінюючи #define c coutі using namespace std;поauto&c=std::cout;
Бен Voigt

Також заощаджуйтеint i=0,j=rand()*20.0/RAND_MAX;while(i<j)
Ben Voigt

Привіт, знайшли помилку: Останній рядок має бути "Любить мене!", А не "Любить мене".
MatthewRock

1
Я б сказав, що це нормально - C і C ++ схожі. І зараз цей код довший, ніж у Java ...
MatthewRock


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 Так, я це бачив, але вирішив не красти його з Лоуджо. Тим часом хтось ще розмістив саме таке рішення. [
знизує

Я не помічав, щоб хтось інший розміщував це повідомлення, але я впевнений, що мій коментар був першим, хто мав його, тому ви можете використовувати його, якщо хочете: 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)

Я взяв натхнення у коду Еріка Брукса .

Правка 1: Тепер код правильно виводить останні розділові знаки, як вказував Мартін
Правка 2: Змінив цикл for на саппл і включив серця всередині останнього рядка рядка.
Редагування 3: Вилучені {}і змінив +(x==k)*2до +2*!x<k
Edit 4: Повернення до цикл і видаляють ()з (i%%2)+1
Edit 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. Також зауважте, що останній рядок не обробляється правильно; має бути .або, !а не чим .... (Див. Приклад виведення у запитанні.)
Алекс А.

1
@ Алекс А. Вам також не потрібно x%%2>0; простоx%%2
Flounderer

Хороші бали, дякую. Мені потрібно повернутися і виправити закінчення
Ерік Брукс

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
Видаліть тип повернення з основного (-5 байт), зробіть i і j глобальними з типовим типом (-8 байт, -3 більше через типовий 0 в j), використовуйте 0 замість NULL (-3). Інші речі - використовуйте лише одну змінну і зробіть певний відлік циклу. Імпорт stdio зазвичай не потрібен при гольфі.
араґер

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

48,49 байт для pyth і cjam ... ого :)


Змінено $ i% 2 == 0 на $ i% 2 <1 (x2) та $ i% 2! = 0 до $ i% 2> 0 (x2)
Марек Беттман

Виявляється, потрійні оператори не найкраща відповідь у всі часи :)
Марек Беттман

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. Чи потрібен весь пробіл? Якщо ні, ви можете скоротити код на значну кількість, просто видаливши зайвий пробіл.
Олексій А.

@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 для прикладів.
Олексій А.

1
Як я зазначив в іншій відповіді Hassium, генератор випадкових чисел здається надзвичайно упередженим. Я пробігав це 500 разів із останньою версією і отримав лише дві </3.
Денніс

+ Dennis Генератор випадкових випадків побудований безпосередньо поверх генератора випадкових чисел C #. Дивіться: github.com/HassiumTeam/Hassium/blob/master/src/Hassium/…
Яків Місіріан

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

Луа, 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 байт спасибі Веска: Це хороший момент.

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

Спробуйте в Інтернеті!


1
Це може створити "Люби мене, любить мене не </ 3", який, виходячи з того, як я читаю характеристики, знаходиться нижче мінімальної кількості рядків.
Веська

Справді of *3* to 20 lines inclusive. Дякую!
маззи
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.