Случай переверните вашу лозу

Aug 19 2020

Напишите quine, который пытается инвертировать регистр как можно большего количества символов ascii в исходном коде. Например, в javascript:

(x=function(y){return ('(x='+y+')(x)').toUpperCase();})(x)
  • Применяются стандартные правила quine.

  • Оценка дается по количеству байтов в исходном коде - количеству инверсий регистра . Например, у приведенного выше quine есть оценка 29.

  • Побеждает программа с наименьшим количеством баллов. Если две программы имеют одинаковый балл, то выигрывает более короткая.

Ответы

26 SE-stopfiringthegoodguys Aug 19 2020 at 17:51

> <> , оценка 479 - 479 = 0

lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllbfppllfepeeppppgglcepppbeppppppppppplfdppedpddpgglcdppbdpfcpecpggldcppllccpbcpplfbpebppldbppcbpggcbglefgpgbeglefgpgcbglefgpgggggedglefgpgccglefgpgfdglefgpgebglefgpgecglefgpggdcglefgpgceglefgpgeeglefgpgbcglefgpgfbglefgpgcdgfefgpbdgeefgpfegdefgpccgcefgpfdgbefgpdbgaefgpppddglefgpgbcglefgpgfcglefgpgdbglefgpgdcglefgpgecglefgpgddglefgpgdbglefgplffpbfgffgefgpcbgefgefgp

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

Как это устроено

Очень мало полезных инструкций в> <> - это буквы. Однако у нас все еще есть l, помещая длину стека в стек. Таким образом, можно (очень подробно) помещать произвольные значения в стек. Таким образом, строки могут быть закодированы аналогично тому, как это делается в brainfuck, с использованием aдля увеличения длины стека gили pдля его уменьшения.

В соответствии с обычными правилами Куайна, gне используются для чтения самого исходного кода, вместо сохранения регистров в таких местах, как bbи bcи так далее.

Закодированная строка - это префикс:

"r&:20&3-:&?.p48*-od0l2)?.;lllll"]"

Что после более чем 7000 инструкций выводит исходную строку в верхнем регистре.

10 JoKing Aug 19 2020 at 20:14

Гол> <> , 77 75 - 75 = 0

urassssissezplzelssmzmzpssazmkqjmkrmbrrrrrtsuotlballsssssassmzpsssssbssmzpu

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

Основываясь на ответе Бабблера , это идет еще дальше: "в начале кода также ставится знак, чтобы получить оценку 0!

Объяснение

ur       Move over one on the stack tape and reverse the stack
  assssissez      Push 10+16*4=74,-1+16*2=31,!(15)=0
            p     And put the 74 (J) at position 0,31

