- Алиса (A) и Боб (B) решили сразиться.
- У каждого бойца 10 здоровья.
- Они по очереди бросают 6-ти сторонний кубик на повреждения.
- Этот урон снимается со здоровья противника.
- В конце концов, Алиса или Боб победят своего врага.
Покажите мне, как прошла битва. Вывод этих кодов для действий, которые произошли.
Атака
B a A
^ Combatant
^ Action (attack)
^ Target
Рулон
B r 4
^ Combatant
^ Action (roll)
^ Value
Изменение здоровья
A h 6
^ Combatant
^ Attribute (health)
^ Value
Выиграть
A w
^ Combatant
^ Action (win)
Пример вывода:
A a B
A r 4
B h 6
B a A
B r 6
A h 4
A a B
A r 6
B h 0
A w
Вот правила:
- Пишите на любом языке.
- Один бросок кубика должен иметь одинаковую вероятность получения любого из чисел 1, 2, 3, 4, 5 или 6.
- Алиса всегда начинается (Боб рыцарский, по старинке).
- Выведите действие для каждого хода.
- Вы должны сообщить об атаке, броске, уроне и победных действиях.
- Комбатанты прописные, действия строчные.
- Он не должен последовательно давать один и тот же результат.
- Между выходным комбатантом, действием и значением должен быть хотя бы один пробельный символ.
- Действие победы происходит, когда у противника ноль или меньше здоровья.
- Все части действия должны быть на одной линии.
- В каждой строке должно быть одно действие.
- Побеждает несколько байтов.
Имейте это!
Ответы:
05AB1E , 49 байтов
Попробуйте онлайн!
объяснение
источник
Python 3 , 131 байт
Попробуйте онлайн!
-8 байт благодаря
Officialaimm -2 байт благодаря ChooJeremy
источник
p=print
сэкономит вам около 8 байтов.randint(1,6)
можно заменить наid(X+Y)//3%6+1
, хотя распределение не совсем равномерное.C (gcc) ,
146141 байтПопробуйте онлайн!
Де-гольф:
источник
a=65+t,b=66-t
?A*B>0
сэкономит вам несколько байтов.A*B
сэкономит еще больше, но я как бы тороплюсь. ВечеромPython 3 , 127 байт
Это улучшение ответа @HyperNeutrino , которое не помещается в комментарии. Смотрите объяснение ниже.
Попробуйте онлайн!
Эпический квест для более короткого броска костей питона
TL; DR: можно сократить 4 байта от стандартного броска кубиков питона, используя шифрование RSA.
Я хотел посмотреть, можно ли немного укоротить стандартный бросок кубика питона ( 32 байта ):
В частности,
id(x)
довольно удобно вносить некоторую недетерминированную ценность в программу. Моя идея тогда состояла в том, чтобы как-то хэшировать это значение, чтобы создать некоторую фактическую случайность. Я попробовал несколько подходов, и один из них окупился: шифрование RSA .Шифрования RSA, благодаря своей простоте, требует только несколько байт:
m**e%n
. Следующее случайное значение может быть создано путем шифрования предыдущего. Предполагая, что(e,n)
ключ доступен, бросок костей может быть записан с 22 байтами :Это означает, что у нас есть около 10 байтов для определения правильного ключа RSA. Здесь мне повезло. Во время своих экспериментов я начал использовать простое число Мерсенна М67 только для того, чтобы потом осознать, что Мерсенн допустил ошибку, включив М67 в свой список. Оказывается, является продуктом
p=193707721
иq=761838257287
. Я нашел свой модуль:Теперь показатель степени и показатель Charmichael
(p-1)*(q-1)
должны быть взаимно простыми. К счастью, первое простое число, которое не делит число n, имеет длину только одну цифру: 7. Затем бросок костей может быть записан с использованием 28 байтов (на 4 байта меньше, чем при стандартном подходе):Одна хорошая вещь с M67 - то, что сгенерированное случайное значение имеет 66 битов, что больше, чем обычный 64-битный RNG. Кроме того, использование RSA позволяет вернуться назад во времени, расшифровав текущее значение несколько раз. Вот ключи шифрования и дешифрования:
Я определенно не эксперт в области статистики или криптографии, поэтому я не могу точно сказать, проверяет ли этот ГСЧ критерии «хорошей случайности». Я написал небольшой тест, который сравнивает стандартное отклонение вхождений от 1 до 6 бросков игральных костей с использованием разных ГСЧ. Кажется, что предлагаемое решение работает так же, как и другие.
источник
JavaScript (ES6), 122 байта
Попробуйте онлайн!
источник
Java (JDK 10) , 180 байт
Попробуйте онлайн!
кредиты
источник
var
? o.Ô Мне действительно нужно в ближайшее время изучить некоторые из новых спецификаций. В любом случае, вы можете сыграть в гольф 4 байта, изменив массив символов на int-массив:v->{var r="";int P[]={65,66},p=0,H[]={10,10},h=0;for(;H[0]*H[1]>0;)r+=r.format("%3$c a %4$c%n%3$c r %d%n%4$c h %d%n",h+=Math.random()*6-h+1,H[p]-=h,P[p],P[p^=1]);return r+=P[p^1]+" w";}
65 w
вместоA w
. Вот почему я извлек это изint ...
заявления: в гольф несколько байтов ;-)v->{var r="";int p=0,H[]={10,10},h=0;for(;H[0]*H[1]>0;)r+=r.format("%3$c a %4$c%n%3$c r %d%n%4$c h %d%n",h+=Math.random()*6-h+1,H[p]-=h,p+65,(p^=1)+65);return r+(p<1?"B":"A")+" w";}
( 181 байт )Perl 5 ,
938887 байтПопробуйте онлайн!
источник
Рубин ,
122 120 96 9291 байтСохранено 1 байт благодаря Asone Tuhid .
Попробуйте онлайн!
источник
["A", "a", "B"]
? Если так, у меня есть это 96-байтовое решение.?(p [x,?w]):
на?p([x,?w]):
Java 8, 230 байт
Примечание: ответ на Java уже намного короче, так что не забудьте его подтвердить ! Однако я использую совершенно другой подход, поэтому решил, что это тоже стоит опубликовать.
Объяснение:
Попробуйте онлайн.
источник
C (gcc) , 142 байта
Попробуйте онлайн!
источник
Пакет, 174 байта
Объяснение:
%
ссылки на переменные подставляются во время разбора. Это имеет два полезных преимущества:%d%-=r
вычитаетr
из переменной, названнойd
(то есть косвенная ссылка)set c=%d%&set d=%c%
это просто прямой обмен.источник
PHP 7.1: 159 байт
Запустите его в браузере здесь!
PHP 5.6: 156 байт
Запустите его в браузере здесь!
Вот как выглядит решение PHP 5.6 с форматированием и комментариями:
источник
Баш, 178 байт
источник
F #,
238235 байтЯ думал, что у меня все хорошо, но вы все намного превзошли меня!
Попробуйте онлайн!
Спасибо Rogem за блестящий совет использовать A * B> 0 вместо A> 0 && B> 0 (снимает 3 байта).
Спасибо также officialaimm, чей намек на предопределение printf в ответе Python помог мне также сбрить несколько байтов.
источник
A*B>0
спасет вас еще пару раз.Haskell , 204 байта
Моя попытка с Haskell, к сожалению, я не смог сделать ее более конкурентоспособной
Попробуйте онлайн!
Пояснения:
источник
where m=b-x
можно положить в охрану|m<-b-x=
.main=putStr=<<q"A "10"B "10.randomRs(1,6::Int)<$>getStdGen
. Вы также можете использовать список и объединить его, чтобы избавиться от переопределения(++)
. Последнее, где, кажется, не выгодно просто использоватьb-x
везде.Юлия 0,6 , 175 байт
Попробуйте онлайн!
Длинная, негольфированная версия:
источник
VBA,
222185179 байтЭто рекурсивное решение включает в себя 3 подпрограммы
p короче, чем Debug.Print, если его использовать более 3 раз (только 4 в этом решении).Редактировать: Теперь, когда я узнал, чтоDebug.?
это приемлемая альтернативаDebug.Print
,Debug.?x
короче, чем вызов Sub для печати.Это было забавное испытание. Если вам известен такой онлайн-переводчик, как TIO для VB6 / VBScript / VBA, пожалуйста, оставьте комментарий. Тогда я могу опубликовать ссылку на рабочее решение.
Если вы хотите протестировать этот код и установить Microsoft Excel, Word, Access или Outlook (только для Windows), нажмите Alt + F11, чтобы открыть IDE VBA. Вставьте новый модуль кода (Alt + I, M) и очистите Option Explicit. Затем вставьте код и нажмите F5, чтобы запустить его. Результаты должны появиться в «Немедленном окне» (нажмите Ctrl + G, если вы его не видите).
Редактировать 1: Удалены пробелы, в которые автоматически добавляется редактор VBA. Уменьшено на 37 байт
Редактировать 2: Удален Sub p () * для сохранения 6 байтов после обучения, что
Debug.?
является приемлемой альтернативойDebug.Print
. Вызов Sub для обработкиDebug.?
только сохраняет байты после более чем шести вызовов.источник