Выступи против длинных линий


28

или: построить вертикальную квинну

Вдохновленный Отступите против длинных очередей .

Ваша задача - построить вертикальную линию с максимально короткой длиной линии.

счет

Побеждает самая короткая длина линии (исключая переводы новой строки) с критериями в качестве тай-брейка.

Длина строки определяется как самая длинная строка в вашей программе, исключая символ перевода строки.

Например:

$_=
Q.
P

имеет длину строки 3 и число байтов 8, в то время как:

Q
$
_
P

Имеет длину строки 1 и количество байтов 7 (при условии отсутствия завершающей новой строки).

правила

Квины должны соответствовать определению сообщества кваи .

Стандартные лазейки запрещены.


Применяется ли здесь и здесь правило вызова, которое вдохновлено? (« Все разрывы строк должны быть осмысленными. Разрывы строк, которые могут быть удалены, и смежные строки, непосредственно объединенные без влияния на вывод, должны быть удалены». )
Кевин Круйссен

6
@KevinCruijssen Нет, я хотел, чтобы у этой задачи было немного больше свободы, чтобы поощрить более короткие отрезки! Это было единственное, что я хотел изменить в другом испытании!
Дом Гастингс

Ответы:


31

Lenguage , длина строки 0, ≈ 1.01 × 10 805 байт

Исходный код состоит из

10124204951141713202533972929121310016060433092338061822344361345785088607872212687519180665846846689047959498775873817205954910072327976407177053174071436371843670134990737172675632938993247496933911137703773908536875512359091727633452506044935740750830240213878294804481182083555147915724921824921475110508228264569693355158523956426011218344830576542194309867719995259333487662608933990607888012376767799159279952780093033761421596267435996052643805835600325453580090964941176722519904997142820547696122795384058768166716813179490118821654787005844786013890425692181280317909786461426684986082270532414940905922244777135016193088362341771414388821075092853157152933099269703875111747946164773211049512395358715902962437487134522781505709420586981997748912591875626029183292826655753251235587052422561943

linefeeds, которая кодирует следующую программу.

>>++++++++>+++>+++>+>+>+>+>+>+>+>+++>+>+>+>+>+>+>+>+>+++>+>+>+>+>+>+>+>+>++++++++>++++>++++++++>++++>+++++++>++>+++>+>+++>++>+++>+++>+>+>+>+>+>+>+>+>++++>++++>+++++++>+>++++>++++++++>++>+++++++>+++>++++++++>++>+++++++>+++>++++++++>++>+++++++>+++>++++++++>++>+++++++>+++>++++++++>++>+++++++>+++++>+>+>+>+>+>+>+>+>+>+>++++++++>++++>+++++++>+++++++>+>+>+++>+>+>+>++++++++>+++>+++++++>+>+++>+>+++>+>+++>+>++++++++>++++>++++++++>++++>++++++++>++++>++++>+>+++>+++>++>+++++++>+++++++>+>+>+>++++++++>+++>+>++++++++>++++>+>+++>++>+++++++>++>+++++++>++++>++++>++++++++>+++>++++++++>+++>+++>+>++++>++++>++>+++++++>+++>+++>++++++++>++++>+>+++>++>+++++++>++++>++++>+++++++>+++>+++>+++>+++>++++++++>++++>++++>+>+++>+>+++>++>+++++++>+++++++
[
    [->+>+<<]
    >>>>[<<[->+<]>>[-<<+>>]>]
    <<[-[->+<]+>]+++
    [[->>+<<]<]<
]
+>+>+>+
[>]+++>++
[
    [<]++++++++++.[-]
    >[-]>[-]>[-]>[-]
    <+[<<++++++++>>->+>-[<]<]
    ++++++++>++++++++>+++++++>>
]

Исходный код в основном идентичен смягченному излучением квинтуру Lenguage @ jimmy23013 , за вычетом .в конце, с ++++++++++.[-]заменой .на печать перевода строки вместо нулевых байтов и соответствующими изменениями в разделе данных в строке 1.


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

Господи, этот язык - определение того, почему кодовый боулинг не был принят хорошо, это круто наверняка ... Не могу поверить, что для «Hello World» потребуется"about 1.75*10**76 yottabytes in ASCII"
Волшебная Осьминога Урна


