В стратегической игре "Hexplode" игроки по очереди размещают жетоны на шестиугольной доске. Как только количество токенов равно количеству соседних тайлов, этот тайл гексплодирует и перемещает все токены на нем соседним соседям. Вы можете играть в онлайн игру здесь .
Мне нравится эта игра, но иногда трудно точно определить, сколько токенов идет на конкретную плитку; Я всегда рассчитываю количество соседей. Было бы очень удобно, если бы у меня был ASCII-арт, который помог бы мне вспомнить, сколько токенов идет на каждую клетку.
Вы должны написать программу или функцию , которая принимает целое положительное число в качестве входных данных и производит это ASCII представление шестигранник размера N . Каждая плитка будет числом соседей, которые есть у плитки. Так как 1 - странный угловой случай с нулевыми соседями, вам нужно обрабатывать только входы больше 1.
Вы можете взять это число в любом приемлемом формате, например, STDIN, аргументы функций, аргументы командной строки, из файла и т. Д. Вывод также может быть в любом приемлемом формате, например, печать в STDOUT, запись в файл, возврат список строк, строка, разделенная новой строкой, и т. д.
Вот пример выходных данных для первых 5 входов:
2)
3 3
3 6 3
3 3
3)
3 4 3
4 6 6 4
3 6 6 6 3
4 6 6 4
3 4 3
4)
3 4 4 3
4 6 6 6 4
4 6 6 6 6 4
3 6 6 6 6 6 3
4 6 6 6 6 4
4 6 6 6 4
3 4 4 3
5)
3 4 4 4 3
4 6 6 6 6 4
4 6 6 6 6 6 4
4 6 6 6 6 6 6 4
3 6 6 6 6 6 6 6 3
4 6 6 6 6 6 6 4
4 6 6 6 6 6 4
4 6 6 6 6 4
3 4 4 4 3
6)
3 4 4 4 4 3
4 6 6 6 6 6 4
4 6 6 6 6 6 6 4
4 6 6 6 6 6 6 6 4
4 6 6 6 6 6 6 6 6 4
3 6 6 6 6 6 6 6 6 6 3
4 6 6 6 6 6 6 6 6 4
4 6 6 6 6 6 6 6 4
4 6 6 6 6 6 6 4
4 6 6 6 6 6 4
3 4 4 4 4 3
И картина продолжается аналогичным образом. Как обычно, применяются стандартные лазейки, и ответ с самым низким числом байтов будет признан победителем!
Leaderboards
Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
# Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Если вы хотите включить в заголовок несколько чисел (например, потому что ваш результат равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:
# Perl, 43 + 2 (-p flag) = 45 bytes
Вы также можете сделать название языка ссылкой, которая затем будет отображаться во фрагменте списка лидеров:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
var QUESTION_ID=92194,OVERRIDE_USER=31716;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
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><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
Ответы:
MATL ,
3937 байтПопробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
Я снова использую свертку!
Рассмотрим ввод
n = 3
. Код сначала строит матрицу размера4*n-3
×n
путем добавления вектора столбца к вектору[1; 2; ...; 9]
строки[1, 2, 3]
с широковещательной передачей. Это означает вычисление массива двумерного массива всех попарных дополнений:Замена четных чисел на
1
нечетные числа0
дает шаблон шахматной доскиЭто будет использоваться для создания (части) гексагональной сетки. Единицы будут представлять точки в сетке, а нули будут представлять пробелы.
Верхний правый угол удаляется путем обнуления всех элементов над главной «диагональю» матрицы:
Поэлементное умножение этой матрицы на вертикально перевернутую версию само по себе также удаляет нижний правый угол. Транспонирование затем дает
Это начинает выглядеть как шестиугольник. Используя симметрию, сетка расширяется для получения верхней половины:
Теперь нам нужно заменить каждую запись, равную единице, числом соседей. Для этого мы используем свертку с окрестностью 3 × 5 (то есть ядро представляет собой матрицу единиц 3 × 5). Результат,
имеет две проблемы (которые будут решены позже):
1
.Код теперь добавляет
47
к каждому вычисленному значению. Это соответствует вычитанию1
для решения задачи (2) и сложению48
(ASCII для'0'
), которое преобразует каждое число в кодовую точку соответствующего ему символа.Результирующая матрица затем умножается на копию нулевой сетки. Это решает проблему (1) выше, делая точки, которые не являются частью гексагональной сетки, снова равными нулю:
Наконец, этот массив чисел приводится к массиву символов. Нулевые символы отображаются в виде пробела, что дает конечный результат:
источник
JavaScript (ES6),
118117 байтГде
\n
представляет буквальный символ новой строки. Пояснение: предположимn=4
. Начнем со следующего разделенного пробелами квадрата цифр:Первые
|n-i|
0
s удаляются, но пробелы остаются:Мгновенный шестиугольник! Затем достаточно рассчитать соответствующее значение вместо каждого
0
, проверив, находимся ли мы в первой или последней строке и / или столбце. Редактировать: 1 байт сохранен благодаря @Arnauld.источник
n=>{for(i=n+--n;i--;)console.log(' '.repeat(l=i>n?i-n:n-i)+(j=3+!l%n)+` ${l-n?6:4}`.repeat(2*n-l-1)+' '+j)}
3+!i%n
!Python 2,
125123 байтаТесты на Ideone
Запускается через верх к середине строки,
for r in range(n)
, конструируя строки:- создание двух углов или два ребра,
'34'[r%m>0]*2
;- заполнение путем соединения их с повторен
'6'
или'4'
,'46'[r>0]*(r+m-1)
;- соединение углов и краев с помощью
' '
;- заполнение пробелами
' '*(m-r)
;Затем печатает это, и это отражение в среднем ряду, соединенном новыми линиями,
print'\n'.join(t+t[-2::-1])
источник
Python 2, 96 байт
Это выглядит довольно грязно и несколько гольф ...
источник
Java,
375363361339329317293 байтаUngolfed
Использование :
Я уверен, что ужасный вложенный блок if-else можно переписать так, чтобы он стал меньше, но сейчас я не могу этого понять. Любые предложения приветствуются :-)
Обновить
источник
Integer.parseInt
можно поиграть в гольфInteger.decode
.l=(h*4-3-s.trim().length())/2;if(l==0)
можно в гольфif((l=(h*4-3-s.trim().length())/2)==0)
. Кроме того, вполне приемлемо просто опубликовать метод без класса (если в вопросе не указано иное), поэтомуvoid f(int i){...use i...}
вместо этогоinterface J{static void main(String[]r){...i=Integer.decode(r[0])...use i...}
это также должно сэкономить вам немало байтов. Когда у меня будет больше времени, я посмотрю дальше.l=(h*4-3-s.trim().length())/2;if(l==0)
на самом деле такой же длины сif((l=(h*4-3-s.trim().length())/2)==0)
.05AB1E , 44 байта
объяснение
Поскольку верх и низ шестиугольника зеркально отражены, нам нужно только создать верхнюю часть.
Поэтому для ввода X нам нужно сгенерировать X строк. Это то, что делает основной цикл.
Затем мы делаем центральную часть рядов.
Это 4 для первого ряда и 6 для остальных (так как мы делаем только верхнюю часть).
Мы объединяем это число с пробелом, так как для шаблона потребуется интервал между числами.
Затем мы повторяем эту строку X-2 + N раз, где N - текущая строка с индексом 0 и добавляем пробел с левой стороны.
После этого пришло время для углов. Их будет 3 для первого и последнего ряда и 4 для средних рядов.
Теперь нам нужно убедиться, что строки выстроены правильно, добавив пробелы в начале каждой строки. Количество добавленных пробелов будет X-1-N .
Теперь, когда мы завершили верхнюю часть сетки, мы добавляем строки в список, создаем перевернутую копию и удаляем первый элемент из этой копии (поскольку нам нужна только центральная строка один раз), затем объединяем эти 2 списка и Распечатать.
Попробуйте онлайн!
Дополнительное решение, также 44 байта:
источник
Рубин, 87 байт
Анонимная функция принимает n в качестве аргумента и возвращает массив строк.
Неуправляемый в тестовой программе
Ввод через стандартный ввод. Записывает всю форму в стандартный вывод. Довольно понятно.
источник
V , 60 байтов
Попробуйте онлайн!
Это действительно слишком долго. Вот hexdump, так как он содержит непечатаемые символы:
источник
Ракетка, 487 байтов
Тестирование:
Подробная версия:
источник