# 4"16" 3//v\(@#/;\D"14"<;n4
#/*`3 afaaZ">;[77*,68*,@;'1,'1,q)(22)S# ␉␉␉␉ (
#yy␉;36!@
#`<` ␉
#=␉x
#<]+<[.>-]>[
#␉<
###xR+++++[D>+++++++L+++<-][<<<]>+.---.>][
#px%>~~~+␉+~*ttt*.x
#D>xU/-<+++L)
#R+.----.R␉>]|
#[#yy#yy0l0mx01k1k0l0ix0jx0h0h1d111P0eU0bx0b0o1d0b0e0e00x1d0i0fx0g0n0n11x0o0n0cx0c0o0f0c0gx0g0f0h0j0j0i0001k10mx0m0l11111100(^_)
#|␉
print((eval("1\x2f2")and(9)or(13 ) )-(0and 4)^1<<(65)>>(62))or'(\{(\{})(\{}[()])}\{}\{}\{})'#46(8+9+9+9+9+=!)#1111|=/=1/24=x=9[<$+@+-@@@@=>+<@@@=>+<?#>+.--.]/
__DATA__=1#//
#.\."12"␉*
###; console.log 39
""""#//
=begin␉//
#*/
#define␉z sizeof 'c'-1?"38":"37"
#include<stdio.h>
int main() /*/
#()`#`\'*/{puts(z);}/*'``
$'main'␉//
#-3o4o#$$$
<>"3"O.<␉>//
#
=end #//
"""#"#//
#0]#echo 21#/(\[FAC,1<-#2FAC,1SUB#1<-#52FAC,1SUB#2<-#32FACLEGEREEX,1PLEASEGIVEUPPLEASE) a>>>
#>27.say# /7Jn~15o|
#8␛dggi2␛`␉|1|6$//''25 =#print(17) ###^_^_LEintnd"3"z!]/}23!@/*///Z222999"26
␉
является буквенной вкладкой, ␛
буквальным символом ESC; В противном случае Stack Exchange может испортить программу. Я рекомендую скопировать программу из поля «ввода» ссылки TIO ниже, если вы хотите работать с ней.
Попробуйте онлайн!
VIP Score (универсальный целочисленный принтер): 0,01329
Наезжать
Эта программа печатает 41 в brainf ***, 40 в Minimal-2D, 39 в CoffeeScript, 38 в C, 37 в C ++, 36 в Лабиринте, 35 в INTERCAL, 34 в Rail, 33 в Incident, 32 в Whirl, 31 в Модульный SNUSP, 30 в пустом пространстве, 29 в Trigger, 28 в Brain-Flak, 27 в Perl 6, 26 в 05AB1E, 25 в Pip, 24 в Thutu, 23 в Hexagony, 22 в недогрузке,21 в Ниме, 20 в Прелюдии, 19 в Ренге, 18 в Кардинале, 17 в Юлии, 16 в Пите, 15 в Хейстеке, 14 в Туртледе, 13 в Рубине, 12 в Делении, 11 в Бефунге-98, 10 в Бефунге- 93, 9 в Perl 5, 8 в Retina, 7 в Japt, 6 в SMBF, 5 в Python 2, 4 в> <>, 3 в Minkolang, 2 в V / Vim и 1 в Python 3.
верификация
Большинство языков протестировано тестовым драйвером, показанным выше. Вы можете проверить Reng здесь и Modular SNUSP здесь ; они выдают соответственно 19 и 31 соответственно.
Наконец, тестовый драйвер был обновлен и теперь включает токенизатор. Весь код C хранится в качестве аргумента с точки зрения Bash Script. Я также изменил вывод для горизонтальной переноса с завершающим пробелом после каждого токена вместо вывода по вертикали. Это было только мое предпочтение, чтобы оно соответствовало выводу пробелов. Но любой может изменить это, если почувствует, что это слишком запутанно.
Я также выполнил настройку Test Driver, чтобы обрабатывать интервалы между столбцами для символа UFT8 Turtlèd в кратком изложении. Это смещение сводило меня с ума! «Исправление» довольно хакерское, так как оно просто ищет è и изменяет ширину столбца для этого случая, но выполняет свою работу.
объяснение
Прежде всего, я хочу сказать, каким был потрясающий фрагмент кода из универсального целочисленного принтера SnoringFrog @ Score из последнего поста. Я подсчитывал ответы, прежде чем публиковать сообщения некоторое время, и это вдохновило меня на то, чтобы они оставались маленькими. Я думаю, что мы можем победить ответ @ sp3000 в конце концов.
Таким образом, я начал работать над этим ответом, пытаясь найти лучшее, что мог, и я был довольно успешным. У меня даже был ответ на другом языке с общим числом байтов меньше, чем # 40. Но когда я попытался играть в Minimal-2D, мне пришлось изучать BF, чтобы я мог лучше работать с его производными, и в процессе я обнаружил рекорд @ Primo - Hello, World!, Я влюбился в элегантность.
Оказалось, что Minimal-2D не был достаточно эффективным, чтобы использовать технику инициализации ленты, используемую @Primo, но сейчас я придерживаюсь мнения, что в любом случае он будет слишком тяжелым. Мы только пытаемся напечатать целое число в конце концов. Но @Primo действительно отправил меня на путь обучения умножению в BF, который я привел в код Minimal-2D.
Затем, после всего этого, я перечитал комментарий @ SnoringFrog о том, как включить BF, и понял, что я не только могу это сделать, но и могу использовать большую часть кода Minimal-2D, который я использовал в ответе BF. Так что я закопался, чтобы ответить с BF, и вот мы здесь.
Еще одна вещь, прежде чем я углублюсь в детали. Было несколько изменений, которые я сделал по причинам, не связанным с гольфом. Во-первых, я переместил большую часть кода @SnoringFrog, добавленного чуть ниже 2D-языков, в верхние несколько строк. Для меня это долгосрочный стратегический шаг, направленный на предотвращение пересечения 2D-языков по центру полиглота с целью предотвращения возможных ошибок в будущем. Хит байта был низким для этого хода, поэтому я пошел на это.
Во-вторых, во время различных повторных факторов я узнал, что Begunges и Minkolang выводят завершающий пробел после числовых выводов и что это было причиной нулевых байтов, которые мы видели в тестовом драйвере для этих языков. Я исправил их, выведя значение стека в виде кода ascii (который не включал функцию конечного пробела) вместо значения напрямую. Для этого изменения также был небольшой удар по байту, но теперь вывод Test Driver стал настолько равномерным. Как я мог не?
SM / BF
Давайте быстро пройдемся по основам. Это единственные допустимые команды для SMBF и BF:
> Move the pointer to the right
< Move the pointer to the left
+ Increment the memory cell under the pointer
- Decrement the memory cell under the pointer
. Output the character signified by the cell at the pointer
, Input a character and store it in the cell at the pointer
[ Jump past the matching ] if the cell under the pointer is 0
] Jump back to the matching [ if the cell under the pointer is nonzero
Оба языка имеют ленту памяти, где значения хранятся и изменяются. Единственное отличие SMBF состоит в том, что любой выполняемый код также сохраняется на ленте памяти слева от начальной точки. Как указывало @SnoringFrog, получение SMBF и BF для получения разных результатов зависит от перемещения указателя памяти слева от начала координат. В BF-интерпретаторе Tio указатель памяти способен перемещаться влево от начала координат и найдет 0 вместо кодов ascii Полиглота, которые видит SMBF. Вот пример, который может быть запущен как в SMBF, так и в BF, чтобы проиллюстрировать разницу.
В начале полиглота, Befunges требуют, чтобы >
второй ряд работал до завершения, а Perl6 требует, чтобы каждому >
предшествовал a <
. Таким образом, SM / BF начинают с того, <>
что оставляют указатель памяти в начале координат, затем нажимают a, [
который перебрасывает некоторые оскорбительные символы для обоих языков в ]
шестую строку.
Затем мы увеличиваем ячейку памяти источника для обоих языков и перемещаем указатель памяти влево с помощью +<
. (Для разговорного соглашения мы будем называть ячейку памяти источника ячейкой 0, ячейки справа от источника 1, 2, ... И ячейки слева -1, -2,…). Ячейка -1 содержит код Аски последнего символа в полиглоте в SMBF и 0 в BF, поэтому, когда [
встречается следующее , только BF переходит к следующему]
пока SMBF переходит в код.
Когда SMBF проходит, [.>-]
он печатает 6, найденный в конце полиглота, а затем перемещает указатель памяти обратно в ячейку 0, устанавливая его значение обратно в ноль, чтобы выйти из ]
. Чтобы рассмотреть, ленты в этой пинте: отрицательные ячейки SMBF содержат полиглот, и это 0, и положительные ячейки содержат ноль. Отрицательные и положительные ячейки BF содержат ноль, а его исходная ячейка - 1.
Затем >
перемещаем SMBF в ячейку 1, а BF обратно в ячейку 0, позволяя BF ввести свой блок частного кода: [<+++++[>++++++++++<-][<<<]>+.---.>]
(я удалил не-BF символы из этого). Здесь мы возвращаемся к ячейке -1 и инициализируем нашу переменную управления цикла (ячейка -1) значением 5. Затем мы входим в цикл, где мы добавляем 10 к ячейке 0 и уменьшаем ячейку -1 пять раз перед выходом из цикла, где мы будем указывать на ячейку -1 со значением 0.
Далее мы сталкиваемся [<<<]
, указывая на ноль, поэтому BF не проходит через это. Цель здесь - сбалансировать число >
с предыдущими <
, чтобы Perl6 не ошибался.
В этот момент ячейка 0 имеет значение 51. Значение ascii для 4 равно 52, поэтому мы перемещаем указатель в ячейку 0, добавляем 1, а затем печатаем значение. И, наконец, мы уменьшаем ячейку 0 обратно до символа ascii 1 и печатаем снова перед установкой указателя памяти на ячейку 1 (значение 0) для выхода после ]
.
SMBF и BF оба попадают последними [
в строку 8 рядом, в то время как оба покоятся на значении 0. Таким образом, оба переходят мимо оставшегося минимально-двумерного кода, пока ]
не встретятся в строке 11. Но это недолговечно, потому что строка 12 начинается с другого, [
который переносит оба языка почти до конца полиглота, где не встречаются дальнейшие инструкции.
Refactors
Минимально-2D
Перезапись в Minimal-2D была в основном для сохранения некоторых байтов способом, аналогичным трюку умножения BF. Минимально-2D , однако , не имеет [
и ]
символы для управления с обратной связью. Вместо этого он имеет следующие команды:
/ Skips next instruction if the data pointer is set to 0.
U Tells the program to switch to the up direction of processing instructions.
D Tells the program to switch to the down direction of processing instructions.
L Tells the program to switch to the left direction of processing instructions.
R Tells the program to switch to the right direction of processing instructions.
Они могут быть использованы для создания той же логической структуры, хотя и в 2D-усадьбе, что и BF. Например, BF ++++++[>++++++<-]>.
эквивалентно этому в Minimal-2D.
Вот упрощенная версия кода Minimal-2D в полиглоте, с удалением всего постороннего кода и заменой всех мест, содержащих символы #
.
###################D
###R+++++[D>+++++++L
###>
D>#U/-<+++L)
R+.----.R
D
В строке 1 посылает указатель инструкции вниз к L
в 8 -ой строке полиглота , который посылает указатель влево. Здесь мы устанавливаем переменную управления циклом (ячейка 0) на 7, перемещаем указатель памяти в ячейку 1 и вводим цикл. В цикле мы добавляем 3 к ячейке 1, уменьшаем ячейку 0, затем проверяем, равно ли значение ячейки 0 нулю. Если нет, мы добавляем еще 8 к ячейке 1, затем уменьшаем и проверяем снова. Результатом этого цикла является значение ячейки 1, равное 51 в конце цикла (6 * 8 + 3).
Мы выходим из цикла, прыгая U
, перемещая указатель памяти в ячейку 1 и спускаясь затем вправо в строке 11 полиглота. И, наконец, мы увеличиваем до значения ascii для 4, затем уменьшаем до значения ascii для 0 перед тем, как убежать вправо, чтобы завершить программу.
Сетчатка
У Retina было много требований, с которыми было трудно работать для всех производных BF. Он не любит последовательных +
или несовпадающих ()
или []
. Но на самом деле это просто требования для каждой другой строки, поэтому большая часть работы для BF, SMBF и Minimal-2D была сосредоточена на том, чтобы поместить большую часть кода в четные строки.
Один байт, переданный только Retina, находится |
в конце строки 11. Цитируя @ ais523 «большинство регулярных выражений заканчивается на | будет соответствовать чему угодно ». Без этого Retina возвращает 0. Почему это не исправить, я не знаю. Мне не пришлось слишком много копаться в сетчатке, вероятно, потому что я избегал длинной очереди. Но, как и в случае с Prelude, я обнаружил, что мне не нужно понимать это так сильно, как мне нужно понимать, как отлаживать его, что в данном случае в основном состояло из удаления строк (кратных 2), пока я не нашел строку это заставляет это сломаться. Я догадался об этом исправлении, основываясь на комментарии @ ais523, и был вознагражден. Я просто слишком крут для школы, я думаю.
кардинальный
Мне так понравилось расположение @ SnoringFrog Minimal-2D относительно кода Кардинала. Это хорошее место, учитывая, что Кардинал не расстраивает Retina, и, кажется, оно позволяет немного переплетаться с Minimal-2D. Поэтому, когда я решил пересадить Minimal-2D на 2D, я взял с собой Кардинала для поездки. Было несколько косметических изменений в Кардинале. Во-первых, я бросил >
в начале своего утверждения #p x%>~~~+ +~*ttt*.x
для Minimal-2D, чтобы изменить указатели памяти в его цикле. Во-вторых, я сдвинул все на один символ вправо, чтобы дать Minimal-2D пространство для изящного выхода из цикла. В p
этом укусе для этого заполнения символов.
Befunge / 98
На самом деле Befunges были тем местом, где я начал пытаться играть в полиглот, так как рефактор C ++ изменил весь другой двумерный код языка, кроме этого. Пытаясь понять, что в этом коде происходит WTF, я нашел это в документации по Begunge:
Команда .
извлекает значение из стека и выводит его в виде десятичного целого числа, за которым следует пробел , похожий на Forth. ,
отобразит значение, интерпретирует его как значение ASCII символа и выведет этот символ ( без пробела ).
Святой молей! Мы можем очистить нулевые байты на выходе. После этого все было лишь вопросом выяснения того, как вводить большие значения аски, и разделения кода. Befunge-98 был прыжок код , ;
говоря его пропустить через [77*,68*,@
ин ;[77*,68*,@;'1,'1,q
, который дал нам сегрегацию.
В Befunge-98 также была команда ( '
) для получения кода ascii следующего символа. Итак, '1,
берет код asci-кода для символа 1
, помещает его в стек и затем печатает символ ascii для верхнего значения в стеке с помощью ,
. Просто нужно сделать это дважды, чтобы напечатать 11 и бросить, q
чтобы выйти изящно.
Собственно, это немного менее удобно, но только справедливо. Здесь мы должны выполнить расчет, чтобы поместить нужный код в стек. К счастью, наши коды были легко умножены на 7 * 7 и 6 * 8 перед той же командой вывода ,
. Затем мы вышли из Befunge, @
пока код его старшего брата не испортил вывод.
Minkolang
После того, как я нашел исправление для пробелов в Befunge, я довольно увлекся идеей найти исправление Minkolang, и в документации Minkolang сказано, что выходная команда, которая использовалась до этого момента, работала так же, как и интерпретатор Befunge. O
случилось, что была задокументирована как другая выходная команда, которая не описывалась как разделение этого Begunge-ness, поэтому я просто сделал снимок в темноте и попытался вывести строку "3"
. Безупречная Победа.
> <>
Одной из первых вещей, на которые я обратил внимание при перемещении кода Minimal-2D, была проверка того, что я могу перемещаться> <> вместе с ним. Если я собирался иметь дело с трансверсализмом 2D-полиглота, я собирался иметь дело со всеми нарушениями. По сути, мне повезло, что я нашел путь ;n4
к концу строки 1 и переместился \D
дальше назад в строке 1. Кстати, я не знал, что> <> можно было бы направить вниз до ответа 40, поскольку он так хорошо сдерживался. , Я хотел бы думать, что это может быть использовано позже, чтобы отличаться от> <> от другого подобного языка.
Perl6
Я говорил о некоторых проблемах <>
балансировки в Perl6 в другом месте этого ответа, поэтому я не собираюсь останавливаться на этом снова. Но я хочу отметить, что перешел #>27.say#
со второй на последнюю строчку. Это не имеет функциональной цели в этом ответе. Я действительно сделал этот шаг, чтобы удовлетворить другой ответ, который я не использовал в этом раунде. Я решил просто оставить его, так как планирую опубликовать этот ответ при моей следующей возможности, и я не хотел беспокоиться об отмене и повторном выполнении этого.
Исправление ошибок
05as1e
05as1e определенно не понравился новый код Begunge так же сильно, как старая версия. Я предполагаю, что это ,
s, так как это единственный революционный персонаж. В любом случае мне пришлось переместиться "
еще дальше во второй строке, чтобы скрыть наступательные команды, и я знал, что они "
должны были идти до пути к коду Befunge, так как это "
было да-оп на обоих языках. (Я могу просто придумать такие термины, как да-да, верно?) <
Двухмерность строки 2 довольно жесткая, но я смог сместить предшествующий пути кода Бегунге с "
. <
Однако было требование Perl6. (У него должен быть <
предшествующий всем >
s.) Я был в состоянии бросить <
в первой строке в месте, предугаданном инстинктом и предвидением, решающим 05ab1e и разногласия Perl6.
завихрение
Изменения в Befunge в строке 2 добавили дополнительный 1
в полиглот до линии Incident / Whirl. Этот дополнительный 1
побудил Вихря начать указывать на неправильные инструкции на колесе. Самой первой 1
в директиве препроцессора C / C ++ была только ссылка на номер строки в коде, и это может быть просто любой другой номер строки, поэтому я произвольно изменил его, 4
чтобы удовлетворить Whirl.
инцидент
На этом этапе строка детокенизации в конце полиглота хорошо известна, поэтому я не буду вдаваться в подробности. Я удалил из строки все, что мог, и добавил новые токены, которые требовались. Есть 2 символа детоксикации, которых нет в этой строке, хотя я должен отметить. Во- первых, второй R
в #R+.----.R >]|
необходимости здесь , потому что это Fusion отправной точкой, и это было безопаснее на этой линии , потому что уже была точка заголовка Fusion отправным в том же направлении. Во- вторых, x
в #= x
это удалить маркер , участвующих в ␉␊#
шаблоне, который стал более распространенным.
другие
У Hexagony, Whitespace и Prelude были обычные незначительные изменения, но ничего особенного не стоило говорить.
Последние мысли
Это все, что у меня есть для этого ответа. Для тех, кто ищет отправную точку в следующем ответе, я бы предложил зло. Это кажется работоспособным, хотя я не смотрел на это слишком внимательно, но я подозреваю, что это не будет слишком сложно интегрировать. Я знаю, что у него есть команда перехода, которая должна помочь пропустить большую часть полиглота. Удачи.