Che cosa abbiamo dimenticato?


31

Il tuo compito è quello di scrivere un programma per computer non vuoto composto da una sequenza di byte. Se scegliamo un particolare byte nel programma e ne rimuoviamo tutte le istanze dal programma, il programma modificato dovrebbe generare il byte rimosso.

Ad esempio se il nostro programma fosse

aabacba

Quindi bcbsarebbe uscita a, aaacaavrebbe bisogno di uscita be aababasarebbe uscita c.

Non importa cosa fa il programma non modificato.

Le risposte verranno assegnate in byte con l'obiettivo di ridurre al minimo il numero di byte.


4
Poiché questa sfida non è taggata quine, possiamo leggere il nostro codice sorgente?
Dennis,

1
@Dennis Certo. Sii mio ospite
Wheat Wizard

2
Se tutti i byte nel nostro programma rappresentano cifre, possiamo emettere tramite il codice di uscita?
Mr. Xcoder,

15
Penso che sarebbe meglio come una sfida del codice in cui devi massimizzare il numero di caratteri discreti utilizzati.
Notts90,

2
Dovrebbe aver specificato più di 1 byte anziché non vuoto : P. O quello che ha detto Notts90.
Magic Octopus Urn,

Risposte:


70

zsh, 603 594 566 561 548 440 415 399 378 370 byte

ec
ho \\n;ca t<<<$'\x20';exi t
d$c -e8BC6P
d0c -eKp
$'\172\163\150' $'\055\143' $'\146\157\162 v \151\156 \173\043\056\056\134\175\175\073\173 \146\147\162\145\160 \055\161 $\166 '$0$'\174\174\074\074\074$\166\073\175'
$'\145v\141\154' $':\073\072\046\046\145\170\151\164';#%&()*+,/9=>?@ADEFGHIJLMNOQRSTUVWXYZ[]^_`jklmsuwy
0# $#;for b in {$..z};{ fgrep -q $b $0||<<<$b;}

Dipende da coreutils + dc.

Provalo online!

Quello era ... un viaggio.

Questa risposta ha tre parti. Le prime 4 righe gestiscono alcuni casi speciali per semplificare il codice che segue. Le successive 2 righe e l'ultima riga realizzano entrambe essenzialmente la stessa cosa, ma esattamente una viene eseguita con qualsiasi rimozione di carattere. Sono scritti con set di caratteri per lo più complementari, in modo che la rimozione di qualsiasi personaggio ne rompa solo uno al massimo, consentendo all'altro di continuare a funzionare.

Guardando la prima parte, per prima cosa ci occupiamo

  • rimozione di newline con ec\nho \\n
  • rimozione dello spazio con ca t<<<$'\x20'(seguita da exi tper evitare l'esecuzione di codice successivo, che comporterebbe un output estraneo)
  • $rimozione con d$c -e8BC6P( 8BC6= 9226is 36*256 + 10, e 36 e 10 sono i valori byte rispettivamente dei $caratteri newline; usiamo le cifre esadecimali in decimali per evitare di doverle includere nel commento grande nella riga 6)
  • 0rimozione con d0c -eKp( Kottiene la precisione decimale, che è 0di default)

Nella parte successiva, gli unici caratteri utilizzati (a parte la spazzatura alla fine della seconda riga) sono $'\01234567v;, spazio e newline. Di questi, quattro sono stati presi in considerazione, quindi il resto ( '\1234567v) non può verificarsi nell'ultima riga. Espandendo le fughe ottali ( $'\123'rappresenta il carattere ASCII con valore 123 8 ), otteniamo:

zsh -c 'for v in {#..\}};{ fgrep -q $v '$0'||<<<$v;}'
eval ':;:&&exit'

La prima riga scorre tutti i caratteri utilizzati nel programma e cerca ciascuno nel proprio codice sorgente ( $0è il nome file dello script in esecuzione), stampando qualsiasi carattere non trovato.

La seconda riga sembra un po 'strana e sembra fare la stessa cosa exitdi un mucchio di nops. Tuttavia, la codifica exitcome ottale risulta direttamente $'\145\170\151\164', che non contiene 2o 3. Dobbiamo effettivamente renderlo meno resistente alle traslochi. Questo perché se uno di questi '\014567vviene rimosso, interrompendo la prima riga, anche la seconda riga si interrompe, consentendo l'esecuzione del resto del codice. Tuttavia, abbiamo bisogno che si interrompa anche se 2o 3vengono rimossi in modo che le linee 3 e 4 possano essere eseguite. Ciò si ottiene con il pattino in :e ;, che hanno rispettivamente un 2 e un 3 nella loro rappresentazione ottale.

La spazzatura alla fine della riga 2 è semplicemente lì per garantire che ogni carattere ASCII stampabile appaia almeno una volta, poiché il modo in cui il controllo viene eseguito ciclicamente attraverso ognuno di essi lo richiede.

