Pure Sourcery - Programmi di modellatura che emettono le cifre da 0 a 9


21

Ecco un font pixel 5 per 7 per le cifre da 0 a 9:

.███.
█...█
█...█
█...█
█...█
█...█
.███.

..█..
███..
..█..
..█..
..█..
..█..
█████

.███.
█...█
....█
...█.
..█..
.█...
█████

.███.
█...█
....█
..██.
....█
█...█
.███.

█..█.
█..█.
█..█.
█████
...█.
...█.
...█.

█████
█....
█....
.███.
....█
█...█
.███.

.███.
█...█
█....
████.
█...█
█...█
.███.

█████
....█
....█
...█.
...█.
..█..
..█..

.███.
█...█
█...█
.███.
█...█
█...█
.███.

.███.
█...█
█...█
.████
....█
█...█
.███.

(Questo carattere e questa pagina avranno probabilmente un aspetto migliore se si esegue questo codice JavaScipt nella console del browser o nella barra dell'URL con il prefisso javascript::. $('#question pre,.answer pre').css('line-height',1))

Scrivi due blocchi rettangolari di testo di dimensioni uguali, uno per rappresentare gli spazi vuoti ( .) nel carattere sopra e uno per rappresentare gli spazi riempiti ( ).

Quando questi due blocchi di testo sono disposti nello stesso modello 5 × 7 di una delle cifre sopra, il blocco di testo grande risultante dovrebbe essere un programma che stampa quella cifra su stdout. Questo dovrebbe funzionare per tutte e 10 le cifre.

Ad esempio, se il .blocco di testo fosse

---
'''

e il tuo blocco di testo era

ABC
123

quindi il programma

---ABCABCABC---
'''123123123'''
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
ABC---------ABC
123'''''''''123
---ABCABCABC---
'''123123123'''

dovrebbe produrre 0. Allo stesso modo, il programma

------ABC------
''''''123''''''
ABCABCABC------
123123123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
------ABC------
''''''123''''''
ABCABCABCABCABC
123123123123123

dovrebbe produrre 1, e così via fino al programma per 9.

Puoi utilizzare questo frammento di stack per creare i programmi a forma di cifra:

<style>textarea{font-family:monospace;}</style><script>function go(){var t=parseInt(document.getElementById("digit").value[0]);if(isNaN(t))return void alert("Invalid digit.");for(var e=document.getElementById("empty").value.split("\n"),n=document.getElementById("filled").value.split("\n"),l=[],o=0;o<7*e.length;o++){l[o]="";for(var d=0;5>d;d++)l[o]+=font[t][Math.floor(o/e.length)][d]?n[o%n.length]:e[o%e.length]}document.getElementById("output").value=l.join("\n")}font=[[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[0,0,1,0,0],[1,1,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[0,0,1,0,0],[1,1,1,1,1]],[[0,1,1,1,0],[1,0,0,0,1],[0,0,0,0,1],[0,0,0,1,0],[0,0,1,0,0],[0,1,0,0,0],[1,1,1,1,1]],[[0,1,1,1,0],[1,0,0,0,1],[0,0,0,0,1],[0,0,1,1,0],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[1,0,0,1,0],[1,0,0,1,0],[1,0,0,1,0],[1,1,1,1,1],[0,0,0,1,0],[0,0,0,1,0],[0,0,0,1,0]],[[1,1,1,1,1],[1,0,0,0,0],[1,0,0,0,0],[0,1,1,1,0],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,0],[1,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[1,1,1,1,1],[0,0,0,0,1],[0,0,0,0,1],[0,0,0,1,0],[0,0,0,1,0],[0,0,1,0,0],[0,0,1,0,0]],[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]],[[0,1,1,1,0],[1,0,0,0,1],[1,0,0,0,1],[0,1,1,1,1],[0,0,0,0,1],[1,0,0,0,1],[0,1,1,1,0]]]</script><textarea id='empty' rows='8' cols='32' placeholder='empty space text block...'></textarea><textarea id='filled' rows='8' cols='32' placeholder='filled space text block...'></textarea><br>Digit <input id='digit' type='text' value='0'> <button type='button' onclick='go()'>Generate</button><br><br><textarea id='output' rows='16' cols='64' placeholder='output...' style='background-color: #eee;' readonly></textarea>

Dettagli

  • Nessuno dei 10 grandi programmi di blocco di testo dovrebbe richiedere input. Emette solo la singola cifra più una nuova riga finale opzionale. Uscita su stdout o un'alternativa simile.
  • Nessuno dei programmi può leggere o accedere al proprio codice sorgente. Trattare questo come un rigoroso Quine sfida.
  • I blocchi di testo potrebbero non essere identici e devono avere dimensioni diverse da zero.
  • I blocchi di testo possono contenere qualsiasi carattere tranne i terminatori di riga .
  • I 10 programmi devono essere programmi a tutti gli effetti scritti nella stessa lingua, non sono frammenti REPL . Se lo desideri, puoi aggiungere una nuova riga finale a tutte o nessuna.

punteggio

Il tuo punteggio è l'area (larghezza per altezza) di uno dei tuoi blocchi di testo. (Hanno le stesse dimensioni, quindi non ha senso contare entrambi i blocchi.) L'area dell'esempio è 3 per 2, per un punteggio di 6.

Vince il punteggio più basso. In caso di parità vince la risposta più votata.


Sul tuo codice, puoi migliorarlo molto. var t=parseInt(document.getElementById("digit").value[0]);if(isNaN(t))return void alert("Invalid digit.");può essere scritto come var t=document.getElementById("digit").value[0]/1;if(t!=t)return void alert("Invalid digit.");, che è lo stesso ma più breve. Ci sono alcune altre cose che puoi migliorare in esso, ma sembra fantastico!
Ismael Miguel,

4
@IsmaelMiguel TBH L'ho messo attraverso un minificatore JS per ottenerlo su una riga. Non è mai stato pensato per essere giocato a golf.
Calvin's Hobbies

Oh, amico ... È un po 'pigro ... In una domanda sul golf, pubblichi un codice non golf ... Ma hey, ho capito e lo sto solo dicendo. Non devi seguire quello che ho detto. Ma è una buona cosa da fare.
Ismael Miguel,

6
@IsmaelMiguel Ho pubblicato un codice di utilità non registrato , che probabilmente dovrebbe essere il più leggibile possibile in modo che i bug siano più facili da individuare. Ma in realtà, fintanto che funziona, la dimensione del codice dello snippet dello stack ha letteralmente zero effetti sull'esito della sfida.
Calvin's Hobbies

3
text blocks may not be identicalveramente? Voglio vedere qualcuno infrangere questa regola, dando due blocchi di codice identici, che magicamente restituiscono cifre diverse, quando ogni numero è esattamente lo stesso codice ^^
Falco

Risposte:


13

CJam, 20 18 14 13 12 * 1 = 12

Provalo online: 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9

Blocco vuoto

];BG*K+ :BD%

