Quine si emette in binario


10

Il tuo compito, se desideri accettarlo, è scrivere un programma che emetta il proprio codice sorgente nella rappresentazione binaria UTF-8 .

Regole

  • La sorgente deve essere lunga almeno 1 byte.

  • Il tuo programma non deve accettare input (o avere input vuoti inutilizzati).

  • L'output può essere in qualsiasi formato conveniente.

  • Newline finale facoltativa consentita.

  • Si noti che un byte è 8 bit e la lunghezza della rappresentazione binaria UTF-8 è necessariamente un multiplo di 8.

  • Si tratta di quindi si applicano tutte le normali regole del golf e vince il codice più breve (in byte).

  • Sono vietate le scappatoie standard .

Esempio

Diciamo che il tuo codice sorgente è Aä$$€h, la sua corrispondente rappresentazione binaria UTF-8 è 010000011100001110100100001001000010010011100010100000101010110001101000.

Se corro Aä$$€hl'output deve essere 010000011100001110100100001001000010010011100010100000101010110001101000.

A      --> 01000001
ä      --> 1100001110100100
$      --> 00100100
$      --> 00100100
€      --> 111000101000001010101100
h      --> 01101000
Aä$$€h --> 010000011100001110100100001001000010010011100010100000101010110001101000

Convertitori da stringa a binario UTF-8


1
Per "binario", intendi una rappresentazione in forma di stringa dei valori binari, ovvero una stringa composta solo da 1 e 0?

1
@mdahmoune Ora è già molto meglio. La domanda rimane come rappresentare qualcosa come UTF-8. Si noti che la rappresentazione Unicode si basa principalmente sull'aspetto di un personaggio (solo occasionalmente sul significato semantico). Cosa succede se nessun glifo Unicode assegnato assomiglia a un carattere nel codice sorgente? Unicode ha anche molti sosia (omogenei). Come si decide quale utilizzare? Ad esempio, Dyalog APL ha una funzione AND che può essere codificata come 01011110o 0010011100100010in UTF-8 (sembrano abbastanza simili: ^vs )
Adám

1
Esempio migliore: 01111100e 0010001100100010codificare |e .
Adám,

4
@ Adám Penso che sarebbe giusto produrre qualsiasi sequenza binaria che corrisponda a un simbolo che verrà compilato / eseguito in una certa implementazione di un linguaggio.
qwr

1
Che ne dici di codice macchina? (Il Commodore C64 impiega 28 byte assumendo che il codice macchina stesso sia il "codice sorgente")
Martin Rosenau

Risposte:


7

V , 28 (o 16?) Latino 1 byte (35 UTF-8 byte)

ñéÑ~"qpx!!xxd -b
ÎdW54|D
Íßó

Provalo online!

Hexdump (in latino 1):

00000000: f1e9 d17e 2271 7078 2121 7878 6420 2d62  ...~"qpx!!xxd -b
00000010: 0ace 6457 3534 7c44 0acd dff3            ..dW54|D....

Output (rappresentazione binaria dello stesso codice in UTF-8, non in latino 1):

110000111011000111000011101010011100001110010001011111100010001001110001011100000111100000100001001000010111100001111000011001000010000000101101011000100000110111000011100011100110010001010111001101010011010001111100010001000000110111000011100011011100001110011111110000111011001100001010

Spiegazione:

ñéÑ~"qpx            " Standard quine. Anything after this doesn't affect the
                    " program's 'quine-ness' unless it modifies text in the buffer
        !!xxd -b    " Run xxd in binary mode on the text
Î                   " On every line...
 dW                 "   delete a WORD
   54|              "   Go to the 54'th character on this line
      D             "   And delete everything after the cursor
Í                   " Remove on every line...
  ó                 "   Any whitespace
 ß                  "   Including newlines

O...

V , 16 byte

ñéÑ~"qpx!!xxd -b

Provalo online!

Produzione:

00000000: 11000011 10110001 11000011 10101001 11000011 10010001  ......
00000006: 01111110 00100010 01110001 01110000 01111000 00100001  ~"qpx!
0000000c: 00100001 01111000 01111000 01100100 00100000 00101101  !xxd -
00000012: 01100010 00001010                                      b.

OP ha detto:

L'output può essere in qualsiasi formato conveniente.

Questo produce un formato molto più conveniente per V: P (ma non sono sicuro che si stiano estendendo le regole)



4

05AB1E , 105 byte

0"D34çýÇbεDg•Xó•18в@ƶà©i7j0ìëR6ôRíć7®-jšTìJ1®<×ì]ð0:J"D34çýÇbεDg•Xó•18в@ƶà©i7j0ìëR6ôRíć7®-jšTìJ1®<×ì]ð0:J

05AB1E non ha builtin di conversione UTF-8, quindi devo fare tutto manualmente .

Provalo online o verifica che sia un quine .

Spiegazione:

parte:

Il più breve per 05AB1E è questo: 0"D34çý"D34çý( 14 byte ) fornito da @OliverNi . La mia risposta utilizza una versione modificata di quella Quine aggiungendo al ...qui: 0"D34çý..."D34çý.... Una breve spiegazione di questo quine:

