ケースはあなたのクワインを反転させます

Aug 19 2020

ソースコード内のできるだけ多くのASCII文字の大文字と小文字を反転させようとするクインを記述します。たとえば、javascriptの場合:

(x=function(y){return ('(x='+y+')(x)').toUpperCase();})(x)
  • 標準のクワインルールが適用されます。

  • スコアは次式で与えられ、ソースコードのバイト数-ケース反転数。たとえば、上記のクワインのスコアは29です。

  • スコアが最も低いプログラムが勝ちます。2つのプログラムのスコアが同じである場合、短い方が勝ちます。

回答

26 SE-stopfiringthegoodguys Aug 19 2020 at 17:51

> <>、スコア479-479 = 0

lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllbfppllfepeeppppgglcepppbeppppppppppplfdppedpddpgglcdppbdpfcpecpggldcppllccpbcpplfbpebppldbppcbpggcbglefgpgbeglefgpgcbglefgpgggggedglefgpgccglefgpgfdglefgpgebglefgpgecglefgpggdcglefgpgceglefgpgeeglefgpgbcglefgpgfbglefgpgcdgfefgpbdgeefgpfegdefgpccgcefgpfdgbefgpdbgaefgpppddglefgpgbcglefgpgfcglefgpgdbglefgpgdcglefgpgecglefgpgddglefgpgdbglefgplffpbfgffgefgpcbgefgefgp

オンラインでお試しください!

使い方

> <>の有用な指示は文字です。ただし、lスタックの長さをスタックにプッシュする、がまだあります。そのため、(非常に詳細に)任意の値をスタックにプッシュすることができます。したがって、文字列aは、スタックの長さを増やしgたりp減らしたりするために使用して、brainfuckと同様の方法でエンコードできます。

通常QUINEルールに従って、g代わりのような場所でのレジスタを維持する、ソースコード自体を読み取るために使用されていないbbbc等。

エンコードされた文字列はプレフィックスです:

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

7,000を超える命令の後、元の文字列を大文字で出力します。

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

Gol> <>、スコア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

Gol> <>、スコア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

オンラインでお試しください!

1ケース反転で4バイト。2i文字列を2回挿入()します2I

6 ErikF Aug 21 2020 at 04:58

80186+マシンコード(MS-DOS .COM形式)、115-115 = 0

私はへのアクセス持っていたように、これを行うには少しトリッキーだったINCDECPUSH、特定のPOPバリエーション、POPAIMUL、および特定の条件ジャンプを。幸いなことに、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スコアを提供してくれたKevinCruijssenに感謝します。現在の05AB1Eでは機能しません。これは、switchcase関数がバイトカウントを大きくするためです。

オンラインでお試しください!

5 Dingus Aug 19 2020 at 10:08

ルビー、スコア24 20 16 12

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

オンラインでお試しください!

25ケース反転で37バイト。すべての文字の大文字と小文字が出力で変更されます。

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バイト。

ケース変換のない標準のクインは、ケース変換のあるKegのアプローチを簡単に打ち負かします。ケース変換の手法をミックスに投入するまでに、凝った詳細のない標準のクインを作成したほうがよいでしょう。

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()

オンラインでお試しください!

ケースは、クワインのすべての文字を反転します。

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))))

オンラインでお試しください!