Транспонировать Quine


10

В этом варианте Quine ваша программа должна вывести свой исходный код, транспонированный по диагонали от верхнего левого угла до нижнего правого. Например:

ваша программа
на
четыре строки

выходы

 yof
 ono
 u u
 r r
    
 p l
 r i
 o n
 g e
 r s
 a
 m

Пробелы в выходных данных не являются произвольными. Пробелы появляются в двух ситуациях: где в оригинале есть пробел (например, между rи lв четвертом столбце) и где необходимо добавить символы (например, все пробелы в первом столбце). Оба требуются, и пробелы нигде не могут появляться еще в выходной.

Отдельный завершающий символ новой строки в выходных данных может быть опционально проигнорирован. Конечные переводы строк в исходном коде не влияют на вывод, и начальные переводы строк в исходном коде должны обрабатываться, как в примере выше. Предположим, что каждый символ, не являющийся символом новой строки, имеет ширину в один столбец и высоту в одну строку, хотя для таких символов, как символ табуляции, это может привести к ужасному выводу.

Ваше решение должно содержать как минимум две строки, содержащие не менее двух символов, не являющихся символами новой строки, и не должно иметь своей собственной транспонирования (выходные данные не могут быть идентичны источнику.)

Мошенничество с квин-кодами, которые читают из файла, содержащего их исходный код, извлекают данные из URL-адреса, используют встроенные функции квинтинга и т. Д., Не допускается.

Это код гольфа: выигрывает самый короткий код в байтах.


Должно ли это быть настоящим куном?
lirtosiast

2
@ThomasKwa В отличие от?
Мартин Эндер

@ MartinBüttner Может быть, есть язык, где литералы отражаются транспонированно. Так, на всякий случай.
lirtosiast

@ThomasKwa Это нормально, если оно соответствует всем указанным правилам.
Люк

Запрещено ли использование внешних библиотек (таких как Lodash в Javascript)?
Mama Fun Roll

Ответы:


5

CJam, 14 байтов

{`"_~".+N*}
_~

Проверьте это здесь.

Хотя короче, вероятно, немного менее интересно, чем решение Fission.

объяснение

{       e# Quine framework. Runs the block while another copy of it is on the stack.
  `     e# Stringify the block.
  "_~"  e# Push the remaining code as a string.
  .+    e# Element-wise append... essentially puts the two strings in a grid and 
        e# transposes it.
  N*    e# Join with linefeeds.
}_~

10

Деление , 17 байт

Все еще мой любимый язык для куин ...

'"
!0
0+
;!
DN
"!

Попробуйте онлайн!

объяснение

Это очень похоже на основную квину деления . На самом деле, если бы не правило «должно быть как минимум две строки, по крайней мере, с двумя не-символами новой строки в каждой», я просто мог бы перенести это и заменить Rна D. Это правило делает вещи немного интереснее, потому что нам нужно напечатать еще одну строку.

Поток управления начинается Dс одного атома, идущего на юг. Так как это поражает, "это обернет вокруг и напечатает

'!0;D

на STDOUT, похоже на то, как это было бы в обычной Quine. '!затем устанавливает массу атома в код символа !. Это 0телепорт, который транспортирует атом во второй столбец, где он все еще движется на юг.

При этом +мы увеличиваем массу атома до значения ". !N!печать цитаты, перевод строки, цитата. STDOUT теперь выглядит так:

'!0;D"
"

Обернувшись, атом попадает в другой "и теперь печатает дословно вторую строку:

'!0;D"
"0+!N!

Мы закончили сейчас. Атом снова использует телепорт и приземляется в том, ;что уничтожает его и тем самым завершает программу.

Я полагаю, что самое интересное здесь - это поместить один "внизу, а другой вверху, чтобы я мог распечатать их за один раз, не устанавливая значение !еще раз (потому что оно будет перезаписано при повторном входе в строковый режим).


3

Javascript ES6, 90 байт

$=_=>[...(_=`$=${$};$()`.split`
`)[0]].map((x,y)=>_.map(v=>[...
v][y]).join``).join`
`;$()

Не плохо, не плохо.

объяснение

Вот стандартная структура Quine:

$=_=>`$=${$};$()`;$()

Чтобы изменить, я просто разделил строку квин по новым строкам и символам, чтобы создать матрицу символов, транспонировал с помощью 2 функций карты и объединил для создания выходных данных.



2

Befunge-93 , 57 байт

^
_^
,@
+,
5*
52
,+
*9
28
+|
9
8#
|!
 ,
##
!:
,^
#
:
^
""

Это работает, помещая каждый символ в первый столбец в стеке (кроме самой кавычки), затем печатая каждый элемент из стека. После этого он печатает кавычку, печатает новую строку, а затем переходит ко второму столбцу. Это делает то же самое без печати новой строки.

Вы можете проверить это по ссылке в заголовке, но вам нужно будет скопировать код в окно самостоятельно. Если вы нажмете кнопку «медленно», она покажет вам путь, по которому идет указатель, и стек в данный момент.


Может быть короче переместить цитату во втором столбце вверх, как я сделал в своем ответе Fission?
Мартин Эндер

Я могу переместить кавычку в верхнюю часть и переставить второй столбец, чтобы он по-прежнему работал, но в итоге он все равно остается 57 байтами, поскольку первый столбец все еще должен быть такой же высоты
Кевин В.

Хм, ладно, я подумал, что это может позволить вам сгенерировать "только один раз, чтобы вы могли переместить некоторый код из первого столбца во второй.
Мартин Эндер

1

Python 2, 91 75 69 байт

s='#%r;print"s#\\n="+"\\n".join(s%%s)';print"s#\n="+"\n".join(s%s)
##

Попробуйте онлайн

Объяснение:

Это использует модификацию стандартного quine:

s='s=%r;print s%%s';print s%s

После модификации:

s='s=%r;print"\\n".join(s%%s)';print"\n".join(s%s)

Этого было бы достаточно, если бы была разрешена одна строка. Затем я добавил два символа во 2-ю строку, чтобы выполнить это требование. В #символы на второй линии могут быть заменены на что - либо, так долго , как вы измените их в первой строке, тоже, и это делает программа синтаксически правильным.

Чтобы напечатать это правильно сейчас, я должен напечатать #в конце первых двух строк. Поэтому я удаляю первые два символа из строки sи печатаю их #перед печатью s%s. Я поместил один из #первых в начало, sчтобы сохранить несколько байтов, удаляя символ новой строки.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.