Kasus membalikkan quine Anda

Aug 19 2020

Tulis quine yang mencoba membalikkan kasus sebanyak mungkin karakter ascii dalam kode sumber. Misalnya di javascript:

(x=function(y){return ('(x='+y+')(x)').toUpperCase();})(x)
  • Aturan quine standar berlaku.

  • Skor diberikan oleh jumlah byte dalam kode sumber - jumlah kasus inversi . Misalnya quine di atas memiliki skor 29.

  • Program dengan skor terendah menang. Jika dua program memiliki skor yang sama, maka program yang lebih pendek menang.

Jawaban

26 SE-stopfiringthegoodguys Aug 19 2020 at 17:51

> <> , skor 479 - 479 = 0

lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllbfppllfepeeppppgglcepppbeppppppppppplfdppedpddpgglcdppbdpfcpecpggldcppllccpbcpplfbpebppldbppcbpggcbglefgpgbeglefgpgcbglefgpgggggedglefgpgccglefgpgfdglefgpgebglefgpgecglefgpggdcglefgpgceglefgpgeeglefgpgbcglefgpgfbglefgpgcdgfefgpbdgeefgpfegdefgpccgcefgpfdgbefgpdbgaefgpppddglefgpgbcglefgpgfcglefgpgdbglefgpgdcglefgpgecglefgpgddglefgpgdbglefgplffpbfgffgefgpcbgefgefgp

Cobalah secara online!

Bagaimana itu bekerja

Sangat sedikit instruksi yang berguna di> <> adalah huruf. Namun, kami masih memiliki l, mendorong panjang tumpukan ke tumpukan. Dengan demikian, dimungkinkan untuk (dengan sangat verbal) mendorong nilai arbitrer ke tumpukan. Dengan demikian, string dapat dikodekan dengan cara yang mirip dengan brainfuck, menggunakan auntuk menambah panjang tumpukan, dan gatau puntuk menguranginya.

Sesuai aturan Quine biasa, gtidak digunakan untuk membaca kode sumber itu sendiri, bukan mempertahankan register di lokasi seperti bbdan bcdan sebagainya.

String yang dikodekan adalah awalan:

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

Yang setelah lebih dari 7.000 instruksi menghasilkan string asli dalam huruf besar.

10 JoKing Aug 19 2020 at 20:14

Gol> <> , 77 75 - 75 = 0

urassssissezplzelssmzmzpssazmkqjmkrmbrrrrrtsuotlballsssssassmzpsssssbssmzpu

Cobalah secara online!

Berdasarkan jawaban Bubbler , ini bahkan lebih jauh lagi dengan meletakkan "di awal kode untuk mendapatkan skor 0!

Penjelasan

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> <> , skor 34 - 33 = 1

"mrllssslssscsmzpdsmzprrrrrrtsuota

Cobalah secara online!

Mengeluarkan perintah berikut dan keluar dengan kesalahan, yang setiap karakter diberi huruf besar kecuali di depan ".

"MRLLSSSLSSSCSMZPDSMZPRRRRRRTSUOTA

Bagaimana itu bekerja

Garis yang ditandai dengan *merupakan perbedaan dari versi sebelumnya.

"..."    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> <> , skor 34 - 31 = 3

"mrlTSuotaaaaaaaaaaaaaaaaaaaaaaaaa

Cobalah secara online!

Mengeluarkan yang berikut ini dan keluar karena kesalahan.

"MRLTSUOTAAAAAAAAAAAAAAAAAAAAAAAAA

Setiap huruf kecil menggunakan huruf besar, jadi karakter yang tidak dimodifikasi adalah "TS.

Bagaimana itu bekerja

"..."  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

Saya menduga 2 atau lebih rendah mungkin.

6 Dingus Aug 19 2020 at 11:25

V (vim) , skor 3

2i2I

Cobalah secara online!

4 byte dengan 1 inversi kasus. Dua kali menyisipkan ( 2i) string 2I.

6 ErikF Aug 21 2020 at 04:58

Kode mesin 80186+ (format MS-DOS .COM), 115-115 = 0

Itu agak sulit untuk melakukan hal ini, karena saya hanya memiliki akses ke INC, DEC, PUSH, tertentu POPvariasi, POPA, IMUL, dan melompat bersyarat tertentu. Untungnya, IMULbisa melakukan pekerjaan berat untuk tantangan ini!

Saya menyandikan kode sebenarnya yang melakukan pencetakan dalam serangkaian nilai yang dikalikan bersama. Saya menghitung nilai-nilai itu (yang terpotong menjadi nilai 16-bit), menyimpannya di tumpukan yang saya pindahkan tepat di atas kode, dan kemudian melompat ke kode yang dihasilkan untuk mencetak kode program dalam kasus yang berlawanan.

Kode mesin:

hrXhCNhGUhnPhPwhYkhvLhKwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPQRjZTUVjfaiQVGARiQSCARiQPQARiQMJARiQJZARiQGuARiQDkARiQAWARpI

Sumber perakit:

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

(mengikuti baris baru)

Penjelasan

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

Bukan golf terbaik , tapi ini adalah golf pertama saya, jadi mohon ampun.

Cobalah Secara Online!


05AB1E (warisan), 16 - 8 = 8

0"D34çýš"D34çýš

(mengikuti baris baru)

Penjelasan

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

Terima kasih kepada Kevin Cruijssen untuk -2 skor. Tidak bekerja dengan 05AB1E saat ini karena fungsi switch case yang membuat jumlah byte lebih besar

Cobalah Secara Online!

5 Dingus Aug 19 2020 at 10:08

Ruby , skor 24 20 16 12

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

Cobalah secara online!

37 byte dengan 25 inversi kasus. Kasus setiap huruf berubah dalam output.

3 DomHastings Aug 19 2020 at 13:51

Perl 5 , 37 bytes, 20 swapped case, Score 17

Terima kasih kepada @Dominic van Essen untuk -1!

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

Cobalah secara online!

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

Cobalah secara online!

BTW: Ini adalah kontribusi pertama saya dan saya agak bingung. Saya memastikan untuk menukar setiap karakter yang mungkin. Contohnya hanya huruf besar. Jika Anda tidak perlu benar-benar menukar kasus, Anda bisa mendapatkan 11-0 = 11 dengan varian jawaban yang disederhanakan yang diberikan di atas:

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

Keg , skor 4

`④`④

Cobalah secara online!

4 byte dengan 0 konversi kasus.

Quine standar tanpa konversi case dengan mudah mengalahkan setiap pendekatan Keg yang akan memiliki konversi case: pada saat Anda memasukkan teknik konversi case ke dalam campuran, Anda mungkin juga baru saja menulis quine standar tanpa detail mewah.

2 Shaggy Aug 20 2020 at 00:22

Javascript, 27 - 13 = 14

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

Cobalah Secara Online!

1 ovs Aug 19 2020 at 13:23

Python 2 , Skor 52 - 33 = 19

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

Cobalah secara online!

Kasus membalikkan setiap huruf di quine.

1 DominicvanEssen Aug 19 2020 at 17:17

R , skor = 78 - 53 = 25

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

Cobalah secara online!