DOWRITEIN.1PLEASE.1<-!1~#21845'$.1~#43690DOREADOUT.1DOGIVEUP
Попробуйте онлайн!
Работает для 16-разрядных целых чисел, при этом ввод / вывод выполняется в наиболее естественном формате для INTERCAL: входные данные представляют собой последовательность десятичных цифр, написанных на одном из нескольких естественных или составных языков, а выходные данные представлены «разделенными римскими цифрами».
Это одна из тех редких проблем, когда бинарные операторы INTERCAL могут фактически использоваться вообще интуитивно, поскольку биты перемещения - это то, о чем они все. Select ( ~
) берет биты из своего первого аргумента, соответствующие единицам в своем втором аргументе, и дополняет их нулями справа, а mingle ( $
) перемежает биты из своих аргументов так, чтобы биты из первого аргумента были более значимыми. Таким образом, простое решение состоит в том, чтобы выбрать менее значимые чередующиеся биты ( .1~#21845
), выбрать более значимые чередующиеся биты ().1~#43690
) и чередовать их вместе в обратном порядке. К счастью для подсчета байтов, хотя операторы INTERCAL не имеют определенного приоритета (так как целью языка является отсутствие прецедентов), получается, что C-INTERCAL в TIO не требует большой группировки для этого конкретного выражения, поскольку стоит всего один байт, так как '.
может быть сокращено !
.
С поддержкой 32-битных целых чисел:
DOWRITEIN:1PLEASE:1<-':1~#0$#65535'$:1~#65535$#0DOREADOUT:1DOGIVEUP
Попробуйте онлайн!
INTERCAL не допускает 32-битные литералы, что на самом деле делает это немного легче для чтения, так как это означает, что магические константы для выбора чередующихся битов должны создаваться путем смешивания двух 16-битных литералов вместе, где один - все нули, а другой - все. (На самом деле, даже если бы были 32-битные литералы, это все равно было бы короче. #0$#65535
Это два байта #1431655765
, и то же самое относится и к другому.) Это неестественно хорошо передает весь процесс для INTERCAL.
Альтернативный подход с неуклюжим использованием перегрузки операндов :
DO:1<-:1/.2$.3PLEASEWRITEIN:2DO:1<-:2PLEASE:2<-.3$.2DOREADOUT:2DOGIVEUP
Попробуйте онлайн!
Это избавляет от выбора вообще, объявив , что :1
будет .2
смешивался с .3
, установив :1
на вход, а затем выводит .3
смешанный с .2
. Так как :1
был перегружен как .2$.3
, DO :1 <- :2
присваивает значения .2
и так .3
, что :1
получает значение :2
, что приводит к тому , что .2
содержат более значимые чередующиеся биты из :2
и .3
содержат менее значимые чередующиеся биты. Это было бы меньше двух 32-битных решений на четыре байта, если их PLEASE WRITE IN :1
можно было бы заменить PLEASE WRITE IN :2 DO :1 <- :2
на перегруженные :1
, ноCALCULATING
оказывается необходимым для использования перегрузки. Я также чувствую, что может быть какой-то более короткий способ выполнить саму перегрузку, чем запуск программы DO:1<-:1/.2$.3
, но так как это INTERCAL, я также чувствую, что этого не может быть.