Напишите функцию (например, placeAt
), которая принимает массив неотрицательных целых чисел и индекс, который является неотрицательным целым числом. Он должен ставить 1 по данному индексу, возможно, сдвигая другие записи на одно место, чтобы освободить это место, а 0 означает пустые места.
- Если запись с нужным индексом равна 0, заполните ее 1.
- В противном случае ищите ближайший 0 слева от индекса. Сдвиньте записи на одну позицию слева в это 0, чтобы освободить место, затем заполните индекс 1.
- Если слева нет 0, сделайте то же самое, двигаясь направо.
- Если ни то, ни другое невозможно (т. Е. Если нет 0), вернуть массив без изменений.
Элементы с 0 индексами. Имя функции может быть чем угодно.
Примеры:
(Буквы обозначают любые положительные целые значения.)
[a, b, 0, c, d, 0] placeAt 2 // output [a, b, 1, c, d, 0] place 2 is 0, just fill
[a, b, 0, c, d, 0] placeAt 3 // output [a, b, c, 1, d, 0] place 3 is filled, shift items left
[a, b, 0, c, d, 0] placeAt 0 // output [1, a, b, c, d, 0] place 0 is filled, can't shift left, shift items right
[a, b, 0, c, d, 0] placeAt 1 // output [a, 1, b, c, d, 0] place 1 is filled, can't shift left, shift items right
[0, a, b, 0, c, d, 0] placeAt 2 // output [a, b, 1, 0, c, d, 0] place 2 is filled, shift items left
[0, a, b, 0, c, d, 0] placeAt 4 // output [0, a, b, c, 1, d, 0] place 4 is filled, shift items left (notice you keep shifting up until a 0)
[0, 2, 0, 2] placeAt 3 // output [0, 2, 2, 1] place 3 is filled, shift items left
Это кодовый вызов для гольфа. Самый короткий вход в конце 9 дней побеждает.
0
?[0, 2, 0, 2] placeAt 3
законно ли выводить[2, 0, 2, 1]
? Требуется ли код для вызова функцииplaceAt
? Обратите внимание, что некоторые языки не имеют функций. «Брось исключение» также может не относиться к некоторым языкам; Я бы предложил разрешить вывод, указывающий на ошибку.[2, 0, 2, 1]
это недопустимый вывод, так как вы всегда должны сдвигать как можно меньше элементов, и вы можете называть функцию как хотите.Ответы:
JavaScript (ES6), 85
Протестируйте выполнение сниппета в любом браузере, совместимом с EcmaScript 6 (в частности, не Chrome, не MSIE. Я тестировал на Firefox, Safari 9 мог пойти)
(Я нашел это, не глядя ни на один из других ответов, теперь я вижу, что он очень похож на ответ катка. И все же довольно короче. Вероятно, я не получу много голосов за этот)
источник
splice
лучше, чем моя запятаяЮлия, 122 байта
Просто наивная реализация спецификации для начала работы.
Ungolfed:
источник
JavaScript (ES6), 98 байт
Примерно такой же подход, как и в моем ответе CoffeeScript, но я закорачиваюсь до крайности, чтобы сохранить
return
утверждение:объяснение
Для простоты я немного перестроил свой код:
Вот некоторая информация об оценке короткого замыкания JS.
демонстрация
На данный момент эта демонстрация работает только в Firefox и Edge из-за использования ES6:
источник
f(['a', 'b', 0, 'c', 'd', 0], 2)
[a..b]
.f(['a', 'b', 0, 'c', 'd', 0], 1)
Рубин, 208 байт
источник
.rindex 0
, сохранить один байт каждый раз. Вы можете также сохранить некоторые байты , используя процедурный вместо метода, который даже не должны быть названы:->a,i{...}
. If / elsif / elsif может быть сокращен с помощью вложенного тернарного оператора...?...:...?...:...
.Haskell, 119 байт
Пример использования:
Как это работает: Разделите список ввода в заданной позиции на левую часть
a
, элемент на самой позицииx
и правую частьb
. Если есть0
вa++x
, делают помещение до первого0
в обратномa++x
. Если есть0
вx++b
, делают там место. Если их нет0
, объедините все части без изменений, чтобы снова получить исходный список.источник
CoffeeScript, 96 байт
источник
Python 2, 102 байта
Вычисляет индекс нуля, подлежащего удалению, путем объединения списка, обращенного до индекса вставки, с частью после индекса в обычном порядке, а затем поиска индекса первого нуля. Ноль добавляется в конец, чтобы избежать
ValueError
исключений, когда ноль не найден. Затем просто удалите, вставьте и верните.источник
R, 87 байт
объяснение
тесты
источник
C #, 265 байт
Гольф (265 персонажей)
С пробелами и отступами
Вся программа
Тестовые случаи
источник
([0, 'a', 'b', 0, 'c', 'd'], 2)
String[] Q, int P
дляString[]Q,int P
.C 154 байта
Передает данные тесты, a - указатель на массив, l - длина массива (надеюсь, это не нарушает краткость), i - индекс для вставки, а c используется внутри. Возможно, может быть улучшен путем объединения левого и правого поиска петель.
пример
Ungolfed
Прямо вперед, и на самом деле никаких трюков, кроме декларации стиля K & R.
источник