Blocco solido

];B9+33%:B4/

Spiegazione

Ho usato una strategia simile alla soluzione di Sp3000 , in modo tale che ciascun blocco esegua una moltiplicazione, un'aggiunta e (possibilmente) un'operazione modulo su una variabile e salvi il valore. Per trovare una soluzione ottimale, ho usato una buona forza bruta. Ho scritto un programma che ricerca lo spazio di tutti i possibili valori iniziali (i valori iniziali delle variabili CJam) e molti milioni di possibili coppie di funzioni di trasformazione in modo tale che l'output per ogni forma di cifra sia unico. Quindi, ho filtrato i risultati per quelli in modo tale che il risultato finale per i moduli di cifre che terminano in un blocco vuoto, di cui ci sono 8, possa essere mappato al risultato corretto tramite un'altra formula moltiplica, aggiungi e modulo.

Dopo un paio di giorni di ricerca della CPU, il risultato migliore finora è fino a una dimensione di 12! Questa soluzione inizia con un valore di 11, la funzione di trasformazione del blocco vuoto è x * 16 + 20, la funzione del risultato del blocco vuoto è x % 13, la funzione di trasformazione del blocco solido è (x + 9) % 33e la funzione del risultato del blocco solido è x / 4.


23

> <> (Pesce) , 5 * 10 = 50

Blocco vuoto

   \   !9 
4n;    n/ 
1n;\      
       \  
0n;n7\\\  

Blocco solido

   \; n8/ 
     /!/!v
     \  ;6
3n;\ ! /nn
2n;n5<  8;

Questo codice non contiene alcuna logica o aritmetica utilizza solo reindirizzamenti statici del puntatore di istruzioni 2D (IP) di> <> con "mirror" ( /e \) e due "frecce" ( <e v). L'unico altro controller di flusso è il "trampolino" ( !) che passa attraverso il personaggio successivo.

L'IP inizia dall'angolo in alto a sinistra in direzione est. Dopo alcuni reindirizzamenti raggiunge un numero che viene inserito nello stack e stampato con ne il programma termina con ;.

Il flusso del programma

Un blocco "riconosce" lo stato corrente del programma dal fatto che il punto in cui è arrivato l'IP e in base allo stato decide quale direzione dovrebbe rilasciare il puntatore (quale blocco deve essere eseguito successivamente) e in quale posizione esatta il puntatore dovrebbe essere lasciato (che sarà il nuovo stato). Naturalmente i blocchi non fanno alcuna logica, tutto questo comportamento viene dai redirector.


Speravo in una risposta come questa. Pura magia.
EagleV_Attnam

11

CJam, 23 22 19 * 1 = 19

Blocco vuoto:

];G)B%:G"73860594"=

Blocco solido:

];GW*B+3*D%:G    7-

Provalo online .

Sto cercando di essere fortunato con coincidenze matematiche e fallimenti, quindi ecco un approccio leggermente diverso alla mappatura di unicità dalla soluzione di Martin.

Inizia con 16. I blocchi vuoti aggiungono 1 e prendono il modulo 11. I blocchi solidi si moltiplicano per -1, aggiungono 11, moltiplicano per 3 quindi prendono il modulo 13. In questo modo si mappano magicamente 03456789(le cifre che terminano su un blocco vuoto) 41753026, a cui utilizziamo l'indicizzazione per avere ragione. 12mappe ordinatamente a 89, che possiamo rimediare sottraendo 7.


7

CJam, 28 27 x 1 = 27

Ecco un inizio.

Blocco vuoto

U):U;                       

Blocco solido

];U):UW+:WF%"1302986_7_54"=

Provalo qui. Non posso darti un permalink con il codice, perché il codice è troppo lungo, quindi dovrai copiarlo manualmente dallo snippet nella sfida.

L'idea è di tratteggiare la forma come segue:

  • Per ogni "pixel" incrementa un contatore U.
  • Per ogni "pixel" nero aggiungi Uun totale parziale W(che inizia da -1). Alla fine, prendiamo questo modulo 15, che sembra dare risultati unici, che usano per indicizzare in una stringa di ricerca.
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.