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


45

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

Эта простая детская игра старая, но все еще популярная. Поскольку мы живем в 21 веке, давайте оцифруем его!

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

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

Однако есть некоторые ограничения. Каждая строка должна сопровождаться символом новой строки. Первая строка должна быть «Любит меня ...». Последняя строка («Loves me» или «Loves me not») должна заканчиваться восклицательным знаком или одной точкой, соответственно. После последней строки вам нужно вывести в новой строке либо heart ( <3), либо разрывное сердце ( </3), в зависимости от того, "Loves me!" или "Не любит меня". было последнее предложение.

Конечные пробелы разрешены.

Пример вывода

Выход:

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

Еще один вывод:

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

Это , поэтому выигрывает самый короткий вход!

Также мой первый вызов :) Удачи!


Существуют ли какие-либо ограничения на распределение числа линий, т. Е. Должно ли оно быть равномерно случайным или достаточно, чтобы все длины от 3 до 20 имели положительную вероятность?
Згарб

Я не думал об этом, но я бы сказал, что с любым распределением все в порядке, поэтому они не должны быть равномерно случайными.
MatthewRock

Это от 3 до 20 ( [3, 20)) или от 3 до 20 ( [3, 20])?
orlp

1
@MatthewRock Что если язык, который мы хотим использовать, сам по себе не может создать случайное число? Может ли пользователь предоставить случайное семя?
mynxomaτ

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 был бы разработан исключительно для code-golf ^^
Ларки

11
@larkey, но это ...
MatthewRock

@larkey CJam является производным от GolfScript и GolfScript (как следует из названия) является предназначен для игры в гольф.
Крис Джестер-Янг

@ ChrisJester-Янг, это было немного
насмешливо

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, но большинство из них основаны на времени (запустите программу и остановите выполнение в какой-то момент, затем прочитайте память), но для этого потребуется взаимодействие с пользователем и две отдельные программы, что против правила.
Mynxomaτ

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. Я думаю, вам придется изменить одно из условий, чтобы исправить это. РЕДАКТИРОВАТЬ: О, просто переключите ''и ' 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?
Mwr247

@ 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

Common 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

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-луп, переехали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 байтов, удалив public.
Световой

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

@FryAmTheEggman Хорошая находка! В предыдущей версии у меня был O, main(o,O)где он должен был быть инициализирован.
Дженс

Прекрасно, мне это нравится! Я не думал использовать timeслучайное число ... Умно!
MatthewRock

@ MatthewRock Если вы подумаете об этом, все другие программы, использующие другие, srand(time(0))будут менять свой ответ с той же частотой. Сранд совершенно бесполезен :-)
Дженс

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

Вы можете сделать оператор диапазона в одной строке. Вы также можете сделатьimport random as r
Blue

Вы также можете поместить содержимое последнего оператора печати в строку выше.
синий

Я думаю , что вы можете изменить , print'</3'if i%2 else'<3'чтобы print['<3','</3'][i%2]спасти 3 байта.
Каде

Да, действительно, я могу; Благодарность!
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 байт

В С ++ .. потому что .. почему бы и нет? :)

#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

Просто надеюсь, что любые мои изменения не зависят от платформы.

Спасибо Бену Фойгту за помощь. Также, благодаря всем комментариям, они были очень полезны.


Хамн .. просто поймите, что это 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)
Бен Фойгт

Здравствуйте, обнаружил ошибку: последняя строка должна быть "Любит меня!", А не "Любит меня".
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 Да, я видел это, но решил не красть его у Loovjo. Тем временем кто-то другой опубликовал именно это решение. [
пожимает

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

Я черпал вдохновение из кода Эрика Брукса .

Редактировать 1: Теперь код правильно выводит последнюю пунктуацию, как указал Мартин.
Редактировать 2: Изменил цикл for на 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. Также обратите внимание, что это не обрабатывает последнюю строку правильно; должно быть .или, !а не .... (См. Пример выходных данных в вопросе.)
Алекс А.

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

Хорошие моменты, спасибо. Мне нужно вернуться и исправить окончание
Эрик Брукс

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). Другие вещи - используйте только одну переменную и, возможно, сделайте обратный отсчет цикла. Импортная студия обычно не требуется при игре в гольф.
aragaer

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

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)
Марек Беттман

Оказывается, троичные операторы не лучший ответ во все времена :)
Марек Беттман

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

Калий , 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. Вы можете улучшить свой результат, удалив ненужные пробелы и сократив имена переменных. Смотрите другой раствор калия для примеров.
Алекс А.

1
Как я заметил в другом ответе Халия, генератор случайных чисел выглядит предвзятым. Я запустил это 500 раз с последней версией и получил только две </3.
Деннис

+ Деннис Генератор случайных чисел построен непосредственно над генератором случайных чисел в C #. См. Github.com/HodiumTeam/Hodium/blob/master/src/Hodium/…
Джейкоб Мисириан,

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

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

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

Попробуйте онлайн!


1
Это может привести к тому, что «Loves me, Loves me not </ 3», который, исходя из того, как я читаю спецификации, находится ниже минимального количества строк.
Веска

Действительно of *3* to 20 lines inclusive. Благодарность!
Маззи
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.