DOWRITEIN.1PLEASE.1<-!1~#21845'$.1~#43690DOREADOUT.1DOGIVEUP
Спробуйте в Інтернеті!
Працює для 16-бітових цілих чисел, введення-виведення зроблено в найбільш природному форматі для INTERCAL: вхід - це серія десяткових цифр, написаних однією з декількох природних або побудованих мов, а вихід - "римськими цифрами, що врізані".
Це одна з тих рідкісних проблем, коли бінарні оператори INTERCAL насправді можуть бути використані інтуїтивно, оскільки перестановка бітів - це те, чим вони займаються. Select ( ~
) бере біти з першого аргументу, відповідного аргументам у другому аргументі, і прошиває їх праворуч з нулями та змішується ( ), і перемежовує їх назад у зворотному порядку. На щастя для підрахунку байтів, хоча оператори INTERCAL не мають визначеного пріоритету (оскільки мета мови - не мати прецедентів), виявляється, що C-INTERCAL у TIO не потребує великого групування для цього конкретного виразу, коштуючи лише один байт, оскільки можна скоротити .$
) перемежовує біти з його аргументами, щоб біти першого аргументу були більш значущими. Тож прямим рішенням є виділення менш значущих бітів, що чергуються ( .1~#21845
), виділення більш значущих бітів, що чергуються ().1~#43690
'.
!
З підтримкою 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
, але оскільки це ІНТЕРКАЛ, я також відчуваю, що не може бути.