Это мой первый вызов на PPCG!
вход
Строка, состоящая из двух разных символов ascii. Например
ABAABBAAAAAABBAAABAABBAABA
Вызов
Задача состоит в том, чтобы декодировать эту строку, следуя этим правилам:
- Пропустить первые два символа
- Разделить оставшуюся часть строки на группы по 8 символов
- В каждой группе замените каждый символ,
0
если этот символ совпадает с первым символом исходной строки, и с1
другим - Теперь каждая группа представляет байт. Конвертировать каждую группу в символ из байтового кода
- Объединить всех персонажей
пример
Давайте расшифруем вышеприведенную строку.
AB AABBAAAA AABBAAAB AABBAABA
^^ ^ ^ ^
| | | |
| \---------|---------/
| |
Skip Convert to binary
Обратите внимание, что A
это первый символ в исходной строке, а B
второй. Поэтому замените каждый A
на, 0
а каждый B
на 1
. Теперь мы получаем:
00110000 00110001 00110010
который находится [0x30, 0x31, 0x32]
в двоичном Эти значения представляют символы ["0", "1", "2"]
соответственно, поэтому конечный результат должен быть 012
.
счет
Это, конечно, code-golf , что означает, что ваш код должен быть максимально коротким. Оценка измеряется в байтах.
Ограничения и формат ввода-вывода
Стандартные правила применяются. Вот несколько дополнительных правил:
- Вы можете принять верный ввод
- Входная строка состоит ровно из двух разных символов
- Первые два символа разные
- Минимальная длина входной строки - 2 символа.
- Длина всегда даст 2 по модулю 8
- Вы можете предположить, что строка всегда будет состоять только из печатных символов ASCII
- Как во входной, так и в декодированной строке
- В выводе разрешены начальные и конечные пробелы (все, что соответствует
/\s*/
)
Ответы:
брейкфук ,
76 7165 байт-6 байт благодаря нитродону!
Попробуйте онлайн!
Чувствует себя странно, избивая Питона ...
источник
Stax ,
1511 байтЗапустите и отладьте его на staxlang.xyz!
Быстрый и грязный подход. Работаем над улучшением.Улучшил это!Распакованный (13 байт) и пояснения
источник
JavaScript (Node.js) , 67 байт
Попробуйте онлайн!
Как?
Мы используем два разных синтаксиса
Buffer
конструктора:Buffer([n])
генерирует буфер, содержащий единственный байт n, и приводится к соответствующему символу ASCII. Рассматриваются только 8 младших значащих битов n .Buffer(n)
генерирует буфер из n байтов. ПоэтомуBuffer(0)
генерирует пустой буфер, который приводится к пустой строке.Примечание: они оба устарели в последних версиях Node.
Buffer.from([n])
иBuffer.alloc(n)
должен использоваться вместокомментарии
источник
bash,
595852 байтаПопробуйте онлайн!
Спасибо Корову кряку за сохранение 6 байтов.
Эта задача замечательно работает с серией coreutils (и
dc
для преобразования и вывода в конце). Во-первых, мы используемтранслитерировать два символа на входе в нули и единицы.
-t
Флаг обрезает первый аргумент длины второго, так что это сводится к транслитерации первые два символа на входе в0
и1
, что это то , что мы хотим. Затем,удаляет первые два символа и
выводит 8 символов в строке. Наконец,
sed
команда превращает каждую строку воdc
фрагмент, который читает число в двоичном виде и выводит этот байт.источник
cut -c
может быть удален)Машинный код Z80 на Amstrad CPC,
32 3130 байтовКод принимает инструкцию, заменяющую каждый символ,
0
если этот символ совпадает с первым символом исходной строки, и1
буквально с иным способом и никогда не удосуживается проверить, соответствует ли символ второму символу во входной строке. Он просто проверяет, совпадает ли с первым символом и отличается от первого символа.Я выбежал из регистров (Z80 имеет только 7 легко используемые 8-разрядные регистры, необходимость остальные длинные инструкции) , так что я положил
&01
вH
, наряду с использованиемL
застроить ASCII символов (я просто понял , что это ненужно инициализациюL
, сохраняя один байт ). КогдаH
переполняется флаг переноса, символ вL
готов к выводу. К счастью, есть 16-разрядныйADC
( Ad d с C arry), который выполняет работу инструкции левого сдвига.(DE)
может быть прочитан,A
хотя(HL)
может быть прочитан в любой 8-битный регистр, так что это был компромисс, какой использовать. Я не мог сравнить(DE)
сC
напрямую, поэтому я должен был загрузить один вA
первый. Метки - это просто случайные слова, которые начинаются сL
(требование ассемблера).A
Аккумулятор - единственный регистр, который может делать сравненияB
регистр счетчикадля инструкции. Переставив код, я смог выполнить работуDJNZ
: D ecrement (B
) и J ump, если N на Z eroDJNZ
с одним меньшим байтомC
первый символ во входной строкеD
,E
АDE
адрес текущего входного символаH
триггер переноса (каждый 8-й цикл)L
выводимый символ создаетсяисточник
05AB1E , 10 байтов
Попробуйте онлайн!
-3 спасибо эмигне.
источник
01‡
вместо цикла. РЕДАКТИРОВАТЬ: или даже лучше:¦¦Sk8ôJCçJ
J,
1713 байт-4 спасибо FrownyFrog
Старая версия:
Объяснение:
Примеры:
источник
2}.1{=
сохранить 4 байта.[:
в начале :)Python 2 , 77 байт
Попробуйте онлайн!
источник
R , 71 байт
Попробуйте онлайн!
Удивительно гольф
Во-первых, преобразует строку в кодовые точки ascii
utf8ToInt
, сохраняя ее какy
. Удаление первых двух символов с отрицательной индексацией короче, чем использованиеtail
.Массив
y[-1:-2]==y[2]
эквивалентен битам при применении%*%
(умножения матрицы), но сначала мы преобразуем этот массив вmatrix
withnrow=8
, преобразуя из линейного массива в байтовые группировки. Случайно, мы можем затем преобразовать в кодовые точки ascii, используя умножение матриц с соответствующими степенями 22^(7:0)
, и затем мы конвертируем кодовые точки обратно в строку сintToUtf8
.источник
Python 3 , 77 байт
Попробуйте онлайн!
источник
PHP,
7371 байтЗапустите как трубу с
-nR
или попробуйте онлайн .golfings:
-6
и предварительно увеличить на8
strtr
игнорирует чрезмерные символы в длинном параметре (неsubstr
требуется)10
и затем инвертирование не требуют кавычек -> -1 байт~
служит границей слова -> -1 байт.источник
for(;$s=substr($argn,2+8*$i++,8);)echo~chr(bindec(strtr($s,$argn,10)));
Pyth,
209 байтовСохранено 11 байтов благодаря FryAmTheEggman.
Попробуй здесь
объяснение
источник
Рубин ,
8279 байтПопробуйте онлайн!
источник
.join
может быть заменен*''
, иs[0..1]
наs[0,2]
.Japt, 11 байт
Попытайся
объяснение
источник
s2
ярлыка, приятно.PHP + GNU Multiple Precision,
6361к сожалению, расширение GMP не активировано по умолчанию (но поставляется).
Запустите так:
источник
<?=
экономит 2 байта и, возможно, день. ;-)-R
(я пытался).-F
вместо этогоHaskell , 75 байт
Попробуйте онлайн!
источник
Java 8,
143,142,141 байт.-1 байт благодаря @ OlivierGrégoire .
Попробуйте онлайн.
Объяснение:
источник
Python 3 ,
9986 байтПопробуйте онлайн!
Спасибо ASCII-только за все это на самом деле
источник
APL + WIN, 30 байтов
Начало индекса 0. Запрашивает ввод строки
Объяснение:
источник
Красный , 110 байт
Попробуйте онлайн!
Объяснение:
Простое простое решение, без встроенных функций.
источник
Google Sheets, 123 байта
Вход находится в ячейке
A1
. Google автоматически добавит)))
в конец формулы.Объяснение:
Mid(A1,3+8*(Row(A:A)-1),8)
захватывает куски символов по 8 за раз, начиная с третьего.Substitute(Mid(~),Left(A1),0)
заменяет каждый экземпляр первого символа на 0Substitute(Substitute(~),Mid(A1,2,1),1)
заменяет второй символ 1.Char(Bin2Dec(Substitute(~)))
преобразует блок в десятичную, а затем в ASCII.IfError(Char(~,""))
исправляет все ошибки, возникающие из-за того, чтоRow(A:A)
возвращает намного больше значений, чем мы, чтоBin2Dec
дает нам множество нулевых значений иChar
ошибок на нуле.ArrayFormula(Join("",IfError(~)))
объединяет всеChar
результаты иArrayFormula
делаетRow(A:A)
возвращаемый массив значений вместо только первого значения.источник
Рубин ,
6142 байта-19 байт благодаря benj2240
Попробуйте онлайн!
источник
pack
это вдохновенный выбор, но сейчас вы как будто идете по длинному пути. Это может сделать еще больше работы для вас.Perl 5
-lp
, 34 байтаПопробуйте онлайн!
источник
REXX, 41 байт
Попробуйте онлайн!
источник
Python 2 , 88 байт
Попробуйте онлайн!
Не самый короткий - просто альтернативный способ.
Следующая версия печатает вывод в одну строку для 98 байтов, хотя правила утверждают, что конечный пробел разрешен .:
Попробуйте онлайн!
источник
/\s*/
.C # (компилятор Visual C #) , 158 байт
Попробуйте онлайн!
источник
Perl 5
-p
, 40 байтПопробуйте онлайн!
источник
Скала , 95 байт
Попробуйте онлайн!
источник
Haskell ,
12410593 байтаПопробуйте онлайн!
f
преобразует строку в список битов, сравнивая каждый символ с первым, превращаяBool
s в нули и единицы сfromEnum
.g
делит этот список на группы по 8, преобразует их в десятичные и принимает значение результирующего числа какEnum
, котороеChar
является экземпляром.Изменения:
map
в функцию)take
архивирования с более коротким списком)источник
toEnum
вместоchr
и отказаться от импорта. Такжеmap
может быть включен вg
. Пространство между8 s
может быть удалено.Forth (gforth) , 83 байта
Попробуйте онлайн!
Ввод - это стандартная строка Forth (адрес и длина), вывод выводится на стандартный вывод
объяснение
источник