lz            Push 0 if there is anything on the stack
  e           Push 14 for later
   lssmzmz    Push 2+16*2=34, !(-1)=0, !(-1)=0
          p   Put the 34 (") at position 0,0

sss           Add 3*16 to the -1 from earlier
   az         Push !(10)=0
     mkq      Some no-ops
        J     And jump to 0,47 if the stack was initially empty

lballsssssassmzp  Put T at position 0,43
sssssbssmzpu      Put S at position 0,44
u                 Move one over on the stack again (effectively resetting the stack)

"                 Wrap, pushing everything to the stack
 r                Reverse
  .........       Put everything again
           J      But this time don't jump, since the stack is not empty

mk           Copy the bottom of the stack (u)
  rm         Push a -1 to the bottom of the stack
    brrrrr   No-ops

T   t      Finally, loop over the stack, 
 Suo       Capitalising then outputting everything until we get to the -1
8 Bubbler Aug 19 2020 at 11:28

Гол> <> , оценка 34 - 33 = 1

"mrllssslssscsmzpdsmzprrrrrrtsuota

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

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

"MRLLSSSLSSSCSMZPDSMZPRRRRRRTSUOTA

Как это устроено

Строки, отмеченные значком, *являются отличиями от предыдущей версии.

"..."    Push every char except `"`
mrl      Push -1, reverse stack, push stack length (34 = `"`)
* lsss   Push stack length (35) and add 16 three times (83 = S)
* lsss   Push stack length (36) and add 16 three times (84 = T)
* csmzp  Push 13, add 16 (29), push -1, boolean negate (0), and
         replace the command at (29,0) by T
* dsmzp  Push 14, add 16 (30), push -1, boolean negate (0), and
         replace the command at (30,0) by S
* rrrrrr  Reverse the stack 6 times;
          no-op to move the positions to overwrite
TSuot    Infinite uppercase-print loop; halt by error at -1
a        Not executed

Гол> <> , оценка 34 - 31 = 3

"mrlTSuotaaaaaaaaaaaaaaaaaaaaaaaaa

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

Выводит следующее и завершает работу по ошибке.

"MRLTSUOTAAAAAAAAAAAAAAAAAAAAAAAAA

Все строчные буквы в верхнем регистре, поэтому не изменяются только символы "TS.

Как это устроено

"..."  Start string literal, push every char in the source code (except `"`),
       wrap around and end string literal
mr     Push -1 and reverse the stack
       (setup the chars for printing from top, and bury the trap at the bottom)
l      Push length of stack, which gives 34 == `"`
T...t  Infinite loop until it errors in the middle:
 Su     Uppercase the char at the top (errors when trying to uppercase -1)
 o      Pop and print as char
a...   Not reached

Я подозреваю, что возможно 2 или меньше.

6 Dingus Aug 19 2020 at 11:25

V (vim) , оценка 3

2i2I

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

4 байта с 1 инверсией регистра. Дважды вставляет ( 2i) строку 2I.

6 ErikF Aug 21 2020 at 04:58

80186+ машинный код (формат MS-DOS .COM), 115-115 = 0

Это было немного сложно сделать это, так как у меня был доступ к только INC, DEC, PUSH, некоторые POPварианты, POPA, IMULи некоторые условные переходы. К счастью, IMULсмог справиться с этой задачей!

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

Машинный код:

hrXhCNhGUhnPhPwhYkhvLhKwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPQRjZTUVjfaiQVGARiQSCARiQPQARiQMJARiQJZARiQGuARiQDkARiQAWARpI

Исходный код ассемблера:

IDEAL
P186

MODEL   TINY
CODESEG
ORG 100H

MAIN:
        ; Encoded code:
        ;   MOV SI,100H
        ;   MOV CX,73H
        ; PRINT:
        ;   LODSB
        ;   XOR AL,20H
        ;   INT 29H
        ;   NOP
        ;   LOOP PRINT
        ;   INT 20H
               ; Offset Bytes Multiplier
    PUSH 5872H ; +41    BE 00 4157H
    PUSH 4E43H ; +44    01 B9 416BH
    PUSH 5547H ; +47    73 00 4175H
    PUSH 506EH ; +4A    AC 34 415AH
    PUSH 7750H ; +4D    20 CD 414AH
    PUSH 6B59H ; +50    29 90 4151H
    PUSH 4C76H ; +53    E2 F8 4143H
    PUSH 774BH ; +56    CD 20 4147H

REPT 30
    POPA ; Adjust stack to point to end of generated code
ENDM

    PUSH AX
    PUSH CX
    PUSH DX
    PUSH 5AH
    PUSH SP
    PUSH BP
    PUSH SI
    PUSH 66H
    POPA ; Use POPA as POP DX and POP DI are not in [A-Za-z]
    IMUL DX,[BX+DI+56H],4147H
    PUSH DX
    IMUL DX,[BX+DI+53H],4143H
    PUSH DX
    IMUL DX,[BX+DI+50H],4151H
    PUSH DX
    IMUL DX,[BX+DI+4DH],414AH
    PUSH DX
    IMUL DX,[BX+DI+4AH],415AH
    PUSH DX
    IMUL DX,[BX+DI+47H],4175H
    PUSH DX
    IMUL DX,[BX+DI+44H],416BH
    PUSH DX
    IMUL DX,[BX+DI+41H],4157H
    PUSH DX
    JO $+4BH ; Jump to start of generated code

END MAIN
ENDS
5 the-cobalt Aug 20 2020 at 06:58

05AB1E, 16 - 6 = 10

0"D34çýu"D34çýu

(завершающий символ новой строки)

Объяснение

0"D34çýu"D34çýu # full code
0"D34çý "D34çý  # standard 05AB1E quine
       u      u # uppercase string in stack
                # implicit print

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

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


05AB1E (устаревшая версия), 16-8 = 8

0"D34çýš"D34çýš

(завершающий символ новой строки)

Объяснение

0"D34çýu"D34çýu # full code
0"D34çý "D34çý  # standard 05AB1E quine
       š      š # switch case builtin
                # implicit print

Спасибо Кевину Кройссену за -2 балла. Не работает с текущим 05AB1E, потому что функция корпуса переключателя увеличивает количество байтов

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

5 Dingus Aug 19 2020 at 10:08

Рубин , счет 24 20 16 12

eval S="print'EVAL s=';p S.swapcase"

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

37 байт с 25 инверсиями регистра. В выводе изменяется регистр каждой буквы.

3 DomHastings Aug 19 2020 at 13:51

Perl 5 , 37 байт, 20 замененных регистров, оценка 17

Спасибо @Dominic van Essen за -1!

eval($a=q{print uc"eval(\$a=q{$a})"})

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

3 SeanSchricker Aug 22 2020 at 06:45

JavaScript (Node.js) , 70 - 38 = 32

f=x=>`f=${f}`.replace(/(.)/g,y=>y<'`'?y.toLowerCase():y.toUpperCase())

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

Кстати: это мой первый вклад, и я немного смущен. Я поменял местами все возможные персонажи. В примере только заглавные буквы. Если вам не нужно менять кейсы, то можно получить 11-0 = 11 с упрощенным вариантом ответа, приведенного выше:

f=x=>"f="+f
2 Lyxal Aug 19 2020 at 11:33

Бочонок , оценка 4

`④`④

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

4 байта с 0 преобразованием регистра.

Стандартный quine без преобразования регистров легко превосходит любые подходы Keg, которые будут иметь преобразование регистра: к тому времени, когда вы добавите методы преобразования case в микс, вы могли бы просто написать стандартный quine без каких-либо необычных деталей.

2 Shaggy Aug 20 2020 at 00:22

Javascript, 27 - 13 = 14

f=x=>`f=${f}`.toUpperCase()

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

1 ovs Aug 19 2020 at 13:23

Python 2 , оценка 52-33 = 19

s='S=%r;PRINT S%%S.SWAPCASE()';print s%s.swapcase()

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

Регистр переворачивает каждую букву в quine.

1 DominicvanEssen Aug 19 2020 at 17:17

R , балл = 78 - 53 = 25

a="a=%s;cat(toupper(sprintf(a,squote(a))))";cat(toupper(sprintf(a,sQuote(a))))

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