Читать книгу легко, но печатать книгу может быть немного сложно. При печати буклета принтер должен располагать страницы определенным образом, чтобы их можно было читать слева направо. Способ, которым это сделано, использует образец как ниже
n, 1, 2, n-1, n-2, 3, 4, n-3, n-4, 5, 6, n-5, n-6, 7, 8, n-7, n-8, 9, 10, n-9, n-10, 11, 12, n-11…
Тестовые случаи
4-страничный буклет: 4, 1, 2, 3
8-страничный буклет: 8,1,2,7,6,3,4,5
12-страничный буклет: 12,1,2,11,10,3,4,9,8,5,6,7
16-страничный буклет: 16,1,2,15,14,3,4,13,12,5,6,11,10,7,8,9
20-страничный буклет: 20,1,2,19,18,3,4,17,16,5,6,15,14,7,8,13,12,9,10,11
задача
Ваша задача состоит в том, чтобы, учитывая целое число n
, кратное 4, отобразить массив чисел, который можно использовать для печати книги n
страниц.
Примечание. Пока выходные данные генерируют правильные числа, независимо от того, разделены ли они пробелами, запятыми, дефисами или круглыми скобками, можно использовать любой метод получения решения.
Это вопрос по коду-гольфу, поэтому ответы будут оцениваться в байтах, при этом выигрывает наименьшее количество байтов.
Ответы:
05AB1E ,
987 байтПопробуйте онлайн!
объяснение
источник
JavaScript (ES6),
4945 байтСохранено 4 байта с помощью @RickHitchcock
демонстрация
Показать фрагмент кода
Нерекурсивный, 51 байт
демонстрация
Показать фрагмент кода
источник
f=(n,a=1)=>n<a+3?[]:[n,a,a+1,n-1,...f(n-2,a+2)]
n<a
на самом деле достаточно, так что сохранено 4 байта. Благодарность!Python 2,
999388585655 байтПопробуйте онлайн!
-6 байт, удалив ненужные отступы, спасибо Оливер Ни
-5 байт при изменении условного, спасибо Луису Мендо
-30 байтов за счет оптимизации операторов печати, спасибо Арнольду Палмеру
-2 байта, поместив цикл в одну строку, спасибо nedla2004
-1 байт, делая немного волшебства, спасибо мистер Xcoder
источник
lambda
(хотя это может быть достаточно разным, чтобы гарантировать отдельный ответ).f-i+1,i,i+1,f-i
в каждом цикле вместо условной печати последнего значения. Это также позволило удалить начальноеprint f,
.Python 2 , 46 байт
Попробуйте онлайн!
Создает диапазон
[1..n]
и выскакивает спереди и сзади в повторяющейся схемеback, front, front, back, ...
Python 2 , 49 байт
Попробуйте онлайн!
Создает первые 4 элемента, затем рекурсивно продолжается с
n
уменьшением верхнего значения на 2 и увеличения нижнего значенияk
на 2.Python 2 , 49 байт
Попробуйте онлайн!
Непосредственно генерирует
i
значение в списке, используя-i%4/2
в качестве логического значения, принимать ли меньшее или большее значение.источник
Python 3 ,
686362 байта−5 байт благодаря @notjagan (удаление пробелов и использование
[*...]
вместоlist()
).-1 байт благодаря @ovs (
*1
вместо[:]
) .Попробуйте онлайн!
источник
r*1
вместоr[:]
для -1 byte`MATL ,
191710 байтПопробуйте онлайн!
объяснение
источник
Желе ,
1211 байтУлучшены до 11 байтов "Комбинаторные методы":
Попробуйте онлайн!
Как?
Это использует вычисления перестановки и систему факторных чисел:
Не улучшенные 12 байтов, «Вязание узоров»:
Попробуйте онлайн!
Как?
Это простой подход, он создает две нити, чередует их и затем обрезает свободные концы:
источник
Октава ,
4336 байтПорт этого ответа в C (gcc) можно найти здесь .
объяснение
k=1:2:n/2
: Генерирует линейную последовательность от 1 до 2 сn/2
шагом 2. Обратите внимание, что она сразу используется на следующем шаге.[n-k+1;k;k+1;n-k]
: Создает матрицу из 4 строк, так что первая строка создает последовательностьn, n-2, n-4...
доn-(n/2)+2
, вторая строка -1, 3, 5...
доn/2 - 1
, третья строка - вторая строка, добавленная на 1, и четвертая строка - первая строка, добавленная на 1.[n-k+1;k;k+1;n-k](:)'
: Это объединяет все столбцы этой матрицы слева направо, чтобы сделать один столбец-вектор, и мы переносим его в вектор-строку для удобства отображения. Объединение столбцов таким образом точно создает желаемую последовательность.Обратите внимание, что это анонимная функция, поэтому вы можете назначить ее переменной до ее использования или использовать встроенную
ans
переменную, которая создается после создания функции.Попробуйте онлайн!
источник
input
и немного больше злоупотребил синтаксисом, сохранив базовый инкрементальный вектор, когда создавал первую строку, и брал входные данныеn
из самого фактического ввода анонимной функции, чтобы теперь я мог вписать его в одно утверждение. Благодарность!R , 48 байт (улучшено)
Спасибо @Giuseppe за -7 байт!
Хитрость в том, что
x=1:n;x[order(x%%2)]
эквивалентноorder(1:n%%2)
.Попробуйте онлайн!
R , 55 байт (оригинал)
Golfed
Разгромленный с комментариями
Читайте
n
из стандартного ввода.Определить
x
как последовательность страниц от 1 доn
.Страницы заказа, чтобы четные страницы были перед неровными.
Упорядочить страницы в порядке убывания по отношению к центру книги, вычисленному
n/2+.5
.Пример с 8 страницами:
Попробуйте онлайн!
источник
(1:n)[order(1:n%%2)]
это то же самое,order(1:n%%2)
Mathematica,
545345 байтобъяснение
источник
Python 2 ,
6463 байта-1 байт благодаря овсам!
Попробуйте онлайн!
источник
n-i-1
может бытьn+~i
Haskell, 42 байта
Попробуйте онлайн!
Один байт длиннее:
Haskell, 43 байта
источник
Java 8,
8472 байтаили
-12 байт благодаря @TheLethalCoder комментарию на C #.
Старый ответ (84 байта):
Объяснение:
Попробуй это здесь.
источник
Perl 5 , 47 + 1 (-n) = 48 байт
Попробуйте онлайн!
источник
Swift 3 , 74 байта
Попробуйте онлайн!
Swift 3 , 60 байт
По какой-то причине это не работает ни в одной онлайн-среде, которую я пробовал до сих пор. Если вы хотите , чтобы проверить его, поставить
var g=
перед ним, и назвать егоprint(g(12))
в Xcode (игровые площадки) .Вот изображение после того, как я запустил его на игровой площадке Xcode, версия 8.3.1 (Running Swift 3.1):
источник
QBIC , 25 байтов
Хотя ввод% 4, фактический ритм основывается на 2.
объяснение
источник
C (gcc) , 66 байт
Порт моего октавного ответа на C (gcc):
Попробуйте онлайн!
источник
cQuents , 21 байт
Попробуйте онлайн!
объяснение
источник
R ,
6460 байтУжасно отстает от Джурио ! Его ответ довольно элегантный, иди, проголосуй за него.
Порт Райриенга, октавский ответ .
Попробуйте онлайн!
оригинальное решение (64 байта):
Рекурсивная функция.
Попробуйте онлайн!
источник
Bash + Perl + Groff + Psutils, 48 байт
Показывает вывод на
stderr
. Вывод содержит некоторый завершающий мусор.Пример использования:
источник
Pyth ,
2120 байтТестирование.
Если вывод в виде вложенного списка разрешен:
Pyth ,
2019 байтовТестирование.
объяснение
источник
Рубин , 40 байт
Попробуйте онлайн!
источник
C #, 107 байт
Держите два счетчика, один из которых начинается с 1, другой - с p. В каждой итерации цикла запишите четыре элемента и просто увеличивайте или уменьшайте счетчики после каждой записи. Когда счетчики встретятся посередине, остановитесь.
источник
p=>{var a=new int[p];for(int i=0,q=1;q<p;a[i++]=p--){a[i++]=p--;a[i++]=q++;a[i++]=q++;}return a;};
сSystem.Func<int, int[]> f =
не включенным в bytecount. Также вы можете добавить ссылку на TIO, которая очень полезна, когда вы пытаетесь позволить людям самим попробовать ваш код!q
до0
и предварительно приращение приq<p
->++q<p
и затем снимите второй пост приращение , чтобы сохранить байт. Переместите два оператора завершающего цикла в последний этап цикла for, чтобы можно было удалить фигурные скобки.p=>{for(int q=0;++q<p;)System.Console.Write(p--+$",{q++},{q},{p--},");}
. TIO.Haskell , 58 байт
Попробуйте онлайн!
источник
Pyth ,
272423 байта-3 байта, печатая всюду, а не в конце.
-1 Спасибо мистеру Xcoder
Попробуйте онлайн!
Или на онлайн Компилятор / Исполнитель
Это моя первая настоящая программа на Pyth, так что, вероятно, есть лучшие методы, о которых я не знаю.
объяснение
источник
FN
сV
на -1 байтC ++ (gcc) ,
898468 байтКак неназванная родовая лямбда.
n
is #pages (% 4 == 0) иC
является ссылочным параметром для результата, как пустой контейнерvector<int>
(push_back
необходим только ).предыдущее решение:
Попробуйте онлайн!
Слегка разгульный
предыдущее решение слегка расклеилось :
Это было довольно просто разработано, и в арифметике есть некоторые незначительные оптимизации.
Использование:
Версия для печати, 77 байт устарела
Если вы настаиваете на печати значений, есть следующее решение:
Где
o
ваш желаемыйstd::ostream
, какstd::cout
Использование (если назначена 2-я лямбда
g
):источник
Common Lisp, 79 байт
Попробуйте онлайн!
источник
Луа, 94 байта
Для этой задачи я на самом деле предложил 2 разных метода, каждый из которых по 94 байта.
Способ 1:
Код комментирования:
Способ 2:
Этот метод аналогичен первому, однако вместо string.format () я возвращаю объединенную строку
В обоих методах я использовал концепцию n и я становлюсь ближе друг к другу
источник
PHP, 51 + 1 байт
печатает номера страниц, разделенные подчеркиванием и завершающим разделителем.
Запустите как трубу с
-nR
или попробуйте онлайн .источник
J , 22 байта
Попробуйте онлайн!
объяснение
источник