Вот простой кодовый гольф размером с укус (в байтах?): Учитывая непустой список натуральных чисел меньше 10, выведите диагонально-блочную матрицу, где список указывает размер блоков по порядку. Блоки должны состоять из натуральных чисел меньше 10. Так что, если вы задали в качестве входных данных
[5 1 1 2 3 1]
Ваш вывод может быть, например,
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 0 0 0 1
или
1 2 3 4 5 0 0 0 0 0 0 0 0
6 7 8 9 1 0 0 0 0 0 0 0 0
2 3 4 5 6 0 0 0 0 0 0 0 0
7 8 9 1 2 0 0 0 0 0 0 0 0
3 4 5 6 7 0 0 0 0 0 0 0 0
0 0 0 0 0 8 0 0 0 0 0 0 0
0 0 0 0 0 0 9 0 0 0 0 0 0
0 0 0 0 0 0 0 1 2 0 0 0 0
0 0 0 0 0 0 0 3 4 0 0 0 0
0 0 0 0 0 0 0 0 0 5 6 7 0
0 0 0 0 0 0 0 0 0 8 9 1 0
0 0 0 0 0 0 0 0 0 2 3 4 0
0 0 0 0 0 0 0 0 0 0 0 0 5
или что-то типа того. Элементы в матрице должны быть разделены (одиночными) пробелами, а строки разделены (одиночными) переводами строк. На каждой линии не должно быть пробелов в начале или в конце. Вы можете или не можете печатать завершающий перевод новой строки.
Вы можете написать функцию или программу, используя ввод через STDIN (или ближайшую альтернативу), аргумент командной строки или аргумент функции, в любой удобной строке или формате списка (если только они не были предварительно обработаны). Однако результат должен быть напечатан в STDOUT (или ближайшую альтернативу), а не, скажем, возвращен из функции, скажем.
Вы не должны использовать какие-либо встроенные функции, предназначенные для создания блочно-диагональных матриц.
Это код гольф, поэтому выигрывает самое короткое представление (в байтах).
Leaderboards
Я ожидаю, что основанные на массивах языки (такие как J и APL) будут иметь преимущество, но я не хочу, чтобы это отговаривало людей пытаться делать то, что они могут, на своем языке. Итак, вот фрагмент стека для генерации как регулярной таблицы лидеров, так и обзора победителей по языкам. Так почему бы не попытаться найти место на последнем?
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
# Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
# Ruby, <s>104</s> <s>101</s> 96 bytes
function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){$.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(e){answers.push.apply(answers,e.items);if(e.has_more)getAnswers();else process()}})}function shouldHaveHeading(e){var t=false;var n=e.body_markdown.split("\n");try{t|=/^#/.test(e.body_markdown);t|=["-","="].indexOf(n[1][0])>-1;t&=LANGUAGE_REG.test(e.body_markdown)}catch(r){}return t}function shouldHaveScore(e){var t=false;try{t|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(n){}return t}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading);answers.sort(function(e,t){var n=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0],r=+(t.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0];return n-r});var e={};var t=0,c=0,p=-1;answers.forEach(function(n){var r=n.body_markdown.split("\n")[0];var i=$("#answer-template").html();var s=r.match(NUMBER_REG)[0];var o=(r.match(SIZE_REG)||[0])[0];var u=r.match(LANGUAGE_REG)[1];var a=getAuthorName(n);t++;c=p==o?c:t;i=i.replace("{{PLACE}}",c+".").replace("{{NAME}}",a).replace("{{LANGUAGE}}",u).replace("{{SIZE}}",o).replace("{{LINK}}",n.share_link);i=$(i);p=o;$("#answers").append(i);e[u]=e[u]||{lang:u,user:a,size:o,link:n.share_link}});var n=[];for(var r in e)if(e.hasOwnProperty(r))n.push(e[r]);n.sort(function(e,t){if(e.lang>t.lang)return 1;if(e.lang<t.lang)return-1;return 0});for(var i=0;i<n.length;++i){var s=$("#language-template").html();var r=n[i];s=s.replace("{{LANGUAGE}}",r.lang).replace("{{NAME}}",r.user).replace("{{SIZE}}",r.size).replace("{{LINK}}",r.link);s=$(s);$("#languages").append(s)}}var QUESTION_ID=45550;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;var NUMBER_REG=/\d+/;var LANGUAGE_REG=/^#*\s*([^,]+)/
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src=https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js></script><link rel=stylesheet type=text/css href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id=answer-list><h2>Leaderboard</h2><table class=answer-list><thead><tr><td></td><td>Author<td>Language<td>Size<tbody id=answers></table></div><div id=language-list><h2>Winners by Language</h2><table class=language-list><thead><tr><td>Language<td>User<td>Score<tbody id=languages></table></div><table style=display:none><tbody id=answer-template><tr><td>{{PLACE}}</td><td>{{NAME}}<td>{{LANGUAGE}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table><table style=display:none><tbody id=language-template><tr><td>{{LANGUAGE}}<td>{{NAME}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table>
[:=/~]#<\
значение для вашей оценки. Также=/~@#<\
за два лишних байта сбриваются.(=/~@#<\)
это просто функция. Вы должны на самом деле применить это к чему-то, чтобы получить выражение, поэтому вам понадобится явный ввод (".1!:1[1
), или, если вы хотите передать функцию, эта функция должна фактически напечатать значение, а не просто вернуть его (например,echo@
или что-то в этом роде). ).=/~&I.
APL, 10
Пример:
Объяснение:
∆←⎕
: читать ввод, хранить в∆
.⍋∆
: найти перестановку, которая сортирует∆
(это дает уникальное значение для каждого значения на входе)∆/
: для каждого из этих уникальных значений повторите егоN
раз, гдеN
соответствующее значение во входных данных∘.=⍨
: создать матрицу, сравнивающую каждое значение в этом списке с другими значениями.источник
http://tryapl.org
, вы можете использовать dfn{∘.=⍨⍵/⍋⍵}
, так как сайт фильтрует все варианты использования⎕
(кроме⎕IO
и тому подобное).{∘.=⍨⍵/⍋⍵}
недействителен. Вам понадобится{⎕←∘.=⍨⍵/⍋⍵}
, который не только стоит два символа, но все равно не будет работать на TryAPL. (И вообще, TryAPL слишком ограничен, чтобы быть полезным.)⎕←
любом случае, даже без dfn?R
6963Прецедент:
Внешняя функция выполняет большую часть работы здесь, тогда это просто случай, когда результат выглядит правильно - спасибо @Vlo за помощь в этом
источник
-/+
для принуждения к логическому. Сохраните несколько байтовfunction(x)write(+outer(i<-rep(1:length(x),x),i,"=="),1,sum(x))
63Python 3,
10397827876 байтИспользование splat для использования разделяющей пространство природы
print
с небольшим количеством рекурсии.источник
Руби,
869083 байтаМой первый в мире гольф!
Получает массив с целыми числами, печатает ожидаемый результат:
Редактировать:
Спасибо Мартину Бюттнеру за помощь в сокращении некоторых вещей!
источник
->(l)
может быть->l
.map
корочеeach
..join(" ")
можно сократить до*" "
.Matlab,
6054 байтаЭто было бы специальное поле Matlab IF бы мы могли использовать встроенные функции ...
Спасибо @sanchises за исправление ошибки, которую я пропустил.
источник
Matlab, 53 байта
Хотя он всего на один символ короче другого фрагмента Matlab, я подумал, что код достаточно отличается, чтобы дать новый ответ:
Основной трюк, конечно, заключается в индексации границ, но это в сочетании с использованием
end
в качестве переменной делает его более компактным.источник
end+1:end+v
чтобы избавиться от «встречной» переменной, и я не думал об этом решении.blkdiag
нарушит требования. Просто для справки, я все равноblkdiag(A,ones(i))
CJam, 21
Попробуйте это на http://cjam.aditsu.net/
Объяснение:
источник
Python 3, 79
Отслеживает крайний левый индекс блока как
s
и делаетx
записи после него1
, гдеx
находится текущий размер блока. Эта строка затем печатаетсяx
раз. Python 3 необходимо сделатьprint(*r)
.источник
r
как[0]*s+[1]*x+[0]*(sum(l)-s-x)
, но я все еще ищу лучший способ.Haskell,
118116 байтовИспользование:
f [2,1,1,3]
Выход:
Как это работает:
источник
(h,e:t)<-map(`splitAt`i)[0..length i-1]
, такn
как не используется внеlet
привязки.Pyth,
2321 байтGitHub хранилище для Pyth
Ввод представляет собой список целых чисел, например
[3, 1, 1, 2]
. Попробуйте онлайн: Pyth Compiler / ExecutorИспользует довольно похожую идею как J-код Рандомера. Первая часть кода
Ju+G*]GHQY
генерируетn
части схожих вещей. Для примера ввода[3, 1, 1, 2]
результат выглядит следующим образом:Сначала три идентичных элемента, затем один элемент, затем снова один элемент и в конце два идентичных элемента.
Вторая часть кода сравнивает элементы декартового произведения и печатает его.
источник
C ++, 294 байта
Используется компилятор - GCC 4.9.2
Объяснение -:
источник
К, 30 байт
В основном украл ответ Маринус
источник
Ява, 163
Потребитель, который принимает список целых чисел.
Читаемая версия, с шаблоном кода:
Вызвать используя:
источник
Python 2,
163114 байтГнибблер играл в эту кучу.
источник
print" ".join("01"[i==j]for j in r(l(h))for x in r(h[j]))
?Python 3, 74
источник
and
короткого замыкания.f([1,2,3]);print("Done")
, ошибка завершит работу программы после того, как она напечатает матрицу блоков, и она не доберется до печати «Готово».JavaScript (ES6), 103
107103 байта как анонимная функция, не считая
F=
(но вам нужно это проверить)Тест в консоли Firefox / FireBug
Выход
источник
Октава,
4941 байтисточник
Пиф,
3130Довольно наивная программа, принимает входные данные в stdin. Это, вероятно, может быть в гольф больше;)
Спасибо @Jakube за указание на потраченный впустую символ
Попробуй здесь
источник
Perl, 69
Использует стандартный ввод:
источник
-e
из файла, а не из файла (см. примеры в этом мета-посте). также, я думаю, вам не нуженn
флаг - согласно perldoc,a
устанавливаетсяn
неявно.perl -nl file.pl
». Оригинальные правила Perlgolf будут считать дефис, но не пробел, поэтому 3 символа в этом случае.-lna //,print join$",map$'==$_|0,@,for@,=map{(++$i)x$_}@F
. Кстати, моя версия Perl не устанавливается-n
с-a
, это должно быть последнее добавление.R,
117144137133129123 байтаРазумно многословно на данный момент. Должен быть в состоянии побриться еще немного. Получил несколько байтов, отформатировавших его правильно, но сохранил некоторые, заменяя матрицу для массива.
Спасибо Алексу за подсказку о замене sep на s и удалении имени функции.
Полностью отбросил массив и использовал серию повторений для построения каждой строки.
Несмотря на то, что Мифф добился успеха, его решение заставило меня осознать, что я могу вообще отказаться от s = ''.
И тест
источник
cat()
, изменитеsep=
на,s=
так как никакие другие распознанные параметры для этой функции не начинаются с "s".f=
. Это дает вам функциональный объект. Если вы это сделаете, вам просто нужно оговорить, что он будет назначен, используя что-то вроде этого,f=
прежде чем запускать его. Я не осознавал, что это было законно в подобных конкурсах, пока не увидел, как Мартин Бюттнер делает это с Руби.Пакет - 226 байт
Принимает ввод из stdin (
C:\>script.bat 5 1 1 2 3 1
) и вывод echo. К сожалению, я не мог получить последнее эхо в одной и той же строке, иначе я мог бы вызвать всю строку внутри,cmd/von/c
чтобы избежать необходимости отложенного расширения в длинном пути.Красиво и аккуратно - ничего, кроме ворчливой работы:
источник
Хаскелл, 124
Производит вывод, комбинируя действия ввода-вывода через
mapM_
иfoldr
. Функцияd
должна содержать список целых чисел.источник
K (нгн / к) , 10 байтов
Попробуйте онлайн!
-19 спасибо нгн ... держу мое подчинение ниже хаха
К (нгн / к) , 29 байт
Попробуйте онлайн!
редактировать: разрывы для 1-элементного ввода, требуется работа
edit1: теперь исправлено. +4 байта. бу
источник
{x=\:x:&x}
&
в k илиI.
в j) работают с векторами int, в то время как apl⍸
работает только с логическими значениями ,APL (Dyalog Extended) , 5 байт
Попробуйте онлайн!
APL выигрывает у J и K с расширенным доменом для
⍸
.Как это работает
источник
STATA, 155 байт
источник
Желе , 7 байт
Попробуйте онлайн!
Тот же подход, что и у J ответа.
источник