Задача
У меня есть хорошая картинка, которую я хочу повесить на стену. И я хочу, чтобы он висел там эффектным образом, поэтому я решил повесить его на n
гвозди, где n
есть любое положительное целое число.
Но я также нерешительный, поэтому, если я передумаю, я не хочу, чтобы у меня были проблемы с записью. Поэтому удаление любого из n
гвоздей должно привести к падению изображения. Я упоминал, что в моем доме нет трения?
Вы можете мне помочь?
правила
- Ваша программа должна прочитать число
n
из stdin и распечатать в stdout (или эквиваленты вашего языка). - Выходные данные должны быть решением в соответствии с выходной спецификацией без каких-либо других завершающих или начальных символов. Однако конечные пробелы и / или переводы строк являются приемлемыми.
- Вы должны использовать именно
n
ногти. - Предполагая мир без трения, ваше решение должно удовлетворять следующим условиям:
- Повесьте картинку, как описано в вашем решении, картинка не должна упасть.
- Если какой-либо один из гвоздей удален, картина должна упасть.
- Применяются стандартные лазейки. В частности, вы не можете отправлять запросы, например, в программу верификации, на решения для перебора.
Обратите внимание, что 4.2 уже подразумевает, что все n
гвозди должны быть вовлечены.
Спецификация выхода
- Все гвозди названы слева направо в соответствии с положением, в котором они находятся, начиная с
1
. - Есть два основных способа наложить шнур вокруг гвоздя: по часовой стрелке и против часовой стрелки. Обозначим шаг по часовой стрелке с
>
и шаг против часовой стрелки с<
. - Каждый раз, когда нить наматывается на гвоздь, она выходит на верхнюю часть гвоздей, поэтому пропуск гвоздей означает, что нить пройдет через верхнюю часть промежуточных гвоздей.
- Каждый раствор должен начинаться на ногте
1
и заканчиваться на ногтеn
. - Выходные данные должны состоять из последовательности шагов, в которых шаг представляет собой комбинацию имени гвоздя и направления, в котором нужно обвязать его.
Пример вывода
Вот пример вывода для n=5
и n=3
:
1>4<3<2>4>5< # n=5, incorrect solution
1>2<1<2>3<2<1>2>1<3> # n=3, correct solution
А вот наглядное представление о неправильном решении для n=5
(awsumz gimp skillz)
Правильное решение для n=1
просто 1>
или 1<
. Для нескольких ногтей могут быть разные решения. Вы должны вывести только один, так как это часть вашего счета.
верификация
Вы можете проверить правильность решения здесь: www.airblader.de/verify.php .
Он использует GET-запрос, так что вы можете вызвать его напрямую, если хотите. Например, если foo
файл содержит решение в каждой строке, вы можете использовать
cat foo | while read line; do echo `wget -qO- "www.airblader.de/verify.php?solution=$line" | grep "Passed" | wc -l`; done
Если вы считаете, что решение верное, но верификатор помечает его как неправильное, сообщите мне!
Редактировать: И если ваш вывод будет настолько длинным, что GET-запрос его не обрежет, дайте мне знать, и я сделаю версию POST-запроса. :)
счет
Это код-гольф. Оценка - это количество байтов вашего исходного кода в кодировке UTF-8, например, используйте этот инструмент . Тем не менее, есть потенциальный бонус за каждую отправку:
Запустите вашу программу для всех n
в диапазоне [1..20]
и добавьте длину всех выходов, чтобы определить свой результат . Вычтите ваш выходной балл из, 6291370
чтобы получить количество бонусных баллов, которое вы можете вычесть из вашего количества байтов, чтобы получить ваш общий балл . Там нет никакого штрафа, если ваш результат выше, чем это число.
Представление с самым низким общим счетом выигрывает. В маловероятном случае ничьей, прерыватели ничьей находятся в следующем порядке: более высокие бонусные баллы, меньшее количество байтов, более ранняя дата подачи.
Пожалуйста, опубликуйте как отдельные части (количество байтов, бонусные баллы) счета, так и окончательный результат, например, " LOLCODE (44 - 5 = 39)
"
1>
на рисунке). И нет там,n
где невозможно решение. Действительное решениеn=2
является1>2<1<2>
.Ответы:
GolfScript (
5167 байт + (73107150 - 6 291 370) = -6 284 153)Это основано на рекурсивной конструкции коммутатора Криса Лусби Тейлора * , лучше изложенной в « Пазлах с висящими картинками» , Demaine et al., Theory of Computing Systems 54 (4): 531-550 (2014).
Выходы на первые 20 входов:
NB. Я думаю, что более длинные ответы не пройдут онлайн-тест, потому что он использует,
GET
аPOST
URL-адреса не гарантированно будут обрабатываться правильно, если они длиннее 255 символов.В стандартной конструкции есть два твика:
[x_1, x_2^-1]
вместо[x_1, x_2]
.* Никаких отношений, насколько я знаю.
** Ну, в рамках того же подхода рекурсивного коммутатора. Я не утверждаю, что решил открытую проблему доказательства ее оптимальности.
источник
Python 2 (208 байт + (7230 - 6 291 370) = -6 283 932)
Функция
f
рекурсивно дает ответ, объединяя полурешения в виде A ^ {- 1} * B ^ {- 1} * A * B, представляет инверсии путем отрицания.f(a,b)
является решением для чисел в полуоткрытом интервале[a,b)
.Редактировать: чтобы соответствовать требованию начинать
1
и заканчиватьn
, я перевернул порядок, чтобы всегда заканчиватьn
его, используя обратные интервалы, и просто добавляю"1<1>"
в начало.Редактировать : Сохраненные 136 символов на выходе путем округления в другую сторону с интервалом выбора, в результате чего интервалы с большими числами (и, следовательно, более вероятными, чтобы иметь две цифры) были короче.
Изменить : Сохранение 100 символов путем неравномерного разделения интервалов, чтобы один с большими числами был короче. Это не удлиняет количество используемых операций, если длины никогда не пересекают степени 2.
Изменить : Введено благоприятное округление, -50 символов, 2+ кодовых символов.
Выходы от 1 до 20:
источник
n>n<
.n=1
C - (199 байт - 0) = 199
С переносами строк:
Вероятно, довольно наивный алгоритм, учитывая, что я не очень разбираюсь в теории узлов. В основном просто добавляет следующее большее число, а затем переворачивает весь набор инструкций, чтобы развернуть его. Скорее всего, это будет гораздо более лаконично в языке, который лучше обрабатывает наборы ...
Общая длина вывода
n
в диапазоне[1..20]
составила 6 291 370 байт (3 145 685 инструкций). Это был огромный достаточно того, что я только разместил образцы выходов дляn
в диапазоне[1..10]
.источник
6,291,370
это именно тот номер, который я хотел опубликовать. Я случайно только разместил номер дляn=20
, а не сумму всех. Я должен провернуть это до[1..10]
.199 + 0 = 199
.