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, але оскільки це ІНТЕРКАЛ, я також відчуваю, що не може бути.