Se exitnon è stato chiamato nella prima sezione (cioè è stato rovinato dalla rimozione di uno dei '\01234567v), passiamo alla seconda, in cui dobbiamo realizzare la stessa cosa senza usare nessuno di questi personaggi. L'ultima riga è simile alla prima riga decodificata, tranne per il fatto che possiamo contrarre l'intervallo del loop per salvare alcuni byte, perché sappiamo già che tutti i caratteri tranne quelli '\01234567vsono stati coperti. Ha anche 0# $#davanti, che lo commenta e gli impedisce di produrre output estraneo se 0o $fosse rimosso.


5
Wow, molto impressionante considerando la quantità di personaggi distinti coinvolti! Sicuramente non vedo l'ora di vedere quella spiegazione.
Kevin Cruijssen,

3
@KevinCruijssen ecco qui :)
Maniglia della porta

1
@Doorknob se questo non ti fa vincere 548 internet, non so cosa. Onestamente, la versione da 603 byte è altrettanto impressionante!
Magic Octopus Urn,

3
L'unica risposta interessante finora.
htmlcoderexe,

21

Retina , 1 byte

1

Provalo online!

Quando tutte le istanze del singolo byte ( 1) vengono rimosse, l'output è 1. Abbastanza semplice.


6
Stavo navigando su TIO per trovare qualcosa del genere - mi hai battuto. A proposito, questo è un poliglotta, funziona con Snails
JayCe,

IMO, questa risposta dovrebbe essere aggiornata a una risposta poliglotta come la prima (possibilmente con un elenco di lingue per sempre incompleto) e le altre due ridotte all'oblio. Oh, e anche questo funziona in C .

@Rogem Non sono sicuro di cosa intendi con "funziona in C." hai un compilatore C che genera 1il programma vuoto? Indipendentemente da ciò, penso che le risposte in questione utilizzino approcci e comportamenti diversi. L'IMO ha una risposta poliglotta solo se l'approccio rimane lo stesso. (Obiettivamente, questo non è un poliglotta poiché il codice effettivo è diverso, per le risposte di seguito.) Sentiti libero di votare come vuoi, ma una risposta valida è una risposta valida. Terrò la mia risposta così com'è, non desidero ospitare una raccolta di risposte su di essa.
Conor O'Brien,

11

Lenguage, 216173027061157310 byte

216173027061157310 = (144115617572598740 + 144115241762960340 + 144115194786755540) / 2. Ci sono 216173027061157310 - 144115617572598740 $s, 216173027061157310 - 144115241762960340 #s e 216173027061157310 - 144115194786755540spazi.

Gli #spazi e gli spazi 144115617572598740 codificano il seguente programma BF:

++++++[>++++++<-]>.

Provalo online!

144115241762960340 se gli $spazi codificano il seguente programma BF:

+++++++[>+++++<-]>.

Provalo online!

I 144115194786755540 $s e #s codificano il seguente programma BF:

++++++++[>++++<-]>.

Provalo online!

Modifica: salvato 72057832274401770 byte grazie a @Nitrodon.


Perché non usare Ue byte 127? Provalo online! O anche solo il nul byte e soh?
Jo King,

@JoKing Non sapevo che Ufosse il byte ASCII stampabile più breve che potesse essere emesso. Non volevo usare byte non stampabili.
Neil,

Anche senza trarre vantaggio dall'involucro di celle o caratteri non stampabili, è possibile ridurlo a 216173027061157310 byte includendo il carattere spazio come terzo byte distinto.
Nitrodon,

7
Non posso fare a meno di migliorare a causa di "Modifica: Salvato 72057832274401770 byte ..."
Mr Lister,


9

Polyglot * , 1 byte (in attesa di conferma )

0

Provalo online! (usando la triangolarità)

*: Funziona in una (piuttosto ampia) varietà di lingue (tranne per esolangs come 4,> <> e simili e alcune altre eccezioni). Identico alla risposta Jelly nel codice sorgente, ma il metodo di I / O è diverso - L'output avviene tramite il codice di uscita. Quando uno viene rimosso 0dal codice sorgente, viene lasciato con un programma vuoto, che spesso non genera errori e produce il codice di uscita 0 nella maggior parte delle lingue.



3

Unario (non competitivo), 96 byte

00000000: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000010: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
00000050: 0000 0000 0101 0101 0101 0101 0101 0101  ................

Ecco la xxddiscarica.

Una definizione più ampia della lingua unaria consente qualsiasi carattere nel suo codice sorgente. Ma non ho trovato un compilatore o un interprete che avrebbe funzionato per questo. Quindi ho contrassegnato questa risposta come non competitiva. Se riesci a trovarne uno pubblicato prima di questa domanda, ti collegherò ad esso.


4
Questo è il più piccolo programma Unario che abbia mai visto.
Draco18s
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.