Vaka, kininizi ters çevirin

Aug 19 2020

Kaynak kodda mümkün olduğunca çok sayıda ascii karakterinin durumunu tersine çevirmeye çalışan bir quine yazın. Örneğin javascript'te:

(x=function(y){return ('(x='+y+')(x)').toUpperCase();})(x)
  • Standart quine kuralları geçerlidir.

  • Puan , kaynak kodundaki bayt sayısı ile verilir - vaka terslerinin sayısı . Örneğin yukarıdaki kinin puanı 29'dur.

  • En düşük puana sahip program kazanır. İki program aynı puana sahipse, daha kısa olan kazanır.

Yanıtlar

26 SE-stopfiringthegoodguys Aug 19 2020 at 17:51

> <> , puan 479 - 479 = 0

lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllbfppllfepeeppppgglcepppbeppppppppppplfdppedpddpgglcdppbdpfcpecpggldcppllccpbcpplfbpebppldbppcbpggcbglefgpgbeglefgpgcbglefgpgggggedglefgpgccglefgpgfdglefgpgebglefgpgecglefgpggdcglefgpgceglefgpgeeglefgpgbcglefgpgfbglefgpgcdgfefgpbdgeefgpfegdefgpccgcefgpfdgbefgpdbgaefgpppddglefgpgbcglefgpgfcglefgpgdbglefgpgdcglefgpgecglefgpgddglefgpgdbglefgplffpbfgffgefgpcbgefgefgp

Çevrimiçi deneyin!

Nasıl çalışır

> <> İçindeki çok az yararlı talimat harflerdir. Ancak, lyığının uzunluğunu yığına doğru iten hala var . Bu nedenle, keyfi değerleri yığına (çok ayrıntılı bir şekilde) itmek mümkündür. Böylelikle, dizeler a, yığının uzunluğunu arttırmak gveya pazaltmak için beyin fırtınasına benzer bir şekilde kodlanabilir .

Her zamanki quine kuralları gereğince, gyerine gibi yerlerde kayıtlarını muhafaza kaynak kodunu kendisi okumak için kullanılmaz bbve bcvb.

Kodlanmış dize önek:

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

7.000'den fazla komuttan sonra, orijinal dizeyi büyük harfle verir.

10 JoKing Aug 19 2020 at 20:14

Gol> <> , 77 75 - 75 = 0

urassssissezplzelssmzmzpssazmkqjmkrmbrrrrrtsuotlballsssssassmzpsssssbssmzpu

Çevrimiçi deneyin!

Dayanarak Bubbler cevabı , bu da koyarak daha da ileri gider "bir puan elde etmek kod başlangıcında 0!

Açıklama

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

"mrllssslssscsmzpdsmzprrrrrrtsuota

Çevrimiçi deneyin!

Aşağıdakinin çıktısını alır ve baştaki karakter hariç her karakterin büyük harfli olduğu hatayla çıkar ".

"MRLLSSSLSSSCSMZPDSMZPRRRRRRTSUOTA

Nasıl çalışır

İle işaretlenen satırlar *önceki versiyondan farklıdır.

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

"mrlTSuotaaaaaaaaaaaaaaaaaaaaaaaaa

Çevrimiçi deneyin!

Aşağıdakileri verir ve hata ile çıkar.

"MRLTSUOTAAAAAAAAAAAAAAAAAAAAAAAAA

Her küçük harf büyük harfle yazılır, bu nedenle değiştirilmeyen karakterler tek karakterdir "TS.

Nasıl çalışır

"..."  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 veya daha azının mümkün olabileceğinden şüpheleniyorum.

6 Dingus Aug 19 2020 at 11:25

V (vim) , skor 3

2i2I

Çevrimiçi deneyin!

1 durum tersine çevirme ile 4 bayt. Dizeyi iki kez ekler ( 2i) 2I.

6 ErikF Aug 21 2020 at 04:58

80186+ makine kodu (MS-DOS .COM formatı), 115-115 = 0

Ben sadece erişimi vardı gibi, bunu yapmak için biraz zor oldu INC, DEC, PUSH, belli POPvaryasyonları, POPA, IMULve bazı koşullu sıçramalar. Neyse ki, IMULbu meydan okuma için ağır işi yapabilirdi!

Birlikte çarpılan bir dizi değerde yazdırmayı gerçekleştiren gerçek kodu kodladım. Bu değerleri hesaplıyorum (16 bitlik değerlere kesiliyor), onları kodun hemen üstüne taşıdığım yığında depoluyorum ve ardından programın kodunu ters durumda yazdırmak için üretilen koda atlıyorum.

Makine kodu:

hrXhCNhGUhnPhPwhYkhvLhKwaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaPQRjZTUVjfaiQVGARiQSCARiQPQARiQMJARiQJZARiQGuARiQDkARiQAWARpI

Birleştirici kaynağı:

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

(son satır)

Açıklama

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

En iyi golf değil , ama bu benim ilk golfum, lütfen merhamet edin.

Çevrimiçi Deneyin!


05AB1E (eski), 16 - 8 = 8

0"D34çýš"D34çýš

(son satır)

Açıklama

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

Kevin Cruijssen'e -2 puan için teşekkürler. Geçerli 05AB1E ile çalışmaz, çünkü anahtar durumu işlevi bayt sayısını artırır

Çevrimiçi Deneyin!

5 Dingus Aug 19 2020 at 10:08

Ruby , puan 24 20 16 12

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

Çevrimiçi deneyin!

25 büyük / küçük harf değişimi ile 37 bayt. Çıktıdaki her harfin durumu değiştirilir.

3 DomHastings Aug 19 2020 at 13:51

Perl 5 , 37 bayt, 20 takas durum, Puan 17

-1 için @Dominic van Essen'e teşekkürler !

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

Çevrimiçi deneyin!

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

Çevrimiçi deneyin!

BTW: Bu benim ilk katkım ve biraz kafam karıştı. Olası her karakteri değiştirmeye özen gösterdim. Örnek yalnızca büyük harflerle yazılmıştır. Vakaları gerçekten takas etmeniz gerekmiyorsa , yukarıda verilen bir cevabın basitleştirilmiş bir varyantıyla 11-0 = 11 elde edilebilir:

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

Fıçı , skor 4

`④`④

Çevrimiçi deneyin!

0 büyük / küçük harf dönüşümü ile 4 bayt.

Büyük / küçük harf dönüştürmesiz standart kehribar, büyük / küçük harf dönüşümü olan tüm Keg yaklaşımlarını kolayca yener: Karışıma büyük / küçük harf dönüştürme tekniklerini attığınız zaman, süslü ayrıntılar içermeyen standart bir quine yazmış olabilirsiniz.

2 Shaggy Aug 20 2020 at 00:22

Javascript, 27 - 13 = 14

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

Çevrimiçi Deneyin!

1 ovs Aug 19 2020 at 13:23

Python 2 , Puan 52 - 33 = 19

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

Çevrimiçi deneyin!

Durum, kindeki her harfi tersine çevirir.

1 DominicvanEssen Aug 19 2020 at 17:17

R , puan = 78 - 53 = 25

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

Çevrimiçi deneyin!