Вступление
Некоторые персонажи ASCII просто так дороги в наши дни ...
Чтобы сэкономить, вы решили написать программу, которая кодирует дорогие символы, используя недорогие.
Однако цены на символы часто меняются, и вы не хотите изменять свою программу каждый раз, когда вам нужно кодировать или декодировать другой символ! Вам понадобится более динамичное решение.
Вызов
Ваша задача - написать две программы: кодировщик и декодер .
Кодер должен принимать список из пяти недорогих персонажей, и один дорогостоящий характер.
Он должен вывести единственную строку, составленную из недорогих символов, которая кодирует дорогой символ.
Эта строка не может быть длиннее 4 символов , чтобы остаться недорогой. Однако не обязательно использовать все недорогие символы в кодировании, и кодировки могут иметь разную длину.
Декодер должен принимать строку , выдаваемого кодером, и вывод дорогой символов.
Декодер не должен принимать никаких входных данных, кроме кодированной строки. Он должен работать без изменений с выхода энкодера для любой (действительной) комбинации входов. Другими словами, ваша программа декодера не знает, какие символы дорогие или недорогие.
счет
Самый короткий комбинированный код выигрывает!
Примечания
Все символы будут состоять из заглавных букв
[A-Z]
, строчных букв[a-z]
или цифр[0-9]
.Список недорогих символов не будет содержать дубликатов. Ни один персонаж не будет и недорогим, и дорогим.
Кодер и декодер не обязательно должны быть написаны на одном языке, но они могут быть. Вы можете написать программу или функцию.
Ввод и вывод могут быть в любом разумном формате для вашего языка.
Эти две программы не могут совместно использовать какие-либо переменные или данные.
Резюме
Ввод некоторых недорогих символов и дорогостоящего символа передается кодировщику.
Кодировщик выводит строку недорогих символов, кодирующих дорогой символ.
Декодер получает выходные данные кодера и выводит дорогой символ.
Примеры
Входные данные: a, b, c, d, e
f
Возможности кодировщика: a
eeee
caec
декодер: f
Входные данные: a, b, c, d, e
h
Возможности кодировщика: bc
cea
eeaa
декодер: h
Входные данные: q, P, G, 7, C
f
Возможности кодировщика: 777
P7
PPCG
декодер: f
Ответы:
Pyth, 46 байтов
Кодировщик, 22 байта
Декодер, 24 байта
источник
S4
сT
и сохранить каждый один байт в обеих программах.CJam,
55504847 байтКодировщик,
242221 байтПопробуйте онлайн.
Декодер,
31282726 байтПопробуйте онлайн.
источник
'
'
не оператор. Вы можете найти его на странице синтаксиса .gawk, 163 + 165 = 328
Протестировано с gawk 4.1.1, но должно работать и в старых версиях gawk. Нужно немного изменить (удлинить) для работы с mawk.
кодировщик (163):
декодер (165):
Ну, это работает, но я знаю, что это может быть не лучшим подходом для этого. Я понятия не имею, для чего пятое недорогое письмо, потому что я использую только четыре.
Они предназначены только для одноразового использования. Если вы хотите ввести второй код, вы должны перезапустить его. Пробелы после запятых необходимы во входных данных для кодирования.
О чем я думал
Мой первый вопрос был "Что мог получить декодер от этих 4 символов?" (Я назову их a, b, c и d), и моей первоначальной идеей было получить 6 битов информации из следующих отношений:
Вау, 6 бит, это прекрасно! Я думал, что это гений, но тестирование показало, что это не сработает. Есть только 24 возможных комбинации. Черт.
Следующим шагом была попытка сосчитать, исходя из того, что я уже знал. Таким образом, первая буква в строке станет 0, затем вторая буква в строке станет 1 и так далее. Но это не привело бы меня к 62 нужным комбинациям.
Но мне все равно идея нравится.
Ну, тогда меня поразило, что я могу объединить эти два, потому что символы во входных данных уже имеют отношения, и мне не нужно было ждать, пока они будут введены, чтобы дать им значение.
Как это устроено
Примечание: это уже не совсем то, как работают версии для гольфа, но принцип остался прежним.
Для декодера:
Создается массив, индекс которого содержит все четыре цифры, чья наибольшая цифра не превышает число различных цифр в этом числе. Существует 75 различных четырехзначных номеров, соответствующих этому условию. Я грубо насилую их, потому что до сих пор я не мог придумать, как их построить, и я не уверен, что это все равно будет короче в awk. В то время как я нахожу их, я назначаю им дорогих персонажей в азиатском порядке.
Затем я заменяю каждый символ из входной строки цифрой. Наименьшее (например, «B» меньше, чем «a») становится 1, второе наименьшее становится 2 и т. Д. До 4. Конечно, это зависит от того, сколько разных символов на входе, какая наибольшая цифра в результирующая строка будет.
Затем я просто печатаю элемент массива, который имеет эту строку в качестве индекса.
Кодер работает соответственно.
Как пользоваться
Либо скопируйте код непосредственно в команду awk bash line, либо создайте два файла «encode.awk» и «decode.awk» и вставьте код соответствующим образом. Или даже лучше использовать следующий код, который автоматически завершается после en / decoding или может использоваться несколько раз, удаляя команду выхода в конце.
encode.awk
decode.awk
Вот пример использования:
Помните, что пробел после каждой запятой требуется, если вы используете версии для гольфа.
Если вы хотите, вы можете использовать этот короткий и грязный скрипт для генерации примеров данных
и сделать что-нибудь смешное, как
Я видел это больше как программирование. Я думаю, это немного грустно, что почти все здесь - игра в гольф, потому что вы можете узнать намного больше из хорошо документированного, читаемого кода, но это только мое мнение. И я играл в гольф, как просили;)
источник