0               # Push a 0 to the stack (can be any digit)
 "D34çý"        # Push the string "D34çý" to the stack
        D       # Duplicate this string
         34ç    # Push 34 converted to an ASCII character to the stack: '"'
            ý   # Join everything on the stack (the 0 and both strings) by '"'
                # (output the result implicitly)

Parte sfida:

Ora per la parte sfida del codice. Come ho detto in alto, 05AB1E non ha built-in di conversione UTF-8, quindi devo fare queste cose manualmente. Ho usato questa fonte come riferimento su come farlo: Conversione manuale di punti di codice Unicode in UTF-8 e UTF-16 . Ecco un breve riassunto di quello relativo alla conversione dei caratteri Unicode in UTF-8:

  1. Converti i caratteri Unicode nei loro valori Unicode (ovvero "dЖ丽"diventa [100,1046,20029])
  2. Converti questi valori unicode in binari (ovvero [100,1046,20029]diventa ["1100100","10000010110","100111000111101"])
  3. Controlla in quale dei seguenti intervalli sono i caratteri:
    1. 0x00000000 - 0x0000007F (0-127): 0xxxxxxx
    2. 0x00000080 - 0x000007FF (128-2047): 110xxxxx 10xxxxxx
    3. 0x00000800 - 0x0000FFFF (2.048-65.535): 1110xxxx 10xxxxxx 10xxxxxx
    4. 0x00010000 - 0x001FFFFF (65536-2097151): 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Esistono anche intervalli per 5 o 6 byte, ma per ora li lasciamo fuori.

Il personaggio dsarà nel primo intervallo, quindi 1 byte in UTF-8; il carattere Жè nel secondo intervallo, quindi 2 byte in UTF-8; e il carattere è nel terzo intervallo, quindi 3 byte in UTF-8.

I xpattern dietro sono riempiti con il binario di questi personaggi, da destra a sinistra. Quindi diventa il simbolo d( 1100100) con ; il ( ) con pattern diventa ; e ( ) con il modello diventa , dopo di che il residuo vengono sostituiti con : .0xxxxxxx01100100Ж10000010110110xxxxx 10xxxxxx11010000 100101101001110001111011110xxxx 10xxxxxx 10xxxxxx1110x100 10111000 10111101x011100100 10111000 10111101

Quindi, quell'approccio ho usato anche nel mio codice. Invece di controllare gli intervalli effettivi, guardo solo la lunghezza del file binario e la confronto con la quantità di xnei modelli, poiché ciò consente di risparmiare qualche byte.

Ç               # Convert each character in the string to its unicode value
 b              # Convert each value to binary
  ε             # Map over these binary strings:
   Dg           #  Duplicate the string, and get its length
     Xó•       #  Push compressed integer 8657
         18в    #  Converted to Base-18 as list: [1,8,12,17]
            @   #  Check for each if the length is >= to this value
                #  (1 if truthy; 0 if falsey)
   ƶ            #  Multiply each by their 1-based index
    à           #  Pop and get its maximum
     ©          #  Store it in the register (without popping)
   i            #  If it is exactly 1 (first range):
    7j          #   Add leading spaces to the binary to make it of length 7
      0ì        #   And prepend a "0"
   ë            #  Else (any of the other ranges):
    R           #   Reverse the binary
     6ô         #   Split it into parts of size 6
       Rí       #   Reverse it (and each individual part) back
    ć           #   Pop, and push the remainder and the head separated to the stack
     7®-        #   Calculate 7 minus the value from the register
        j       #   Add leading spaces to the head binary to make it of that length
         š      #   Add it at the start of the remainder-list again
    Tì          #   Prepend "10" before each part
      J         #   Join the list together
    1®<×        #   Repeat "1" the value from the register - 1 amount of times
        ì       #   Prepend that at the front
  ]             # Close both the if-else statement and map
   ð0:          # Replace all spaces with "0"
      J         # And join all modified binary strings together
                # (which is output implicitly - with trailing newline)

Vedere questo 05AB1E risposta di mine (sezioni Come comprimere grandi numeri interi? E come liste di interi comprimere? ) Per capire il motivo per cui •Xó•18вè [1,8,12,17].



2

Ruggine , 187 byte

fn f(o:u8){for c in b"go!g)n;t9(zgns!b!ho!c#%#/huds)(zhg!b_n <27zqshou )#z;19c|#-b_n(:|dmrdzg)1(:|||go!l`ho)(zg)0(:|".iter(){if c^o!=36{print!("{:08b}",c^o);}else{f(0);}}}fn main(){f(1);}

Provalo online!


2

Perl 6 , 46 byte

<say "<$_>~~.EVAL".ords.fmt("%08b",'')>~~.EVAL

Provalo online!

Lo standard quine con .fmt("%08b",'')formatta l'elenco di valori ordinali in binario di lunghezza 8 e si unisce con una stringa vuota.



2