Вы можете ]++++++++ ++.-->
сыграть в

28

JavaScript, длина строки 1, 960 956 928 байт


[
t
,
r
,
u
,
e
,
f
,
a
,
l
,
s
]
=
!
0
+
[
!
1
]
;
[
,
n
,
d
,
,
q
,
i
]
=
t
.
a
+
t
V
=
[
]
[
f
+
i
+
n
+
d
]
;
[
,
,
,
c
,
,
,
o
,
,
_
,
,
,
,
,
y
,
z
]
=
V
+
0
F
=
V
[
E
=
c
+
o
+
n
+
s
+
t
+
r
+
u
+
c
+
t
+
o
+
r
]
P
=
(
1
+
e
+
2
+
3
-
4
+
t
)
[
2
]
f
=
F
(
r
+
e
+
t
+
u
+
r
+
n
+
_
+
a
+
t
+
o
+
(
0
+
{
}
)
[
3
]
)
(
)
(
3
*
4
+
[
]
[
E
]
[
n
+
a
+
(
0
[
E
]
+
0
)
[
9
+
2
]
+
e
]
)
[
1
]
F
(
a
,
a
+
l
+
e
+
r
+
t
+
y
+
a
+
P
+
q
+
P
+
a
+
P
+
q
+
z
)
`
[
t
,
r
,
u
,
e
,
f
,
a
,
l
,
s
]
=
!
0
+
[
!
1
]
;
[
,
n
,
d
,
,
q
,
i
]
=
t
.
a
+
t
V
=
[
]
[
f
+
i
+
n
+
d
]
;
[
,
,
,
c
,
,
,
o
,
,
_
,
,
,
,
,
y
,
z
]
=
V
+
0
F
=
V
[
E
=
c
+
o
+
n
+
s
+
t
+
r
+
u
+
c
+
t
+
o
+
r
]
P
=
(
1
+
e
+
2
+
3
-
4
+
t
)
[
2
]
f
=
F
(
r
+
e
+
t
+
u
+
r
+
n
+
_
+
a
+
t
+
o
+
(
0
+
{
}
)
[
3
]
)
(
)
(
3
*
4
+
[
]
[
E
]
[
n
+
a
+
(
0
[
E
]
+
0
)
[
9
+
2
]
+
e
]
)
[
1
]
F
(
a
,
a
+
l
+
e
+
r
+
t
+
y
+
a
+
P
+
q
+
P
+
a
+
P
+
q
+
z
)
`

Более удобочитаемая версия, которая также называется quine (посторонние переводы строки удалены):


[t,r,u,e,f,a,l,s]=!0+[!1];[,n,d,,q,i]=t.a+t
V=[][f+i+n+d];[,,,c,,,o,,_,,,,,y,z]=V+0
F=V[E=c+o+n+s+t+r+u+c+t+o+r]
P=(1+e+2+3-4+t)[2]
f=F(r+e+t+u+r+n+_+a+t+o+(0+{})[3])()(3*4+[][E][n+a+(0[E]+0)[9+2]+e])[1]
F(a,a+l+e+r+t+y+a+P+q+P+a+P+q+z)`
[t,r,u,e,f,a,l,s]=!0+[!1];[,n,d,,q,i]=t.a+t
V=[][f+i+n+d];[,,,c,,,o,,_,,,,,y,z]=V+0
F=V[E=c+o+n+s+t+r+u+c+t+o+r]
P=(1+e+2+3-4+t)[2]
f=F(r+e+t+u+r+n+_+a+t+o+(0+{})[3])()(3*4+[][E][n+a+(0[E]+0)[9+2]+e])[1]
F(a,a+l+e+r+t+y+a+P+q+P+a+P+q+z)`

объяснение

Уф. Приезжайте сюда, потому что это будет коварное путешествие ...

Я потратил много времени, пытаясь понять, как решить эту проблему с длиной 1 - без встроенных (напрямую, во всяком случае), ключевых слов или даже функций стрелок - прежде чем понять, что это легко возможно с помощью JSF *** , который может оценивать любой код JavaScript, избегая при этом многобайтовых токенов. Но решение JSF легко может быть длиной в тысячи байтов, если не десятками или сотнями тысяч. К счастью, мы не ограничены только - у ()[]+!нас есть все ASCII в нашем распоряжении!

