Введение
Дождь наконец утих. Большая часть человечества утонула из-за ошибки в коде @ user12345 . Оставшиеся в живых разбросаны по всему миру архипелага. Радиосвязь налажена, и человечество готово процветать еще раз. Без всякой причины пираты-зомби собрались у Первого меридиана и несутся на запад. Орда пожирает все.
проблема
Наш сценарий конца света может быть описан 5 целыми числами в одной строке, которые представляют собой набор сотрудничающих островных сообществ. Они упорядочены с запада (крайнее левое целое) на восток (крайнее правое целое).
Начиная с самого дальнего востока острова, островитяне бегут парами к следующему ближайшему острову. Любопытно, что для каждой пары, которая вступает в бой, только один из них выживает в поездке. Островитяне путешествуют только парами. Странное население выбирает единственного жителя, чтобы остаться и предоставить последние радио-новости о выходках пиратской орды зомби. Население отказывается путешествовать до тех пор, пока все острова к востоку от них не завершат миграцию или не погибнут. Когда население достигает последнего, самого западного острова, путешествие прекращается.
Управляющему операциями в конце света нужна программа, которая может выводить итоговые данные о численности населения каждой деревни.
Пример ввода
3 8 6 0 2
Пример вывода
8 1 0 1 0
Предположения
- Входные данные могут быть предоставлены через stdin, прочитаны из файла с произвольным именем или приняты в качестве аргумента
- Для каждого острова 0 <= население <= 1024
- Население никогда не пропускает остров
Кратчайший ответ выигрывает!
Ответы:
APL, 16 символов
Входные данные предоставляются в виде строки для этого блока:
или на один символ меньше, если входные данные предоставлены в качестве аргумента для этого блока:
Он основан на идее Ильмари Каронена в этом комментарии .
2⊥⍵
делает преобразование базы 2 ввода.(1e9,4⍴2)⊤
таким образом преобразует это число обратно в основание 2 (для четырех последних цифр) и основание 1e9 для первого, что достаточно для входных диапазонов, указанных выше. (1e9,4⍴2
строит список1e9 2 2 2 2
.)Обратите внимание, что бегство на запад выполняется автоматически преобразованием базы во время этого процесса.
источник
APL
должно быть незаконным ...GolfScript,
2322 символаИтеративный подход. Массив повторяется несколько раз, и каждый раз количество пар передается справа налево. Попробуйте пример онлайн .
Краткое объяснение кода:
источник
~]{2base}2*' '*
сделало бы трюк ...GolfScript (25 символов)
Онлайн демо
Довольно простое решение: есть более интересный подход, который определяет выходное значение для каждого острова как функцию от входных значений, но я не думаю, что его можно использовать почти так же, как на самом деле, следуя алгоритму перераспределения, описанному в вопросе.
источник
Javascript / ES6 (69)
Игра с побитовыми операторами:
x&=1
сохраняет младший бит (1, если нечетный, 0, если четный)x>>1
деление на 2 для целых чиселВерсия без ES6:
Примеры:
f("3 8 6 0 2")
возврат[8, 1, 0, 1, 0]
f("0 997 998 999 1000")
возвращается[935, 0, 1, 1, 0]
источник
f=a=>{a=a.split(' ');for(x=5;--x;a[x]&=1)a[x-1]-=-a[x]/2|0;return a}
68 символов.Питон - 96 символов
Первый раз в гольф! Ввод от стандартного ввода.
источник
' '
разделение, снизив его до 96 и опередив другие решения python2.J (26 символов)
Вот мое решение в J:
((<.@-:@}.,0:)+{.,2|}.)^:_
Это общее решение должно работать с любым количеством островов.
источник
Рубин,
97907472Онлайн версия
Гольф это немного дальше, не переворачивая массив больше ...
источник
C - 121 символов
Ввод взят из стандартного ввода.
источник
Python2 - 98 символов
Ввод от стандартного ввода.
Python3 - 79 символов
Ввод от стандартного ввода.
источник
Python 2,
8580 байтX человек, начинающих на любом острове, эквивалентны X * 2 человекам, начинающим один остров справа. Этот код преобразует всех в начальной конфигурации в их эквивалент у крайне правых островитян, а затем использует двоичное представление результата, чтобы определить, сколько людей окажется на каждом острове.
РЕДАКТИРОВАТЬ: Сократить код, инициализируя
b
1 вместо 0, что позволяет использоватьbin
вместо строки формата.источник
Питон (101)
Мы перебираем список задом наперед и перемещаем популяции в соответствии со спецификацией, затем печатаем список. Вот быстрый тест:
источник
Mathematica 105
Это должно работать с любым количеством островов.
Примеры
5 островов
25 островов
источник
270, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0
для ваших длинных тестовых данных. Я думаю, что подтвердил, что я прав.Джава -
647533, но надеемся на несколько очков брауни для Java 8 Streams.Несжатая форма:
С помощью:
Немного обеспокоен тем, что тест @ DavidCarraher:
генерирует
источник
Ява -
196195Я сказал себе, что не буду публиковать его, если не смогу получить его до 200 ... Честно говоря, я не думаю, что смогу избавиться от чего-либо еще, это довольно тонкий для Java.
Разрывы строк:
Пример ввода вывода:
источник
Java - 179 символов
Сжатый:
Обычный:
Образец вывода:
источник
Emacs Lisp 144 символа
Не крошечный, но это работает
источник
awk - 44 персонажа
источник
Java - 116 символов
Например
int[] i = {2, 33, 16, 5};
(я думаю, они не добавляются к количеству, так как каждое число может меняться) будет выводить23 0 0 1
источник