Java 10, 339 308 265 227 225 186 184 byte

v->{var s="v->{var s=%c%s%1$c;return 0+new java.math.BigInteger(s.format(s,34,s).getBytes()).toString(2);}";return 0+new java.math.BigInteger(s.format(s,34,s).getBytes()).toString(2);}

-8 byte grazie a @NahuelFouilleul che rimuove il superfluo &255(e un ulteriore -35 per aver portato alla mia attenzione che le specifiche complete del programma della sfida sono state revocate e ora è consentita anche una funzione ..)
-41 byte grazie a @ OlivierGrégoire .

Provalo online.

Spiegazione:

parte:

  • var s contiene il codice sorgente non formattato String
  • %s è usato per mettere questa stringa in sé con s.format(...)
  • %c, %1$cE 34vengono utilizzati per formattare le virgolette ( ")
  • s.format(s,34,s) mette tutto insieme

Parte sfida:

v->{                         //  Method with empty unused parameter and String return-type
  var s="...";               //   Unformatted source code String
  return 0+                  //   Return, with a leading "0":
   new java.math.BigInteger( //    A BigInteger of:
     s.format(s,34,s)        //     The actual source code String
      .getBytes())           //     Converted to a list of bytes (UTF-8 by default)
   .toString(2);}            //    And convert this BigInteger to a binary-String      

1
265 byte usando lambda, anche perché tutta la fonte è ascii sembra non firmata int c&255non è necessaria
Nahuel Fouilleul

@NahuelFouilleul La domanda originale affermava " Devi costruire un programma completo " e " Il tuo output deve essere stampato su STDOUT. ", Da qui il codice verbale dettagliato che ho invece di una funzione lambda che restituisce una stringa. Un buon punto per non averne bisogno, &255dal momento che non usiamo caratteri non ASCII, grazie!
Kevin Cruijssen,

ok non sono ancora molto familiare con gli usi, ma altre lingue come javascript danno a lambda la restituzione di una stringa, inoltre non capisco perché in java non contiamo il tipo e il punto e virgola finale quando si usa lambda dove potrei trovare le regole?
Nahuel Fouilleul,

1
Bene, è lì che mi sono perso. Comunque ho provato ed ecco un nuovo candidato per 184 byte . Dimmi se sbaglio da qualche parte;)
Olivier Grégoire,

1
@ OlivierGrégoire Ah, bel approccio! Dimenticato completamente di BigIntegeressere piuttosto corto per la conversione in stringhe binarie. E altri 2 byte cambiando return'0'+in return 0+. Hmm, perché questo leader è 0necessario tra l'altro? Mi confonde che tutte le stringhe binarie interne abbiano questo vantaggio 0, ma il primo non quando si usa BigInteger.toString(2)..
Kevin Cruijssen,

2

Python 2 , 68 67 byte

_="print''.join(bin(256|ord(i))[3:]for i in'_=%r;exec _'%_)";exec _

Provalo online!

Una modifica di questa risposta

-1 byte rimuovendo lo spazio dopo 'in' (grazie @mdahmoune)


-1 byte: puoi rilasciare lo spazio dopoin
mdahmoune il

non hai aggiornato il tuo link TIO. inoltre, ho provato a fare '%08b'%ord(i)invece di bin(256|ord(i))[3:], ma non ha funzionato per qualche motivo
Jo King,

2

R , 138 114 byte

x=function(){rev(rawToBits(rev(charToRaw(sprintf("x=%s;x()",gsub("\\s","",paste(deparse(x),collapse="")))))))};x()

Provalo online!

Utilizza la capacità di R di distribuire le funzioni nella loro rappresentazione del personaggio. I revs sono necessari perché rawToBitsmette il bit meno significativo per primo. as.integerè necessario perché altrimenti i bit vengono visualizzati con uno zero iniziale.

Modificato una volta mi sono reso conto che era consentito qualsiasi output conveniente. Inoltre è uscito da uno conteggio byte originale.


1

C # (compilatore interattivo Visual C #) , 221 byte

var s="var s={0}{1}{0};Write(string.Concat(string.Format(s,(char)34,s).Select(z=>Convert.ToString(z,2).PadLeft(8,'0'))));";Write(string.Concat(string.Format(s,(char)34,s).Select(z=>Convert.ToString(z,2).PadLeft(8,'0'))));

Provalo online!

C # (compilatore interattivo Visual C #) con flag /u:System.String, 193 byte

var s="var s={0}{1}{0};Write(Concat(Format(s,(char)34,s).Select(z=>Convert.ToString(z,2).PadLeft(8,'0'))));";Write(Concat(Format(s,(char)34,s).Select(z=>Convert.ToString(z,2).PadLeft(8,'0'))));

Provalo online!


1

Strumenti Bash + GNU, 48 byte

trap -- 'trap|xxd -b|cut -b9-64|tr -dc 01' EXIT

TIO


grazie, aggiornato infatti è la variante più breve, altrimenti dovrebbe essere rimosso dall'output della trap
Nahuel Fouilleul,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.