Я решил начать с игры в гольф с основных строительных блоков JSF - персонажей, которые можно объединить в строки, чтобы, так сказать, «открыть больше функций». Мы не можем напрямую использовать строки для получения символов, так как для этого потребуются строки длиной 3. Поэтому вместо этого мы крадем уловку из JSF, получая несколько символов из литералов, которые могут быть созданы с помощью однобайтовых токенов:

JSF***   Used here   Value        Chars unlocked
!![]     !0          true         true
![]      !1          false        fals
[][[]]   t.a         undefined    ndi

Из них мы можем расширяться наружу, начиная с того [].find, что является объектом Function. Преобразование этого в строку function find() { ...дает нам доступ к c, oпространство ( _), а также круглые скобки ( yи z). Возможно , что еще более важно, мы теперь имеем доступ к его constructor, в Functionфункции-которой, inceptional , как это может показаться, дает нам возможность выполнения кода путем создания строки, передавая ее Function(), а затем вызвать функцию генерируемый.

Вероятно, я должен упомянуть общий метод, используемый самой программой. Начиная с 2015 года, в JavaScript появилась эта действительно классная функция, называемая « теговыми шаблонами », которая не только позволяет неэкранированные символы новой строки в строках, но и позволяет напрямую вызывать функцию со строковым литералом (в некотором смысле; myFunc`abc`;примерно эквивалентно myFunc(["abc"])). Если мы поместим вызов функции как последнюю вещь в программе, общая структура будет выглядеть так:

code;func`code;func`

Все, funcчто нужно сделать, - это вывести свой аргумент, после которого следует символ обратной черты, затем снова его аргумент и второй знак обратной черты. Предполагая, что у нас есть аргумент aи обратный трюк f, мы можем сделать это с помощью кода alert(a+f+a+f). Однако на данный момент нам не хватает +и самого обратного удара. +(хранится в P) не сложно; мы украли еще один трюк у JSF, построив строку 1e23, преобразовав ее в число, а затем вернув обратно в строку, и дали "1e+23".

Получение обратного удара немного сложнее. Сначала я попытался получить String.fromCharCode, но найти Cоказалось почти так же сложно. К счастью, atobего достаточно просто получить ( Function("return atob")(); bгенерируется из 0+{}, который дает [object Object]) и может дать любой символ ASCII, если найдена правильная магическая строка. Короткий скрипт дал мне 12Aодин из вариантов, который удобно найти в 12Array(немного короче, благодаря [].constructor[n+a+m+e]; mнаходится в 0 .constructor+0:) "function Number() { ...".

Наконец, мы склеиваем все вместе. Мы назначаем обратную переменную переменной f, но поскольку мы не можем использовать ее непосредственно в строке функции, мы вместо этого устанавливаем переменную qна букву fи используем ее вместо этого. Это делает нашу последнюю строку a+l+e+r+t+y+a+P+q+P+a+P+q+zили "alert(a+f+a+f)". Затем Function()мы передаем это, передаем наш готовый код в результат, и вуаля, у нас есть JavaScript-квин с не более чем одним символом на строку!


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


Ницца! Хотя на самом деле я не программист на JS, я могу догадаться о сути этого из того, что я читал о JSFuck, но мне бы хотелось получить объяснение, особенно этой f=строки.
Эрджан Йохансен

1
@ ØrjanJohansen Извините, я пытался написать объяснение всего этого, но все идет не очень хорошо, поэтому я просто быстро отвечу на ваш вопрос: это запутанный способ задать fодин обратный удар. Сама строка эквивалентна f=atob("12Array")[1]. Другой трюк заключается в том, что qна самом деле устанавливается буква fв первой строке, так что в F(...)строке я могу использовать ее, чтобы поместить букву fв вычисляемую строку, поскольку переменная fбольше не устанавливается на эту букву. Это a+l+e+r+t+y+a+P+q+P+a+P+q+zэквивалентно "alert(a+f+a+f)".
ETHproductions

Отлично, теперь я это понимаю! Вы могли бы упомянуть, что 0+{}и привести 0[E]в порядок, чтобы получить bи m.
Эрджан Йохансен

Действительно хорошо! Гораздо меньше, чем моя попытка , хотя мы использовали симарский подход!
Дом Гастингс

@DomHastings Так долго ссылка даже не работает ;-)
ETHproductions

