Краткое изложение
Создайте программу, которая генерирует массив случайной длины со случайными числами, затем примените ряд правил, которые изменяют массив. После применения правил выведите сумму массива, если не указано иное.
Настройка массива
Массив должен иметь произвольную длину от 5 до 10 включительно, со случайными целыми числами от 1 до 20 включительно. Каждая длина массива должна иметь одинаковую вероятность появления, а каждое целое число должно иметь одинаковую вероятность выбора для каждого элемента.
7 правил
Правила должны действовать так, как если бы они применялись последовательно (например, правило 1 действует до правила 2) и применяются только один раз. Для подтверждения применения правила массив должен быть напечатан на консоли после каждого применения правила и один раз перед применением каких-либо правил.
- Если массив содержит 7, вычтите 1 из каждого элемента
- Если правило 1 применяется и массив теперь содержит 0, добавьте 1 к каждому элементу
- Если массив содержит 13, исключите 13 и все последующие элементы из массива
- Если массив содержит 2, исключить все нечетные числа
- Если массив содержит 20, а третий элемент четный, вернуть сумму 20 как сумму и завершить. Если присутствует 20, а третий элемент нечетный, вернуть сумму, в 20 раз превышающую длину массива в виде суммы, затем завершить.
- Если сумма больше 50, удаляйте последний элемент несколько раз, пока он не станет меньше или равен 50
- Если массив содержит 16, выведите сумму в десятичном и шестнадцатеричном виде.
пример
Вот начальный массив,
[20, 2, 5, 7, 14, 8]
Правило 1 может быть применено:
[19, 1, 4, 6, 13, 7]
Правило 3 применяется следующим образом:
[19, 1, 4, 6]
Никаких других правил не требуется, поэтому программа возвращает 30 в качестве суммы.
Заметки
- Я не опытный игрок в код, хотя могу сказать, что моя личная запись на Python 3 с 369 байтами .
- Правила не обязательно должны применяться по порядку, а должны действовать так, как будто они это сделали.
источник
[3 3 3 3 4 3]
и[4 4 3 4 4]
, каждый с вероятностью 50%, соответствует тому, что написано в разделе «Настройка массива». Так я могу просто выводить19
каждый раз? (Конечно, я действительно считаю, что определение «случайного» необходимо уточнить.)If the array contains a 20, and the third element is even/odd
Что делать, если массив имеет менее 3 элементов на этом этапе?Ответы:
Python 3,
294301287356 байтЯ не знаю, как вы собираетесь помешать людям обойти правила, но в этом используется указанная процедура.
+7 байт; спасибо @YamB за сохранение нескольких байтов; добавлено намного больше, чтобы исправить предыдущую ошибку.
-14 байт благодаря @RootTwo и мне, а также исправили ошибку.
+83 байта; это становится ужасно долго, потому что OP продолжает менять правила. небольшое количество байтов благодаря @ZacharyT
источник
k=[r(1,20)for _ in'-'*r(5,11)]
. Вы можете сохранить другой байт, используяk=[i+~-(1in k)*(7in k)for i in k]
правила 1 и 2.1
, и вы можете изменитьprint
на второй и третьей строки до последнейp
. И вы ... не обновили свой счет.05AB1E , 91 байт
Попробуйте онлайн! или с вводом
источник
Javascript (ES6),
344342340342335331333313311305298297290289283279 байтУра! Наконец
связаны сбиений Arnauld !После этого обмена * в комментариях к заданию и после долгих размышлений я решил использовать
new Date
вместо начального числа генератор случайных чиселMath.random()
. Это означает, что все целые числа в массиве будут иметь одинаковое значение.Попробуй
Array(x).fill()
на[...Array(x)]
.+1
на a~
.0
возврат для пустого массива.while
петлю.,
двух последних операторов на a|
и удаления вложенных()
.console.log
наalert
.a.includes()
.includes()
и просто используяindexOf()
все.s
переменной туда, где ей не нужна запятая.Math.random()
наnew Date
.Читаемая и тестируемая версия
console.log
вместоalert
вашего здравомыслия! (Лучше всего смотреть в консоли вашего браузера)Показать фрагмент кода
* Снимок экрана, если он удален:
источник
C (gcc) ,
621619593585570562557552529517500482461444442441438 байтЗдесь нужно много игры в гольф ... Исправлена ошибка, из-за которой она выводила шестнадцатеричное число один раз для каждых 16 в списке ...
Отдельное спасибо ZacharyT с помощью гольфа
Попробуйте онлайн!
источник
JavaScript (ES6),
296295290289 байтПолная программа, которая записывает начальный массив, промежуточные результаты и окончательную сумму на консоль.
Как это работает
Это было сжато, используя этот упаковщик JS .
Сломать:
226225 байт6964 байтаНиже приведен исходный код с некоторыми дополнительными пробелами и переводами строки для удобства чтения. Вместо того, чтобы применять стандартные уловки игры в гольф, он был написан так, чтобы производить как можно больше повторяющихся струн, чтобы угодить упаковщику. Например, синтаксис
if(k=~a.indexOf(N))
везде дублируется, хотяk
используется только в третьем правиле.Способы распаковки
Оригинальный код распаковки:
Все следующие варианты ES6 имеют одинаковый размер:
Единственный способ, который я нашел, чтобы сбрить несколько байтов, это использовать
for ... of
:источник
n&1^1
(он вообще не упаковывается, а на один байт короче!(n&1)
). Я думал об этом в какой-то момент и забыл включить его.Сначала попробуйте код гольф!
Уже победили другие javascripters! Dangit! Я улучшу!!! знак равно
Javascript ->
550402 байтаОпределенно может быть улучшено. Сжатый сейчас:
Originial:
источник
Java 7
622619618 байт-1 байт благодаря @Poke
Объяснение:
Примеры выходных данных:
комментарии за примерами выходных данных не распечатываются, но я добавил их в качестве пояснения.
Попробуй это здесь.
источник
List a = new ArrayList()
? Может сэкономить несколько байтов. Тем не менее, вам может потребоваться добавить приведение типа при выполнении реальной арифметики. Если нет,Long
корочеInteger
List
я должен использовать(int)
приведение пять раз, а также изменить цикл for-each сint
наObject
и добавить шестое приведение. Что же касаетсяLong
: спасибо, что сохраняет 1 байт :) (все равно придется изменить для каждого из-int
доlong
, иr.nextInt(20)+1
вr.nextInt(20)+1L
).Ruby 2.4, 260 байтов
Требуется Ruby 2.4 для
Enumerable#sum
.Попробуйте онлайн! (Ни repl.it, ни tio.run пока не поддерживают Ruby 2.4, поэтому эта онлайн-версия заменяется
sum
наinject(:+)
, которая ведет себя так же.)источник
R (3.3.1), 325 байт
Довольно наивная реализация; Я думаю, что я могу сделать это немного короче.
источник
PowerShell ,
525413 байтПопробуйте онлайн!
Я хотел попробовать этот вариант, хотя решил, что не смогу опередить ответы здесь: PI все еще пытался решить эту проблему, я уверен, что это возможно с меньшим количеством байтов. Найден лучший метод для гексагона, но, вероятно, все еще можно улучшить.
Пришлось
$a
приводить к строке так много раз, что было бы лучше создать фильтр для нее ...Было довольно много простых гольфов, которые я пропустил, таких как скобки и пробелы. Может еще быть там?
Несколько проще для чтения кода:
источник
MATLAB, 275 байт
Первоначально я планировал, возможно, однострочный ответ Octave, но требование вывода всех применяемых правил сорвало мои планы. Вместо этого, довольно простой ответ MATLAB с несколькими интересными оптимизациями, например, использование
cumsum
вместо очевидногоwhile
для правила 6. Тем не менее, большое количество байтов тратится впустую наif
s, чтобы предотвратить вывод, если правило не применяется.Попробуйте онлайн!
источник
Scala 587 байт на один лайнер
Scala, 763 байта как есть
источник
a: Array[T]
требуется ли место? У вас нет местаargs:Array[String]
, что и привело к моему запросу.MATLAB,
228241 байтЭто будет применять все правила по порядку, печатая значение массива после каждого шага.
Программа завершится сбоем по правилу 5, если полученное количество элементов будет меньше трех. В настоящее время нечего сказать, что должно произойти, если нет третьего элемента, поэтому я предполагаю, что сбой является приемлемым.Программа теперь напечатает 20, если есть менее 3 элементов, а один или более 20.Интересно, что шаг 2 может быть применен независимо от того, был ли шаг 1. Это связано с тем, что входной массив никогда не будет иметь 0, что означает, что если в массиве есть 0, то это должно быть результатом шага 1.
Все правила применяются по очереди, вплоть до 5, даже если не было внесено никаких изменений. В результате массив будет напечатан в начале, а затем после каждого шага до 5. После шага 5 вы либо получите сумму, если она будет применена, либо не получите вывод до окончания шага 6. После строки
a
может быть добавлена дополнительная строка, содержащая оператор else, обеспечивающий печать значения массива после шага 5 стоимостью 2 байта.Я также хотел бы отметить, что я не смотрел на другие ответы, пока не написал это. Теперь я вижу, что есть другой ответ MATLAB с некоторыми сходствами - все они совпадают.
источник
Python 3,
297, 293, 289, 278 байт.Как заметил Арно, вы не можете получить 0, если не применено правило 1, которое сохраняется при отступе. Спасибо всем, кто прокомментировал предложения тоже.
Попробуйте онлайн
источник
and
и~
.from random import* a=b=sample(range(1,20),randint(5,10))
сохраняет некоторые байты, так как вы можете удалить строку 2.Perl 6 , 246 байт
Ungolfed:
источник
Common Lisp, 490 байт
Здесь массив представлен в виде списка Common Lisp.
Как обычно, широко используются
and
и вor
качестве контрольных структур.источник