Задача:
Ваша задача состоит в том, чтобы создать программу, которая при задании количества нитей и количества итераций косы будет указывать, куда идет каждая ветка. Правила следующие:
- Количество нитей всегда будет нечетным и составляет от 3 до 6000 (включительно).
- Когда вы начнете, пряди будут разделены на 2 (почти) равные группы,
left
иright
.left
Будет иметь еще одну прядь при запуске.
Для ввода 7:
/ / / / \ \ \
1 2 3 4 5 6 7
- На каждой итерации самая внешняя нить стороны с большим количеством прядей будет помещена в центр в противоположном направлении. Центр определяются как между противоположными стоящими нитями:
////middle\\\
.
1 итерация ввода 7 (нить 1 была перемещена в центр):
/ / / \ \ \ \
2 3 4 1 5 6 7
Пример:
Входные данные:
3 4
Расчеты:
1 2 3
\
2 1 3
/
2 3 1
\
3 2 1
/
3 1 2
Выход:
3 1 2
Правила:
- Вам не нужно отображать косые черты для направления нитей, только цифры.
- Вам нужно только отобразить числа после последней итерации.
- Ваш вывод будет идентификатором нитей, разделенных пробелами
- Вход будет в виде:
strands [space] iterations
- Количество нитей всегда будет нечетным, а 3 <= x <= 6000
- Это код-гольф , поэтому выигрывает самый короткий код!
11 2
будет2345611178910
?123 -> 213 -> 231 -> 321 -> 312
.Ответы:
GolfScript, 33 символа
Ввод должен быть предоставлен на stdin.
Примеры (вы можете проверить онлайн ):
источник
Python: 179
240, 152 символаВо-первых, 179
Для
N
цепей иi
итераций этот ответ используетO(1)
пространство иO(N)
время. Я просто вычисляю конечную позицию каждой цепи, никогда не перебирая промежуточные позиции!большое редактирование: обдумайте этот ответ, поменяв условные выражения на булеву алгебру. Я также написал длинное объяснение того, как это работает. TL; DR: формульные шаблоны, деление по модулю.
Сейчас 152
Это более разумный питон для гольфа. (редактировать: спасибо Алексу Торнтону за редактирование со 165 по 152)
источник
l
иv
переменные и изменяяinsert
к уступке среза.Питон 2 (109) / Питон 3 (121)
Python 2
Python 3
Код, должно быть, был подкуплен Python 2, чтобы продемонстрировать его преимущества в игре в гольф по сравнению с Python 3: диапазоны - это списки, округление до целого числа, печать не начинается с новой строки. Странно
0-i%2
, потому что-i%2
оценивает как(-i)%2
.Вероятно, существует более эффективный подход, чем итерация, а именно вычисление каждого конечного результата напрямую. Операция плетения имеет период 2 * с, поэтому она не может быть такой сложной.
источник
Руби, 105
Просто много манипуляций с сетами. Нажмите, поп, назад и сдвиг! Я пытался не преобразовывать входные данные в целые числа, но он добавил около 20 символов.
l
иr
(left
иright
) являются очередями «потока».right
перевернут, поэтому мы начинаем тянуть снаружи.t
иf
(to
иfrom
) начинаются какright
иleft
, соответственно, но по мере продолжения мы меняем их местами, так что мы всегда можем сместить последний «поток» сfrom
и выдвинуть его вto
(f,t=t<<f.shift,f
). Это экономит много места.Тогда мы просто перевернем
right
в конце.Changelog:
2.2 105 о да, карта может взять проц
2.1 108 И на самом деле, просто перевернуть вещи как часть манипуляции.
2.0 116 не используйте этот временный массив. Вместо этого используйте две переменные-указатели, которыми мы можем манипулировать и продолжаем перенаправлять. Тогда только отображать конец
1.0 123 начальная идея
источник
Java, 270 символов
golfed:
ун-golfed:
Запустить онлайн
источник