15

Haskell , длина строки 6, 400 343 336 байтов

{main=
putStr
$s++(s
>>=(++
":\n")
.show)
++
"[]}";
s='{':
'm':
'a':
'i':
'n':
'=':
'\n':
'p':
'u':
't':
'S':
't':
'r':
'\n':
'$':
's':
'+':
'+':
'(':
's':
'\n':
'>':
'>':
'=':
'(':
'+':
'+':
'\n':
'"':
':':
'\\':
'n':
'"':
')':
'\n':
'.':
's':
'h':
'o':
'w':
')':
'\n':
'+':
'+':
'\n':
'"':
'[':
']':
'}':
'"':
';':
'\n':
's':
'=':
[]}

Попробуйте онлайн! Я не знаю обойти putStr, таким образом, длина строки равна 6. Внешние фигурные скобки позволяют избавиться от иного требуемого отступа после новой строки в пределах одной декларации.



12

CJam , длина строки 1, 16 13 байт

"
_
p
"

_
p

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

Это маленькое чудо, что вставка новых строк в стандартный Quine,{"_~"}_~ даже более короткий стандартный Quine, "_p"␊_pделает правильную вещь. (Спасибо, Мартин!) Трейлинг-перевод строки необходим.

Пояснение (с • новой строкой)

"•_•p•"        Push that string.
       ••      Do nothing.
         _     Duplicate the string.
          •    Do nothing.
           p   Pop it and print it with quotes and a newline: "•_•p•"•
            •  Do nothing.

По окончании •_•p•выводится то, что осталось в стеке ( ), что дает общий результат "•_•p•"••_•p•.


2
Все, что я должен сказать, это ... • _ •
corsiKa

6

Haskell + CPP, длина строки 2, 705 237 байт

m\
a\
i\
n\
=\
p\
u\
t\
S\
t\
r\
$\
(\
:\
"\
\\
\\
\\
n\
"\
)\
=\
<\
<\
s\
+\
+\
s\
h\
o\
w\
 \
s\
;\
s\
=\
"\
m\
a\
i\
n\
=\
p\
u\
t\
S\
t\
r\
$\
(\
:\
\\
"\
\\
\\
\\
\\
\\
\\
n\
\\
"\
)\
=\
<\
<\
s\
+\
+\
s\
h\
o\
w\
 \
s\
;\
s\
=\
"\

Попробуйте онлайн! Использование флага, -CPPкоторый включает препроцессор C, позволяет нам использовать обратную косую черту в конце строки, чтобы продолжить ее на следующей строке.

Фактический код main=putStr$(:"\\\n")=<<s++show s;s="<data>".

Редактировать: случайные -468 байт благодаря Орджану Йохансену !


1
Это экономит много времени, чтобы изменить это на main=putStr$(:"\\\n")=<<s++show s;s="<data>". Попробуйте онлайн!
Эрджан Йохансен

5

Rust, длина строки: 5, байты: 301 299

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

Несмотря на то, как это выглядит, это не эзотерический язык программирования, просто много шума форматной строки.

Вертикальная длина 5 была выбрана для возможности использования print. Я не думаю, что есть способ печати, который бы имел более короткую вертикальную длину, объявляя функции C, использующие externключевое слово, stdoutдлиной 6 байтов, длиной write5 байтов, длиной no_main7 байтов (main обычно является функцией;)).

fn
main
(){
let
t=(
r#"fn
main
(){
let
t=("#
,r#")
;
print
!(
r#"{}
r#"{
}"{}
,r#"{
}"{},
r#"{
}"{}
{}{}{
}{
}""#,
r#"
,t.0,
t.0,
'#',
t.1,
'#',
t.2,
'#',
t.1,
'#',
t.2,
'}'
)"#
)
;
print
!(
r#"{}
r#"{
}"{}
,r#"{
}"{},
r#"{
}"{}
{}{}{
}{
}"#
,t.0,
t.0,
'#',
t.1,
'#',
t.2,
'#',
t.1,
'#',
t.2,
'}'
)}

