Это код гольф. Для этой задачи я приму метод (вам не нужна полная программа), но сигнатура метода действительно учитывается в счетчике байтов, и я хочу увидеть полную сигнатуру (не lamdba). Вход для метода представляет собой целочисленный массив с 81 элементом. Выходное / возвращаемое значение метода представляет собой строку, которая представляет массив как доску ascii sudoku.
Если вы используете эзотерический язык или что-то, что абсолютно не имеет методов, вы можете адаптироваться, но если язык вообще поддерживает это, я хочу видеть, что что-то может быть действительно подключено к «настоящей» неигровой программе, даже если Сам метод тела - боль, с которой нужно работать. Это требование не предназначено для блокировки языков, таких как Jelly или 05AB1E, а для того, чтобы языки, такие как Java, могли создавать что-то, что имеет смысл для этой платформы.
Для ввода целочисленные значения 1-9 должны иметь очевидные значения. 0 всегда следует интерпретировать как пустую ячейку. Вы также можете интерпретировать что-либо еще вне диапазона 1-9 как пустую ячейку, но это не обязательно. Позиционирование от массива до головоломки начинается в верхнем левом углу и заполняет каждый ряд слева направо, прежде чем перейти к следующему ряду.
Для ящиков я хочу двойные линии вокруг внешней стороны и между каждой областью 3х3, а также одиночные линии между другими ячейками. Они должны быть нарисованы с помощью символов рисования линий (если ваш формат ввода-вывода представляет строки в виде последовательности байтов, а не последовательности символов, вы должны представлять их в хорошо известной кодировке, такой как UTF-8 или кодовая страница 347).
Для этой задачи я НЕ прошу вас создать головоломку судоку. Это вход для функции. Я НЕ прошу вас решить головоломку. Я просто прошу вас создать строку, чтобы «нарисовать» то, что вам дано (как можно меньше байтов).
Пример ввода:
Значения для массива:
{ 8, 5, 0, 0, 0, 2, 4, 0, 0, 7, 2, 0, 0, 0, 0, 0, 0, 9, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 7, 0, 0, 2, 3, 0, 5, 0, 0, 0, 9, 0, 0 ,0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 7, 0, 0, 1, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 6, 0, 4, 0}
Значения могут использовать любой механизм, естественный для вашего языка: int [], ArrayList, sequence, tuple, цепочка цифр и т. Д., Если у вас есть значение во входных данных для каждой ячейки (нет отображений только для заполненных ячеек в позиции ). Помните, что входные данные поставляются ... они не являются частью вашего количества байтов. Но входные данные могут представлять любую головоломку судоку, и головоломка может даже не иметь правильного решения . Вы получаете предположить , что головоломка является печатью. Например, вы не получите что-то с 82 элементами.
Вы также можете принять разумный шрифт фиксированной ширины.
Соответствующий вывод:
╔═══╤═══╤═══╦═══╤═══╤═══╦═══╤═══╤═══╗ ║ 8 │ 5 │ ║ │ │ 2 ║ 4 │ │ ║ ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ ║ 7 │ 2 │ ║ │ │ ║ │ │ 9 ║ ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ │ │ │ 4 ║ │ │ ║ │ │ ║ ╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣ ║ │ │ ║ 1 │ │ 7 ║ │ │ 2 ║ ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ ║ 3 │ │ 5 ║ │ │ ║ 9 │ │ ║ ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ │ │ 4 │ ║ │ │ ║ │ │ ║ ╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣ │ │ │ ║ │ 8 │ ║ │ 7 │ ║ ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ │ │ 1 │ 7 ║ │ │ ║ │ │ ║ ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ │ │ │ ║ │ 3 │ 6 │ │ 4 │ ║ ╚═══╧═══╧═══╩═══╧═══╧═══╩═══╧═══╧═══╝
Ответы:
Python 3 , 232 байта
Спасибо тем, кто помог в этом упасть.
Шифрование в шифровании ...
Попробуйте онлайн!
Быть в гольфе.
источник
i=["╔"+(g+"╦")*2+g+"╗"]+d+2*(["╠"+(e+"╬")*2+e+"╣"]+d)+["╚"+(h+"╩")*2+h+"╝"]
сохраняющее 4 байтаC (gcc) ,
398395291 байтСэкономив 3 байта, обработав обратную строку, и 104 (!) Байта благодаря Leaky Nun.
Попробуйте онлайн!
C (gcc) , 395 байт
Я оставлю это здесь, чтобы было более очевидно, как работает программа.
Попробуйте онлайн!
Работа с Unicode в C ... дорого. Принимает вход как
int*
показано в ссылке и в спецификации.Я собираюсь посмотреть, смогу ли я сохранить байты, используя магию чисел вместо жесткого кодирования строки.
источник
PHP , 297 байт
Попробуйте онлайн!
расширенный
используемые функции для обеих версий
vsprintf , strtr , str_pad , array_slice , array_chunk
PHP , 313 байт
Попробуйте онлайн!
источник
T-SQL,
445437 байт (381 символ)Ввод осуществляется через строку цифр, сохраненную в столбце a существующей таблицы t , согласно утвержденным методам .
Формат и объяснение :
В верхней строке цикла я получаю следующие 9 цифр входной строки из столбца a существующей таблицы t .
Я преобразую эту строку цифр в целое число и использую
FORMAT
функцию .Net, чтобы отобразить их с помощью пользовательского текстового шаблона'║ 0 │ 0 │ 0 ║ 0 │ 0 │ 0 ║ 0 │ 0 │ 0 ║P'
.После этого я просто добавляю соответствующую разделительную линию и делаю некоторые замены байтов перед выводом.
Вывод отображается в области результатов:
Ранее у меня были некоторые дополнительные замены для некоторых других символов рисования, но в конечном итоге они не спасли меня в байтах.
РЕДАКТИРОВАТЬ 1 : Сохранено 8 байтов, начиная
@r
с нуля вместо 1 и удаляя некоторые ненужные пробелы.источник
Сетчатка ,
196167 байтПопробуйте онлайн!Вводит в виде строки длиной 81. Объяснение: Поскольку символы рисования блока стоят три байта, кодовые точки
═-╬
Юникода представляются в коде с использованием=|#A-Z
(не все символы используются, но соблюдение диапазонов экономит байты). Кроме того, строки сжимаются с помощью#
знаков:a#bcd#e
расширяется доabbbcbbbcbbbdbbbcbbbcbbbdbbbcbbbcbbbe
.Вставки
╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣
для каждого третьего ряда, плюс║
в начале каждой группы из 27.Вставляет
╟───┼───┼───╫───┼───┼───╫───┼───┼───╢
между другими строками, плюс║
s в начале этих строк.Вставляет
║
s после каждых трех цифр. Все║
s теперь вставлены.Вставки
|
s между всеми оставшимися парами цифр. (Это фактический символ рисования блока, а не труба. К сожалению, символы─│┼
имеют коды, расположенные слишком далеко друг от друга, и символы двойного блока, чтобы оправдать использование заполнителей.)Изменяет первый ряд на
╔═══╤═══╤═══╦═══╤═══╤═══╦═══╤═══╤═══╗
(это экономит 1 байт, не добавляя первую строку на первое место).Прибавляет
╚═══╧═══╧═══╩═══╧═══╧═══╩═══╧═══╧═══╝
после последнего ряда.Расширяется
a#bcd#e
, сначалаa#bc#d#bc#d#bc#e
, затем доa#b#c#b#c#b#d#b#c#b#c#b#d#b#c#b#c#b#e
.изменения
#b#
вbbb
. Это завершает декомпрессию.Удаляет все нулевые записи и заменяет заполнители символами рисования блока.
источник
0
на пробел.SOGL V0.12 ,
174172164160158 байтСлишком длинное объяснение:
Программа, которая выполняется:
где все, кроме последней строки просто
in the entire program replace occurrences of the last char of this line with the rest of this line
. Это причина, по которой можно было сделать половину символов просто случайной ASCII (но для того, чтобы использовать пробелы, тире и кавычки с пользой потребовалось время, чтобы выяснить это)Попробуй здесь!
Код онлайнового интерпретатора является более правильным, потому что вкладки не работают с SE
-8 байт: замена методом грубой силы, сжимающая всю плату, затем заменяющая иностранные символы (на кодовую страницу) их кодовыми точками. Это заняло на час меньше, чем у старой программы ...
-4 байта: сжатие сжатой строки ...
-2 байта: использование переменной + строки вместо массива
источник
JavaScript (ES6), 246 байт / 198 символов
Ввод представляет собой массив целых чисел. Завершается использованием тех же двух вспомогательных функций, что и в ответе Python от Leaky Nun , так что заслуга в этом.
Если
function
требуется, 263 байта / 215 символовТестовый фрагмент
Поддерживается любой ввод из 81 номера (
1234
,1, 2, 3, 4
.[1 2 3 4]
, И т. Д.). Лучше всего рассматривать как полную страницу.источник
Пакетный, 332 байта
Нужно, чтобы консоль была в CP437. Если это не ваше значение по умолчанию, вы можете изменить его с помощью
CHCP 437
команды, если ваша консоль установлена на шрифты TrueType. (Он будет работать только с растровыми шрифтами, если CP437 уже является кодовой страницей по умолчанию.) Вот как выглядит код в CP437:источник
С идеями, полученными из других ответов:
C # (.NET Core) , 401 байт, 349 символов
Ungolfed:
Попробуйте онлайн!
Мой ответ:
C # (.NET Core) ,
509 430418 байт, 328 символовUngolfed:
Попробуйте онлайн!
источник
Чип , 3645 байт
... это не опечатка ...
Попробуйте онлайн! , вроде. Версия TIO содержит обрезку примерно на трети
t
после 4-гоoooooo
), так что оно должно завершиться менее чем за 60 секунд. Полная версия занимает около 1м25 с на моей машине, а TIO кажется примерно вдвое быстрее. Это также означает, что TIO показывает только первые 7 строк вывода.Мой первый черновик весил 19758 байтов, и мне потребовалось около 830-х. Окончательное решение, перед игрой в гольф, было spry 5980 байт, занимая только 2m07s.
Так как же это работает?
Для этого требуется строка из 82 байтов, 81 цифра, за которой следует терминатор.
\0
или\n
даже другой номер подойдет. (Эта реализация на самом деле рассматривает только первые 81, но требует как минимум еще одного, поскольку Chip прекратит работу, если исчерпал свой ввод. Если это недопустимо,-z
можно использовать флаг , который фактически добавляет бесконечное число\0
байтов к конец ввода.) Сокращенный код TIO на самом деле не доходит до всех 81 байта, так что вопрос здесь спорный.Как я это реализовал, он рассматривает только 4 младших бита ввода, поэтому все, что угодно, может быть «загадкой» судоку, от необработанных двоичных данных до менее известных работ Шекспира. Любой символ, чьи младшие 4 бита равны нулю, будет отображаться как пробел (особый случай), все остальные символы отображаются в
123456789:;<=>?
. (Итак, последние несколько не являются цифрами, но ни 10 не является действительным числом в обычной судоку).Для символов рисования ячеек он выдает UTF-8, равный 3 байта каждый.
Как насчет фактической реализации?
Чип - это трехмерный язык, основанный на интегральных схемах. У него есть провода, логические элементы и ячейки памяти. Большая часть материала выполняется на двухмерных плоскостях, но эти плоскости могут накладываться друг на друга. Вот как эта программа построена.
Строки, начинающиеся с,
=
являются разделителями слоев. Затем слои накладываются друг на друга с выравниванием верхней и левой сторон.o
служат контактами, позволяя сигналам переходить с одного слоя на другой.У каждого слоя здесь есть цель, вы можете думать о них как о функциях. Первый слой контролирует все; он «вызывает» каждый из остальных слоев по очереди. Здесь повторяющийся рисунок слева направо. Этот шаблон отслеживает, какие из 19 строк вывода мы печатаем в данный момент.
Второй слой довольно крошечный, и у него очень маленькая работа. Он устанавливает
0x80
бит для всех строк вывода, кроме строк, содержащих числа.h
элемент Chip, соответствующий0x80
биту (Нижний конец алфавита доh
концаa
определяет все восемь выходных битов.)Слой три - это то, где мы действительно погружаемся в суть печати. Этот слой отвечает за первую линию. Безгольфовая версия имеет восемь строк
x
«и)
», отображая «0» и «1» для каждого из восьми бит каждого байта. Однако мы можем воспользоваться шаблонами в битах, чтобы выполнить ту же задачу в меньшем количестве строк.Слой четыре очень похож на третий. Он обрабатывает горизонтальные двойные линии.
Слой пять обрабатывает последнюю строку. Обратите внимание, что отсутствует верхний провод, который есть у других слоев. Это потому, что нам не нужно возвращать управление секвенсору. Вместо этого мы можем просто прекратить выполнение здесь с помощью
t
.Слой шесть обрабатывает горизонтальные одиночные линии.
Слой семь - это место, где печатаются цифры. Он вызывается для каждой из девяти числовых строк. Он потребляет 9 байтов ввода как часть своего выполнения.
источник
JavaScript (ES6), 222 байта
Использование короткого синтаксиса для функций ES6 - 174 символа, закодированных в utf8, 222 байта ( https://mothereff.in/byte-counter ). Использование
function ...
требует еще 16 байтов.Меньше гольфа
источник
Java (OpenJDK 8) , 279 байт
Попробуйте онлайн!
Для подсчета байтов используйте CP-437, который изначально поддерживается Java как
IBM437
(последние API) илиCp437
(более старые API); поэтому используйте систему, в которой эта кодировка имеет эту кодировку как кодировку по умолчанию.Этот код совместим с Java 5 и выше, но был протестирован только на Java 8.
объяснение
источник
Tcl , 599 байтов (295 символов)
Очень наивный подход, но я просто должен был сделать это, даже если он ни в коем случае не был победителем:
Попробуйте онлайн!
источник