Любит меня, не любит меня
Эта простая детская игра старая, но все еще популярная. Поскольку мы живем в 21 веке, давайте оцифруем его!
Спецификация
Программа не должна принимать никаких входных данных, если только вы не используете язык, который не может генерировать случайное начальное число - в этом случае вам разрешено брать начальное число в качестве входных данных. Ваша задача - написать программу, которая будет случайным образом выводить от 3 до 20 строк включительно: «Любит меня ...» и «Любит меня не ...» по очереди, как в игре (и еще одну строку; чтение).
Однако есть некоторые ограничения. Каждая строка должна сопровождаться символом новой строки. Первая строка должна быть «Любит меня ...». Последняя строка («Loves me» или «Loves me not») должна заканчиваться восклицательным знаком или одной точкой, соответственно. После последней строки вам нужно вывести в новой строке либо heart ( <3
), либо разрывное сердце ( </3
), в зависимости от того, "Loves me!" или "Не любит меня". было последнее предложение.
Конечные пробелы разрешены.
Пример вывода
Выход:
Любит меня ... не
любит меня ...
любит меня ... не
любит меня ...
любит меня!
<3
Еще один вывод:
Любит меня ... не
любит меня ...
любит меня ... не
любит меня.
</ 3
Это код-гольф , поэтому выигрывает самый короткий вход!
Также мой первый вызов :) Удачи!
источник
[3, 20)
) или от 3 до 20 ([3, 20]
)?Ответы:
Pyth,
5453515048 байтовисточник
%2tWZ"<</33
печать сердца спасает 1. Не уверен, что это лучший способ.%
.@".!"Z%hZ"</3
сохраняет два байтаCJam,
535049 байтовСпасибо Деннису за сохранение 1 байта.
Проверьте это здесь.
объяснение
Код просто сбрасывает строку в битах и кусочках в стек, который автоматически печатается в конце программы:
источник
Brainfuck, 2766 байт (в настоящее время недействительно)
Да просто так. Позже я добавлю версию без гольфа.
Код
ПСЕВДОКОД
Образец
При запуске программа входит в интерактивный сеанс, ожидая ввода. Ввод должен быть числом. Этот номер используется в качестве семени.
Семя: 1 (случайное число 5, занимает 218 168 042 операции)
Семя: 3 (случайное число 20, занимает 463 253 048 операций)
Я бы посоветовал вам не начинать
6
, так как2,105,900,375
для вычисления результата требуются итерации :).Компиляция / Запуск
Вам нужен быстрый переводчик для этого. Ни один онлайн-переводчик, которого я тестировал, не справился бы со скоростью выполнения. Число ips (итераций в секунду) должно быть больше, чем
100,000,000
. Поэтому я придумала другое решение.Это компилятор Brainfuck to C, написанный на Brainfuck. Вы можете использовать любой онлайн-переводчик для переноса моего кода на чистый C. Я предлагаю использовать brainfuck.tk . Вставьте мой код в ввод stdin, пропустите этот код во вводе кода:
Загрузите исходный код и скомпилируйте его:
Вы также можете запустить копию кода C онлайн здесь: через. CodingGround .
Оптимизации
Еще предстоит проделать определенную работу, но повторное использование клеток практически оптимально.
замечания
Вы можете использовать слова или фразы в качестве семени:
источник
Javascript (ES6),
1191049998 байтисточник
new Date
трюк в своем ответе?Loves me not... Loves me... Loves me not! <3
иLoves me not... Loves me... Loves me not... Loves me. </3
. Я думаю, вам придется изменить одно из условий, чтобы исправить это. РЕДАКТИРОВАТЬ: О, просто переключите''
и' not'
в четвертой строке.Питон, 147
Использует
from random import*
вместоimport random
иrandint
вместо того,randrange
чтобы сохранить несколько байтов. Вероятно, осталось несколько байтов для игры в гольф.источник
"LLoovveess mmee n o t"[i%2::2].strip()
кажется излишне сложным. Вы не можете просто сделать"Loves me"+~i%2*" not"
?["Loves me","Loves me not"][i%2]
более оптимально, так как вы теперь тратите впустую символы.strip()
и пару пробелов. Но да, используйте код xnorJavascript (ES6),
110102 байтаЭто было короткое, но забавное маленькое испытание. Может быть возможно сократить больше. Спасибо Mwr247 за некоторые трюки по экономии байтов!
Использование альтернативной версии
repeat()
, 105 байт:Darn JS 5 + -char встроенные имена. Ну что ж. Предложения приветствуются!
источник
18+3|0
?Math.random()
. Думаю, сейчас это не нужно.Perl, 85
источник
Рубин, 91 байт
источник
Common Lisp
106104 байтаЭто работает только на 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 оставшихся аргументов означает, что мы находимся в конце, регистр по умолчанию - это печать...
~:*
резервное копирование списка аргументов на одну позицию, что позволяет нам печатать правильный трейлер.источник
Юлия, 98 байт
Ungolfed:
источник
Оболочка UNIX, 193 байта
источник
Java,
210209203200177 байтперевернулi%2==0
наi%2<1
{ ... }
брекеты дляfor
-луп, переехалиe
объявление в циклRandom
использование и приращение дляi
Примечание: новая строка добавлена ниже для форматирования на этом сайте, подсчет выше для одной строки.
Ungolfed:
источник
main()
...C,
123, 121, 109106 символов (108 байтов)(с небольшим ♥♥♥ обманом ♥♥♥)
Есть также точка Unicode с разбитым сердцем на 1f494, но у меня были трудности с поиском шрифта, который его реализует.
источник
O=0
, потому чтоC
автоматическая инициализация int для0
?main(o,O)
где он должен был быть инициализирован.time
случайное число ... Умно!srand(time(0))
будут менять свой ответ с той же частотой. Сранд совершенно бесполезен :-)Python 2,
161159156144 байтаЭто 39 байтов, чтобы получить случайное число.
Огромное спасибо идиотам , фрайтхэгманам и орлпам за помощь.
PYG , 109 байт
источник
import random as r
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)
то же самое.PowerShell,
121119111 байтИзменить - на самом деле короче, чтобы явно включить,
"Loves me"
а не объявить$l
Edit2 - забыл, что я могу
for()
петли для гольфа , конвейерная ... durr ...Не слишком потрепанный. Использует встроенные блоки выполнения кода,
$(...)
чтобы динамически корректировать напечатанную строку, так как мы -for()
лупинг. Обратите внимание, что поскольку для сохранения пары байтов используется неявноеGet-
перед нимRandom
, это может работать очень медленно в определенных версиях PowerShell. СсылкаРасширены ниже для уточнения:
источник
C ++,
210193184168 байтВ С ++ .. потому что .. почему бы и нет? :)
Прямой эфир:
210193184168Просто надеюсь, что любые мои изменения не зависят от платформы.
Спасибо Бену Фойгту за помощь. Также, благодаря всем комментариям, они были очень полезны.
источник
j=3+(int)(rand()*17.0/RAND_MAX)
#define c cout
иusing namespace std;
поauto&c=std::cout;
int i=0,j=rand()*20.0/RAND_MAX;while(i<j)
Groovy, 110 байт
Отличный вид любви:
источник
Python 2, 117 байт
Заметьте, что за каждым
Loves me( not)?
следует...
символ новой строки, кроме последнего. Так что это похоже на работуjoin
.источник
".!\n\n<</33"[n%2::2]
на 2 байта короче.R,
141132128114111109 байтКод
Ungolfed
Я черпал вдохновение из кода Эрика Брукса .
Редактировать 1: Теперь код правильно выводит последнюю пунктуацию, как указал Мартин.
Редактировать 2: Изменил цикл for на sapply и включил сердца в последнюю строку строки.
Редактировать 3: удалил
{}
и изменил+(x==k)*2
на+2*!x<k
Редактировать 4: вернуться к циклу и удалил
()
из(i%%2)+1
Редактировать 5: написал
me
4 раза и удалилsep=""
источник
R
119111105 байтРедактирует 1,2: Кодирование двух вариантов явно экономит место.
источник
=
для назначения, а не<-
и другой, делаяx%%2>0
вместоx%%2==1
. Также обратите внимание, что это не обрабатывает последнюю строку правильно; должно быть.
или,!
а не...
. (См. Пример выходных данных в вопросе.)x%%2>0
; простоx%%2
C 226 байт
(С форматированием)
источник
Python 2, 115 байт
источник
PHP,
191187146165 байтUngolfed:
48,49 байт для pyth и cjam ... вау :)
источник
MSL,
178176156154 байтаРедактировать 1: Изменено
== 0
на< 1
Редактировать 2: Удалены ненужные пробелы, спасибо AlexA!
Изменить 3: Удалены круглые скобки
источник
Perl, 97 байт
Читаемая версия:
источник
Калий , 265 байт
Ответ был в гольфе.
источник
</3
.rnd = new Random();rnd.next(0,2);
1000 раз, распределение в порядке. Однако, если я выполняюrnd = new Random();
один раз иrnd.next(0,2);
1000 раз, я всегда получаю ровно 5330
с и 4671
с.C # (160)
Код вдохновлен ответом от HJK , кредит идет на него.
Ungolfed:
источник
Lua,
137132 байтаВероятно, можно играть в гольф намного больше, но здесь это пока:
Код объяснения и разгул:
Редактировать: отрубили некоторые пробелы.
источник
Желе , 55 байт (не конкурирует?)
Попробуйте онлайн!
Как обычно, желе сосет со струнами.
источник
PowerShell ,
8588 байт+3 байта спасибо Вескам: Это хороший момент.
Попробуйте онлайн!
источник
of *3* to 20 lines inclusive
. Благодарность!