Blockbox, что Hex?

11

Напишите программу или функцию на любом языке программирования, который принимает шестизначный шестнадцатеричный ввод / аргумент. Вход / аргумент могут быть 6 значениями или 6-символьной строкой.

Ваша программа должна вывести прямоугольный блок символов шириной 8 символов, содержащий только шестнадцатеричные числа и пробелы (+ перевод строки). Прямоугольный блок представляет собой комбинацию блоков меньших размеров, по одному для каждого из 6 предоставленных значений.

Ниже приведены 2 демонстрационных примера входных данных и примеры действительных выходных данных:

Пример ввода :

"464fa6" or [4, 6, 4, 15, 10, 6]

Один действительный вывод решения :

44 66 ff
44 66 ff
   66 ff
aa     f
aaa ffff
aa  ffff
aaa     
    6 44
66666 44

Пример ввода :

"35bf12"

Один действительный вывод решения :

55555 22

bbbbbbbb
b b b   
      33
fffff  3
ff  ff  
ffffff 1

Правила:

  1. Выход должен быть прямоугольной формы

  2. Вывод может быть любой вертикальной высоты, но должен быть ровно 8 символов в ширину.

  3. «Внутренние блоки», называемые «формами блоков», не могут соединяться с какой-либо другой формой блоков, формы блоков должны быть разделены стеной пустых пространств шириной ровно в 1 символ по горизонтали, вертикали и диагонали.

  4. Стена пустых пространств не может проходить параллельно внешним краям, на выходных ребрах могут существовать только стены шириной в 1 символ. Не должно быть никаких связанных пространств где-либо на самом краю прямоугольника на выходе.

  5. Ширина стены пробелов не должна ни в какой точке превышать 1 символ.

  6. Формы внутреннего блока должны быть одинаковыми с областью символов x, где x - это предоставленное шестнадцатеричное значение, а форма должна состоять из символа x, где x - представитель шестнадцатеричного символа.

  7. Внутренние фигуры блоков могут иметь любую форму, если все символы фигуры соединяются вертикально или горизонтально и не соответствуют правилам для стены пустых пространств.

  8. 6 блоков формы могут быть размещены в любом внутреннем «порядке» внутри выведенного прямоугольника.

  9. Допустимый диапазон ввода: 1 ... 15 ("1" ... "f") для каждой фигуры. Входные данные для вашей программы не должны содержать никакой другой информации, кроме 6 шестнадцатеричных чисел, и входные данные не должны сортироваться каким-либо иным способом, кроме как в примерах, прежде чем они будут переданы вашей программе / функции. Сообщите нам, какой формат ввода использует ваше решение (входные данные не могут содержать никакой другой информации, кроме шестнадцатеричных значений).

  10. Форма внутреннего блока может быть полой. Отверстие должно содержать символы пробела, которые считаются стеной пробелов, то есть ширина отверстия в форме пустого внутреннего блока не может превышать 1 символов.

Три примера правильных полых форм:

aaa
a aaa
aaa

999
9 9
999
9

ffffff
f   ff
ffffff

Один пример неправильной полой формы:

ffffff
f   f
f   f
fffff

Я предполагаю, что все входные комбинации невозможно «решить» в соответствии с приведенными выше правилами, поэтому я перечисляю 10 примеров входных данных, которые ваша программа должна быть в состоянии «решить» (все проверяемо решаемо):

 1. 464fa6 (same as the first sample)
 2. 35bf12 (second example input seen above)
 3. 111126
 4. ff7fff
 5. 565656
 6. abcdef
 7. 1357bd
 8. 8c6a42
 9. ab7845
10. 349a67

Ваша программа должна быть в состоянии решить любой из 10 входов сэмплов за приемлемое время. Переведите разумное время с точностью до 1 часа на стандартный настольный компьютер. Скажем, как: 3 ГГц двухъядерный, 4 ГБ памяти для справки.

Это код гольф, выигрывает самое короткое решение. Решение может быть полностью работающей программой или функцией

Plarsen
источник
Что означает правило 7 о «соединении»? Является ли это просто повторением ограничения правила 5, которое (моя формулировка) запрещает существование пустого квадрата 2x2?
Питер Тейлор
Я сожалею о некоторых повторных заявлениях, но правило 7 является скорее повторным изложением правила 6, где указано, что формы должны быть однородными. Другими словами, правило 7 гласит, что одну форму нельзя разделить на две отдельные меньшие формы.
Пларсен
6
Я не собираюсь быть злым, но эта проблема никоим образом не является интригующей, интересной или демонстрирующей какие-либо эстетически привлекательные характеристики. это просто абстрактная задача, и я не понимаю, почему у кого-то хватило бы терпения даже прочитать все правила, не говоря уже о том, чтобы что-то решить. удачи с вашим следующим!
Богдан Александру
1
Пояснение: пробел может образовывать любую форму, если он разделяет блоки и не содержит блоков 2x2 и двух последовательных блоков пробелов на внешнем крае?
Джон Дворак
2
Этот вопрос очень сложный (или, может быть, я плохо решаю проблемы) ... У тебя есть решение, Пларсен? Во всяком случае, я думаю, что было бы более интересно отбросить требования к пробелам и сделать это вызовом кода, где оценка зависит как от количества символов, так и от высоты блока (таким образом, делая его полезным для упаковки, не делая это жесткое требование).
FireFly

Ответы:

1

Хаскелл, 156

Ну, этот немного растягивает правила. У меня нет пустых стен, кроме разрывов строк, поэтому все мои стены имеют длину 1.

import Data.List
r=replicate
main=getLine>>=putStrLn.concatMap(\b->unlines$s(head$elemIndices b"0123456789abcdef")b)
s n c|n<9=[r n c,""]|True=r 8 c:s(n-8)c

выход для 464fa6:

4444

666666

4444

ffffffff
fffffff

aaaaaaaa
aa

666666
Zaq
источник
Очень, очень близко :), но правило 4 не соблюдается, создавая воображаемый прямоугольник вашего вывода, у вас есть более 1 выравнивающего пробела в строке по правому краю.
Пларсен
1

BrainF * ck - 134 (перевод новой строки

>>+[++++++++++>,----------]>++++++[<+++++>-]<++[<]<++++++[>+++++<-]>++>-
>..<<.>>>..<<<.>>>>..<<<.<........>.>>>>..>>>.<<..>>.<..[<]>>.

Я думаю, что это самый простой ответ

Ввод осуществляется через 6 шестнадцатеричных символов в stdin, за которым следует новая строка для отправки.

РЕДАКТИРОВАТЬ: Это терпит неудачу из-за правила 6, которое я до конца не осознавал: /

Tyzoid
источник