Благодаря вашей помощи в конкурсе « Пометить мою почту» PPCG-Post успешно проштамповала все свои посылки сгенерированными штрих-кодами!
Теперь пришло время расшифровать их.
В этом задании ваша программа с учетом штрих-кода, сгенерированного из задания « Пометьте мою почту» , расшифрует его и вернет закодированное целое число.
Но будь осторожен! Штрих-код может быть вверх ногами ...
Штрих-коды 4 штатов
В случае, если вы пропустили проблему кодирования, вам нужно знать, о каких штрих-кодах мы говорим. Штрих-код с 4 состояниями - это ряд столбцов с четырьмя возможными состояниями, каждое из которых представляет целое число с основанием 4:
| |
Bar: | | | |
| |
Digit: 0 1 2 3
Отрисованные в ASCII штрих-коды будут занимать три строки текста, используя |
символ pipe ( ) для представления части строки и пробел ( ) для представления пустого раздела. Между каждым баром будет один пробел. Пример штрих-кода может выглядеть следующим образом:
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
Чтобы преобразовать штрих-код обратно в целое число, которое он кодирует, сопоставьте каждую полосу с соответствующей ей цифрой base-4, объедините их и преобразуйте в десятичную.
Поскольку каждый штрих-код будет также представлять различный штрих-код в перевернутом положении, мы реализуем последовательность запуска / остановки, чтобы можно было рассчитать ориентацию. Для этой задачи мы будем использовать последовательность запуска / остановки, указанную Австралийской почтой: каждый штрих-код начинается и заканчивается 1 0
последовательностью.
Соревнование
Ваша задача состоит в том, чтобы, учитывая штрих-код ASCII с 4 состояниями, проанализировать его и вернуть целое число, которое он кодирует - по сути, это обратная функция Mark My Mail .
Но, чтобы оживить ситуацию, есть загвоздка - штрих-код может быть перевернут. Как и в реальном мире, он будет предоставлен считывателю штрих-кода (вашей программе) для определения правильной ориентации с использованием последовательности запуска / остановки.
Пример:
Учитывая следующий штрих-код:
| | | | | | | | | | | | | | | | | | | |
Мы можем четко видеть, что первая и последняя пары цифр есть 0, 2
и нет 1, 0
. Это означает, что штрих-код перевернут вверх дном, поэтому мы должны повернуть его на 180 градусов (а не просто перевернуть каждую полосу), чтобы получить правильную ориентацию:
| | | | | | | | | | | | | | | | | | | |
Теперь мы можем начать декодирование. Мы сопоставляем каждый столбец с соответствующей ему цифрой base-4, игнорируя последовательности запуска / остановки, поскольку они не кодируют данные.
| | | | | | | | | | | | | | | | | | | | - - 2 1 0 3 0 2 3 - -
Мы соединяем это с целым числом 4 2103023
, а затем преобразуем в десятичное представление 9419
для конечного результата.
правила
- На входе всегда будет действительный штрих-код из 4 состояний, отображаемый в ASCII, как описано выше, с описанной последовательностью запуска / остановки.
- Вы можете запросить завершающие пробелы или зачеркнутые строки, а также завершающий перевод новой строки - в зависимости от того, какой формат вам подходит.
- Он может или не может быть в правильной ориентации - ваша программа должна определить, читать ли ее вверх ногами, используя последовательность запуска / остановки.
- Он не будет кодировать первые нулевые цифры в целых числах от 4 до 4.
- Вы можете принять входные данные в виде списка строк или строки с символами новой строки.
- Выходными данными должно быть целое число в стандартной базе целых чисел вашего языка, представляющее данные, которые были закодированы штрих-кодом.
- Поскольку почтовые марки маленькие и могут вместить в себя очень мало кода, ваш код должен быть как можно короче: это код-гольф - поэтому выигрывает самая короткая (в байтах) программа!
Тестовые случаи
| | | | | | | | | | | | | |
= 4096 (перевернуто)
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
= 7313145 (перевернуто)
| | | | | | | | | | | | | | | | | | | |
= 9419 (перевернуто)
| | | | | | | | | | | | | | | | | | |
= 990 (не перевернуто)
| | | | | | | | | | | | | | | | | | |
= 12345 (не перевернуто)
[String]
,[{#Char}]
,[{Char}]
,[[Char]]
?, Учитывая , чтоString
эквивалентно{#Char}
Ответы:
Желе , 18 байт
Попробуйте онлайн!
источник
Шелуха , 16 байт
Попробуйте онлайн!
Ввод - это список строк (для ясности ссылка TIO использует многострочную строку). Строки должны иметь одинаковую длину, и не должно быть дополнительных пробелов.
объяснение
источник
SOGL V0.12 ,
4032 байтаПопробуй здесь!
источник
Python 2 ,
113105 байтПопробуйте онлайн!
источник
Python 2 , 96 байт
Попробуйте онлайн!
источник
Сетчатка , 71 байт
Попробуйте онлайн! Ссылка включает в себя меньшие контрольные примеры. Требуется, чтобы первая и последняя строки были дополнены пробелами по длине средней линии. Объяснение:
Удалите ненужные пробелы.
Поменяйте местами символы в коде, но если штрих-код начинается с символа a
|
, выберите весь код, в противном случае разделите его на символы. Затем поменяйте их местами. Это переворачивает код, если он начинается с0
.Удалите последовательность запуска / остановки и средний ряд (который нам не нужен).
Преобразовать пробелы и
|
s из базы 4 в одинарные.Удвойте последнюю строчку.
Преобразовать в десятичную.
источник
Java (OpenJDK 8) ,
181160 байтНе слишком потрепанный для решения Java, я уверен, что есть оптимизация, которую я могу сделать, но я уже слишком долго смотрел на это.
Сократите несколько байтов, сокращая цикл, а не используя подстроку.
Golfed
Попробуйте онлайн!
Ungolfed
источник
l+~i
вместоl-1-i
Java 8 ,
208166157151 байтПопытка сделать это, вероятно, может быть лучше: 42 из-за ненужных проверок, -9 удаление переменных, -6 благодаря Люку Стивенсу
Вход является
char[][3]
ungolfed:
источник
Чисто ,
191...161144 байтаПопробуйте онлайн!
источник
Пип ,
464342 байтаПринимает строки штрих-кода как три аргумента командной строки. Первая и третья строки должны быть дополнены до длины второй строки пробелами. Попробуйте онлайн!
объяснение
Сначала некоторые подготовительные работы:
Теперь обратите внимание, что если мы игнорируем среднюю строку и рассматриваем
как 0, каждый столбец - это просто 2-битное двоичное число:
|
как 1 иисточник
Шелуха ,
3938 байтВводит в виде списка строк: попробуйте онлайн или попробуйте набор тестов!
объяснение
источник
Perl 5 , 152 + 2 (
-F
) байтовПопробуйте онлайн!
источник
Октава ,
807568 байтПопробуйте онлайн!
Любопытно,
bi2de
что по умолчанию MSB справа, а не слева, что приводит к некоторым головным болям, пока я делал это ... Я думаю, что у меня должен быть оптимальный способ перевернуть массив перед его индексацией, но есть очень много способов сделать это ( либо в первой индексации, илиflipud
,fliplr
,rot90
,'
(транспонирование), окончательная индексация ...). Принимает прямоугольный массив с пробелами и|
s (поэтому, требуются конечные пробелы)источник
JavaScript (ES6),
184181 байтЯ не опытный игрок в гольф - я уверен, что это можно улучшить, но мне понравился этот вызов! Я всегда задавался вопросом об этих отметках.
Функция
f
принимает список строк с необходимыми конечными пробелами. Новые строки добавлены в код ниже для ясности (не включены в число байтов).использование
Неуправляемая версия с объяснением
источник