Соревнование
Построить набор Кантора с N-уровневой структурой .
Троичный набор Кантора создается путем многократного удаления открытых средних третей набора отрезков.
Программа получает один параметр N
(целое число) и затем печатает (в консоли или аналогичным образом) набор Кантора из N уровней. Печать может содержать только символы undescore ( _
) и пробелы. Параметр может быть положительным или отрицательным, а знак указывает на ориентацию построения набора Кантора: если N > 0
набор Кантора построен вниз и если N < 0
набор Кантора построен вверх. Если N = 0
тогда программа печатает одну строку ( _
).
Например:
N = 2
_________
___ ___
_ _ _ _
N = -2
_ _ _ _
___ ___
_________
N = 3
___________________________
_________ _________
___ ___ ___ ___
_ _ _ _ _ _ _ _
N = -3
_ _ _ _ _ _ _ _
___ ___ ___ ___
_________ _________
___________________________
Критерии победы
Так как это сложная игра в гольф, выигрывает самый короткий код.
Отредактировано: изменить 0 ввод по предложению Угорена.
_
(но печатать его вниз при получении -0).Ответы:
GolfScript,
49 4240 символовБлагодаря хаммару за 42-> 40.
Моя лучшая попытка использовать более теоретический подход, к сожалению, гораздо длиннее:
или
и я подозреваю, что длина
base
иzip
сделает невозможным наверстать упущенное.источник
~.abs.@/\.3\?'_'*\{.3%..,' '*\++}*](%n*
39 символов, но вылетает при вводе0
. :-(n/abs(n)
можете получить, чтобы получитьsignum(n)
.Питон,
116 113 104103 символовБолее старый алгоритм на 113 символов
источник
Рубин (97)
Основанный на питонской версии Стивена Румбальски:
Предыдущие попытки, одинаковой длины (112)
Построить линии из частей:
Начните с одной строки, сделайте в ней отверстия:
источник
Perl, 93 символа
Я подумал, что попробую посмотреть, насколько хорошо решение Golf TScript от Peter Taylor будет портировать на Perl. Известные особенности включают использование
sort
вместо того,reverse
чтобы сохранять три символа, используя тот факт, что пространство сортируется раньше_
.источник
Common Lisp,
217210 символовExpanded:
Я полагаю, если лисповскому коду удается превзойти любое начальное значение для другого языка (C, 219), я в порядке :)
источник
С (
163161 символ)Занимает пару трюков из ответа Угорена , но основная логика совершенно иная. Я не мог следить за его циклом for, так что можно было бы гибридизировать и сохранить еще несколько.
источник
C
219193179143136131 символовСледуя еще одной из идей Петьера Тейлора, плюс мое собственное улучшение, спасло еще 6.
Интегрировал несколько советов от @PeterTaylor, а также скопировал его основную функцию с небольшими изменениями, которые сохраняют персонажа (справедливо ли копировать его? Поскольку никто из нас не выиграет этот, я думаю, это не так уж плохо).
Я подумал о значительном улучшении в том, как работает моя рекурсия, и, увидев ответ Питера Тейлора, я реализовал его, чтобы вернуть себе лидерство. Когда я снова прочитал его ответ, я увидел, что сделал почти то же, что и он. Так что это похоже на гибридизацию, которую он предложил.
Также упростили цикл
main
, сохранив одинаковую длину.И взял у Питера трюк, чтобы напечатать перевод строки, а не
puts("")
- спасает персонажа.Удалено
int
из объявления переменной - предупреждение, но сохраняет 4 символа.Новый алгоритм не рассчитывает 3 ^ x заранее, но использует один цикл для печати 3 ^ x символов.
Можно сохранить еще один, определив
int*v
, но тогда 64-битный не будет работать.Количество символов исключает пробелы (которые могут быть удалены).
Старый алгоритм, 219 символов:
источник
i
параметр, потому что использование global может помешатьmain
.l--
будет мешатьo>=l
, и мне придется заменить его>
(так почему я пишу это, как будто это плохо?) Я мог бы также скопировать васmain
, который проще и короче, чем мой.i
- я упустил тот факт, что я действительно больше не использую его (я думал, что вы имеете в виду, я не передаю это).p
теперь кажется вполне оптимальным, и выmain
стали лучше (я не уверен, что он оптимален, но не могу улучшить его дальше). Таким образом, за исключением новой гениальной структуры программы, единственным путем было копирование кода другого.J
44393837 байтИспользует итерацию для построения следующего набора, начиная с 1 (представляющего
_
) изначально.использование
объяснение
источник
@.
возможно, это, в сочетании с$:
, может быть полезным здесь? Например, что-то вроде(zero case)`(positive case)`(negative case)@.*
, или даже, может быть":@_:`(positive case)`(|."1@$:)@.*
.R ,
141 139137 байтПопробуйте онлайн!
-15 байтов, спасибо Джузеппе за использование в
'('
качестве функции идентификации;write
вместо того,cat
чтобы печатать вывод; умное использование%x%
.-2 байта благодаря Кириллу Л. с использованием
c
вместо'('
функции идентичности.источник
%x%
? Возможно, есть некоторые проблемы с чередованием строк ...kron
тоже подумал ! Я полагаю, что это может уменьшиться до 125 байтов, если мы сможем найти правильный подход.`(`
в качестве функции идентификации, так что вы можете использоватьwrite
непосредственно вместоcat
иfor
цикла. 141 байт(
можно было бы использовать таким образом, или этоif
можно использовать для выбора из двух функций. И я начну использовать write ... сохраняет много "\ n".Python,
177164 символаисточник
input
какint
. Ваши последние две строки могут быть сокращены доprint"\n".join(r[::N>0 or-1])
Perl, 113 символов
Expanded:
источник
JavaScript 121 байт
Внутренняя рекурсивная функция, а затем позаботиться о обратном выводе
Меньше гольфа
Тестовое задание
источник
Пакет,
265262242236235 байтИзменить: Сохранено
1219 байт благодаря @ l4m2. Сохранено 8 байтов путем удаления ненужной%a%
переменной.источник
set c=%n%,-1,0 [LF] if %n% lss 0 set c=0,1,%a% [LF] for /l %%i in (%c%)do call:l %%i
?JavaScript (Node.js) , 148 байт
Попробуйте онлайн!
источник
Python 2 , 102 байта
Попробуйте онлайн!
источник
Пролог (SWI) ,
265232213 байтПопробуйте онлайн!
источник
PowerShell , 111 байт
Попробуйте онлайн!
Менее гольф:
источник