Учитывая непустой массив натуральных чисел, «увеличить» его один раз следующим образом:
Если все элементы массива равны, добавьте a
1
в конец массива. Например:[1] -> [1, 1] [2] -> [2, 1] [1, 1] -> [1, 1, 1] [3, 3, 3, 3, 3] -> [3, 3, 3, 3, 3, 1]
Иначе, увеличивайте первый элемент в массиве, который является минимальным значением массива. Например:
[1, 2] -> [2, 2] [2, 1] -> [2, 2] [3, 1, 1] -> [3, 2, 1] -> [3, 2, 2] -> [3, 3, 2] -> [3, 3, 3] [3, 4, 9, 3] -> [4, 4, 9, 3] -> [4, 4, 9, 4] -> [5, 4, 9, 4] -> [5, 5, 9, 4] -> ...
(Каждый ->
представляет один шаг, и это все, что нужно сделать вашей программе.)
Выведите результирующий увеличенный массив.
Самый короткий код в байтах побеждает.
code-golf
number
arithmetic
array-manipulation
integer
Кальвин Хобби
источник
источник
Ответы:
Желе ,
87 байтПопробуйте онлайн! или проверьте все контрольные примеры .
Как это работает
источник
Python 3,
62535150 байтФункция, которая изменяет переданный ей список ( разрешенный мета ).
Попробуйте на repl.it!
-9 байт, спасибо Линн за то, что он обнаружил, что, поскольку массив будет иметь положительные целые числа, я могу добавить '0' в конец массива и увеличить его.
Отдельное спасибо mbomb007 для игры в гольф ,
len(set(a))
чтобыlen({*a})
и Деннис для floordiv трюка!источник
len({*L})<2
чтобы найти, все ли элементы списка равны.a+=1//len({*a})*[0]
должен сохранить байт.JavaScript (ES6), 61 байт
Выводы путем изменения его аргумента . Я не могу найти способ определить, есть ли в массиве только один уникальный элемент длиной менее 17 байт, но предложения приветствуются.
Тестовый фрагмент
Показать фрагмент кода
Другие попытки
Вот несколько альтернативных способов решить, имеет ли массив более одного уникального входа:
Оба из них
some
могут быть замененыfind
на..sort
было бы короче для нахождения минимума, если бы сортировка по умолчанию не была лексикографической (почему, JS, почему?):Я попробовал рекурсию, чтобы найти минимум, но это оказалось намного дольше:
И вот решение на основе строк, которое на первый взгляд показалось хорошей идеей: (ввод дается в виде массива в виде строки, например
"[1,2,3]"
)источник
Mathematica,
705755 байтПрактически все улучшения связаны с Мартином Эндером, который надрывает мою задницу при подходах к сопоставлению с образцом! Также JHM придумала практически такое же решение в то же время. (счетчик байтов использует кодировку ASCII)
Определяет функцию,
±
принимающую один аргумент списка. Если этот аргумент списка содержит некоторое количество копий одного и того же элемента (обнаруженногоx_..
и названногоp
), выведите список с1
добавлением. В противном случае, если этот аргумент списка имеет специальный элементy
(сx
нулем или несколькими элементами доy
иz
с нулем или несколькими элементами послеy
), который является не более чем минимальным из других элементов, выведите список сy
увеличенным значением. Любой экземпляр минимального элемента списка будет сопоставленy
, но, к счастью, Mathematica выбирает первый, который будет действовать.источник
±
это 2-байтовый символ, ваш код длиной 59 байт. Кроме того, должен быть пробел междуx_
и..
потому что Mathematica интерпретируетx_..
какx_. .
(который выдает ошибки). Плюс, инфиксная формаMin
(x~Min~z
) сделает эти 2 байта короче (что делает это решение идентичным одному из моих: p ...) Хорошо, вы можете взять кредит, потому что мое редактирование было позже, чем у вас ....±
в UTF-8 ( Mathematica по умолчанию использует UTF-8; try$CharacterEncoding
) - это двухбайтовый символ (U + 00B1).±
.$CharacterEncoding
установленWindowsANSI
CP1252 (который достаточно совместим с ISO 8859-1 для использования±
и·
может использоваться для одного байта).C ++ 14,
178 176 174 155 142135 байтовпредставление
вызов
ungolfed
Я впервые играю в гольф, помощь приветствуется.
РЕДАКТИРОВАТЬ: забыл упомянуть, что вы должны скомпилировать его по крайней мере
-std=c++11
-std=c++14
РЕДАКТИРОВАТЬ 2: Я понял, что я могу пропустить пространство во включенных
#include <list>
EDIT3: сохранил еще два байта, заменив
l.begin()
наbegin(l)
EDIT4: сохранил еще 19 (!) Байтов благодаря @Quentin (см. Его комментарий)
EDIT5: Квентин сбрил еще 13 байтов, спасибо!
РЕДАКТИРОВАТЬ 6: как указал TuukkaX, безымянные лямбда-функции / функции достаточно, поэтому я удалил
auto i=
в bytecountисточник
#include
строках.auto i=[](auto&l){...};
) сохраняет один байт (больше, если мы посчитаем забытый вами возвращаемый тип;)), использование^
вместо==
и замена операндов сохраняет другой.std::list
Итераторы, безусловно, являютсяstd::
классами, так что вы можете отказатьсяstd::
от обоихstd::count
иstd::min_element
благодаря ADL (-10).l.front()
также*b
(-7). Я заканчиваю с 120-байтовымauto i=[](auto&l){auto e=end(l),b=begin(l);l.size()^count(b,e,*b)?void(++*find(b,e,*min_element(b,e))):l.push_back(1);};
:)std::min_element
утверждает, что он возвращает первый наименьший элемент, так чтоfind()
это лишнее, это 11 байтов. В условном выражении использование пары круглых скобок и оператора запятой для принудительного обращения к правому выражениюint
короче, чем приведение левого кvoid
2 байтам. Это приводит кauto i=[](auto&l){auto e=end(l),b=begin(l);l.size()^count(b,e,*b)?++*min_element(b,e):(l.push_back(1),0);};
142 байтам :)05AB1E ,
212016 байтСохранено 4 байта благодаря Аднану .
Попробуйте онлайн!
объяснение
источник
DÙgi0¸«}ÐWksgÝQ+
тоже работает.ÝQ
сk
. Благодарность!Царапина,
2534 блоков +76 байтПринимает ввод как предопределенный массив целых чисел. Обратите внимание, что массивы 1-индексированы в Scratch.
В Python это будет выглядеть так: (Обратите внимание, что в отличие от Scratch, Python имеет 0-index)
источник
J,
2522 байтаОценивает анонимный глагол. Попробуйте онлайн!
объяснение
источник
MATL , 16 байт
Попробуйте онлайн! Или проверьте все тестовые случаи
Как это работает
источник
Mathematica, 56 байт
Использует именованную функцию
±
. Использует кодировку ISO8859-1Альтернативные решения (58 байт)
использование
источник
Haskell,
71 7062 байта@Zgarb сэкономил 8 байтов, спасибо!
Когда я начинал, я надеялся на какую-то изящную хитрость с завязыванием узлов, но путь @ Zgarb такой же удивительный.
источник
f(a:b)|(x,y:z)<-span=<<(<).minimum$a:b++[0|all(a==)b]=x++y+1:z
(->)r
, которая применяется к типу(->)r a = r->a
. Тогда из типовreturn:: a->r->a
и(>>=)::(r->a)->(a->r->b)->(r->b)
их реализации (смею ли я сказать?) Очевидно:return=const
иm>>=f = \r->f(m r)r
. Последнее именно то, что нужно, чтобы выразить что-то вродеspan(predicate_depending_on l)l
, упоминаяl
только один раз. Теперь мне нужно помнить это только тогда, когда мне это нужно.C #,
1231211207977 байтовИзменяет аргумент, переданный функции.
Спасибо Cyoce за сохранение 3 байта! ->
!Any
чтобыAll
,+=1
чтобы++
.Спасибо TheLethalCoder за сохранение колоссальных 43 байтов! -> Удален код сигнатуры метода. Удалены круглые скобки вокруг списка параметров.
источник
!l.Any(o=>o!=l[0]))
наl.All(o=>o==l[0])
?Any
вместо этогоAll
и подумал, что это не работает: D Спасибо!++
?Action<List<int>>
для удаления всего кода сигнатуры методаusing
s с помощью C #, поэтому я не верю, что это законно, чтобы отказатьсяusing System.Linq
. Если я не увижу явного утверждения, в котором говорится, что в этом нет необходимости, я останусь с этим. Спасибо за предложение, хотя! :)Perl 6 , 46 байт
(модифицирует входной массив и возвращает его)
Expanded:
источник
Желе, 9 байт
Спасибо Деннису за -2 байта.
Тело должно быть не менее 30 символов; вы вошли ... .
источник
Mathematica,
53 байта57 байтов59 байтовисточник
〚
и〛
являются 3-байтовыми символами. Кроме того, ваш код не работает, потому что{##,1}
часть подразумевает, что входные данные являются отдельными целыми числами (т.е.f[1, 2, 3]
), ноx=#
часть подразумевает, что входные данные являютсяList
(то естьf[{1, 2, 3}]
). Быстрое исправление было бы изменить ,x=#
чтобыx={#}
и принимать сырые целые числа в качестве входных данных, что делает ваш код длиной 59 байт.Equal@#
, хотя#==##
короче.R ,
72 6665 байтПопробуйте онлайн!
Инкремент выполняется с помощью
which.min
которого возвращает первое совпадение."[<-"
позволяет заменить значение и возвращает модифицированный вектор в одном вызове функции.-7 байт благодаря Джузеппе!
источник
!=
на-
!Рубин, 46 байт
Я чувствую, что есть лучший способ проверить, все ли элементы одинаковы
a.uniq.size<2
, но мне лень его найти.источник
a.uniq[1]
будет правдой, если есть разные ценности.a[a.index(a.min)]
вa[a.index a.min]
Октава,
696764 байтаНа самом деле сделать эту именованную функцию короче, чем использовать и то,
input
и другоеdisp
.Сэкономили 3 байта благодаря Луису.
Старый ответ, не используя функцию:
источник
R, 97 байт
Жаль, что синтакс
x=+1
не существует в R!Ungolfed:
источник
TI-Basic, 53 байта
источник
Matlab,
83,77, 71 байтЯ относительно новичок в коде гольфа, поэтому будьте добры! Я пытался использовать анонимные функции, но поиск в Google говорит, что вы не можете использовать операторы if / else и matlab не имеет троичных операторов, так что это лучшее, что я чувствовал, что мог сделать.
Изменить: Исправлено и сокращено (дважды!) Благодаря Stewie-Griffin
источник
sum(a)/length(a)==a(1)
не гарантирует, что все элементы равны, это только показывает, что среднее значение равноa(1)
. Более простой способ сделать это был быmean(a)==a(1)
.numel
на один байт корочеlength
, но, поскольку вы знаете, что все значения положительны, вы можете использовать,nnz
который еще короче (он все равно не даст правильного результата в этом испытании, но по крайней мере короче: P). Если вы принимаетеmin(a)
вызов перед циклом, вы можете использовать оба выхода из него и проверить, чтоall
элементыa
равныmin(a)
.~nnz(a(a~=a(1)))
это просто~nnz(a-a(1))
. Кроме того, вам не нужны скобки.if ~nnz(a-a(1));a=[a,1];else[~,I]=min(a);a(I)=a(I)+1;end
, Это должно быть на 5 байт короче (примечание: я не проверял это).range(a)
вместоnnz(a-a(1))
a
равно ли количество элементов в наименьшем значении в этом векторе. Векторa = [3 4 6]
приведет кtrue
, а векторa = [4 4 6]
приведет кfalse
. Я не думаю, что это будет полезно здесь ...?Clojure,
112100 байтК сожалению,
min-key
возвращает последний индекс наименьшего индекса, а не первый. Это работает для целочисленных входов и более коротких массивов, чем 10 ^ 9 элементов;)Изменить: Определение анонимной функции, используя
(apply = a)
вместо(= 1(count(set a)))
.Оригинал:
Менее хакерское 134-байтовое решение обращает вектор перед его обновлением, а затем обратно обратно:
источник
Java 8, 85 + 38 = 123 байта
Void лямбда принимает
List<Integer>
(на выходе видоизменен вход). Количество байтов включает в себя лямбда и необходимый импорт.Попробуйте онлайн
Это почти похоже на Python с этими методами импорта ...
источник
MATLAB,
6653 байтаВыход:
Инициализировать:
Последовательные пробеги:
источник
@(x) …
.SmileBASIC 3, 101 байт
Определяет операторную функцию,
I A
гдеA
находится наш целочисленный массив чисел. Вывод достигается путем изменения ввода (так как массивы являются ссылками.)источник
BREAK
сM=0
, потому чтоA
не может содержать0
такM==A[C]
никогда не будет правдой.SmileBASIC, 77 байт
источник
Pyth, 16 байт
Программа, которая принимает ввод списка и печатает результат.
Тестирование
Как это работает
источник
Haskell, 93 байта
f z|and$(==)<$>z<*>z=z++[1]|1>0=z#minimum z where(x:z)#m|x==m=x+1:z;(x:z)#m|1>0=x:z#m;[]#_=[]
Ungolfed:
Первоначальная попытка, попробуйте придумать что-то более сложное позже.
источник
where
?Чудо , 44 байта
Это не то, что я имел в виду, когда делал этот язык ... Он буквально хуже Perl с точки зрения читабельности!
Использование:
объяснение
Более читабельно:
В основном проверяет, делает ли удаление одного элемента из уникального подмножества аргумента список пустым. Если нет, то мы увеличиваем минимум массива. В противном случае мы просто объединяем 1 с аргументом.
источник
Котлин, 75 байтов
Изменяет аргумент функции.
Черт бы тебя побрал!
:MutableList<Int>
составляет только 17 байт. Я не думаю, что есть решение, по которому тип может быть выведен, к сожалению.источник