Разве это не горизонтальная длина?
Анатолий

@anatolyg исправлено
Конрад Боровски

Вложенность необработанных строк без выделения синтаксиса делает невозможным их интерпретацию. Я не думаю, что cargo fmtэто даже помогло бы здесь ...
CAD97

@ CAD97 Если вам нужна подсветка синтаксиса, play.rust-lang.org выделит это правильно, поэтому я использовал его вместо TIO для ссылки «Попробуйте онлайн».
Конрад Боровски,




2

Красный , длина строки: 10, 49 байтов

s: [prin [
    "s:"
    mold s
    "do s"
]] do s

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

Это на самом деле Rebol Quine

Объяснение: Red / Rebol's moldследует стилю кодирования, смещая 4 пробела.

s: [prin [     ; s is a block; print the following: 
    "s:"       ; literal "s:"
    mold s     ; the representation of the block itself - all between []
    "do s"     ; literal "do s"
]] do s        ; evaluate the block

2

RProgN , 3 байта, длина строки 1

0
0

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

Копия ответа Дениса здесь (иди и проголосуй за него тоже)

Это соответствует нашему текущему определению правильной квинны, поскольку первый 0 кодирует второй 0 и наоборот.


3
Очень жаль, что мы не пришли к единому мнению относительно лучшего определения: - /
ETHproductions

@ETHproductions Ну, есть некоторая поддержка для этого определения .
Мартин Эндер

2

RProgN 2 , L = 1, B = 15 байтов

«
Ø
.
`
-
S
`
.

Это эквивалентно программе:

«Ø.`
-S`
.

Сломать

«сначала помещает функцию, неявно представляющую остальную часть программы, в стек, а затем продолжает выполнение. Ø.добавляет пустую строку к функции, которая ее преобразует в строку. Это всегда будет приводить к строковому форматированию, как эквивалентная программа, потому что переводы строк являются no-ops. `\n-Удаляет все новые строки из строки, теперь выглядит как «Ø.`=S`.. Sзатем преобразует его в стек из отдельных символов и `\n.присоединяет к нему новые строки, возвращая ожидаемую программу.

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


2

Недогрузка , длина строки 1, 20 байтов

(
:
a
S
S
)
:
a
S
S

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

Это просто стандартная квота Underload с добавленными символами новой строки. Требуется реализация, подобная TIO, которая игнорирует неизвестные символы команды.

Часть in ()представляет собой строковый литерал, помещенный в стек, :дублирующий его, aзаключающий верхнюю запись в стеке в круглые скобки и Sпечатающий.



1

Javascript (ES6 REPL), полная программа, длина строки: 3, количество байт: 31

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

Это порт ответа @ kamoroso94 на отдельную полную программу.

Если кто-нибудь найдет способ удалить несколько байтов, не добавляя больше к длине строки, не стесняйтесь комментировать :)


Обратите внимание, что это на самом деле ничего не выводит, если вы не запустите его в REPL. Я бы назвал это JavaScript (ES6 REPL)
ETHproductions

О, блин, кстати, привыкли к хромированной консоли ...
Брайан Х.

1

Пип , длина строки 1, 35 байт


V
Y
"
[
`
V
Y
`
y
]
.
C
:
3
.
4
"

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

На основе известного кратчайшего Pip Куайного, V Y"`V Y`.RPy". Основная сложность в том, чтобы сжать его до длины строки 1 RP, которая не может быть разбита на две строки. Но в этом случае всеRP (repr) заключает строку в двойные кавычки, что мы можем сделать напрямую.

Вот объяснение, основанное на горизонтальной версии:

V Y"[`V Y`y].C:3. 4"
  Y"               "  Yank this string into the variable y
V                     and eval it
                      The code that is eval'd:
    [      ]           Build a list containing:
     `V Y`              this Pattern object (used for regex, but here useful as a
                          string-like object that doesn't need double quotes)
          y             y, the whole string
               3. 4    Concatenate 3 and 4 to make 34 (since the 2-digit number won't work
                         in the vertical version)
             C:        Convert to ASCII character (: forces the precedence lower than .)
            .          Concatenate the " to the end of each list element
                      The resulting list is printed, concatenated together, with a
                        trailing newline

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