7 , 31 caratteri, punteggio 30, sicuro ma forse rotto?
Un programma 7 è normalmente solo un numero, ma può contenere spazi bianchi, suddividendolo in più numeri. Questa presentazione consiste quindi di due numeri (che sono implicitamente concatenati dall'interprete 7), e allo stesso modo il programma accetta due numeri come input, tramite input standard. (I "31 caratteri" nell'intestazione sono la lunghezza totale dei due numeri, più un carattere di spazio bianco di separazione; le cifre che compongono i numeri sono interpretate come ottali quando usate come programma, ma decimali quando usate come input, e sono le cifre che sono le stesse nei due casi, non i numeri reali. Nota che è irrilevante sia quando trattato come un programma, sia quando trattato come un input, sia che tu li separi con uno spazio o una nuova riga; spero che non non invalidare l'invio.)
L'output previsto è il seguente numero (espresso qui in decimale, poiché è il formato di output utilizzato dall'interprete 7):
238363505302130098723162537059
Nota che l'interprete 7 collegato dal wiki di Esolang memorizza internamente numeri in unario, il che significa che è improbabile che tu abbia memoria sufficiente per eseguire effettivamente il programma su se stesso per vedere cosa fa. Ho verificato il programma elaborando manualmente il suo comportamento e testandolo su piccoli input per verificare che facesse quello che mi aspettavo. Un approccio alternativo sarebbe quello di scrivere un interprete che utilizza un metodo più efficiente per memorizzare i numeri.
Evitare le crepe qui è stato una vera seccatura, ma ora sono finalmente soddisfatto che nessun altro numero diverso da quelli del programma stesso sia in grado di produrre 238363505302130098723162537059 come output. ( MODIFICA 1 settimana dopo: potrei essermi sbagliato, a seconda di come interpreti la domanda; vedi sotto ) .
Soluzione
Il programma originale era:
711170237403706
111723603700633
Questo programma richiede due numeri X e y , e calcola il risultato dell'espressione 3 x y- y- 2 (cioè y( 3 x - 1 ) - 2 ). Se eseguiamo questo calcolo su x = 711170237403706 e y= 111723603700633 , otteniamo un risultato di 238363505302130098723162537059 come richiesto .
Si pensava che nessun altro input avrebbe dato il risultato desiderato perché:
L'ingresso deve essere scelto in modo tale che y( 3 x - 1 ) - 2 = 238363505302130098723162537059 , ovvero y( 3 x - 1 ) = 238363505302130098723162537061 (aggiungendo 2 su entrambi i lati). Questo numero è un semiprime, con solo due fattori: 111723603700633 e 2133510712211117 . Solo uno di questi numeri, 2133510712211117 , può essere espresso nella forma 3 x - 1 (dando ( 3 × 711170237403706 ) - 1 = 2133510712211117 ). Quindi possiamo identificare in modo univoco quale numero èX e quale èy , il che significa che funziona solo un input.
Tuttavia, a seconda di come si interpreta la domanda, potrebbe esserci un secondo input che produce l'output desiderato (invalidando così questa soluzione):
113 x - 1X79454501767376699574387512354189) che non sono nel set di caratteri per 7 programmi. Quindi, se l'input è limitato allo stesso set di caratteri del programma, questa soluzione è valida; ma se è consentito l'input contenente caratteri esterni al set di caratteri del programma, questa soluzione non è valida.
Spiegazione
Ecco come funziona la soluzione prevista:
711170237403706 111723603700633
7 7 7 Separatori di elementi stack
111 023 403706 111723603700633 Elementi di stack iniziali
111 Numero 3, in unario
023 I / O DSL per "inserire un numero"
403706 111723603700633 Programma principale
(Implicito: esegue una copia dell'elemento principale del programma, preservando l'originale)
40 Scambia {023} sopra {programma}, sfuggendolo
3 I / O usando {023}; pop {programma}
0 I / O: numerico
23 Immettere un numero, copiando {111} tante volte
706 Aggiungi "6" al numero (decrementandolo)
11 Spingere due elementi stack vuoti
17236 Push a stack element "23" (senza caratteri di escape)
0 Esci {23}, consumando un elemento vuoto
3 I / O usando {23}; pop {l'elemento sotto}
23 Copia l' input della parte superiore dello stack più volte
7006 Aggiungi "66" (ovvero sottrai 2)
3 Output {come numero}
3 Uscire dal programma (a causa dello stack basso)170666123453123451234512345