Il convertitore di numeri dell'edificio base del professore


12

Il matto professore di matematica vuole codificare tutte le loro ricerche usando un sistema sicuro di volgere anche il più furbo dei suoi concorrenti!

A tal fine, il professore ha deciso di cambiare la base non solo del numero che sta scrivendo, ma di ogni singola cifra in quel numero, in base al luogo in cui si trova la cifra (contando da destra, a partire da 1). Per esempio:

Il numero 0 ha una cifra, quindi è rappresentato in base 1: 0

Il numero 1 avrebbe una cifra nella base dieci, ma nel sistema del nostro professore non è valido. Il primo posto è riservato solo alle cifre della base 1! Ciò significa che deve essere portato al secondo posto dove è consentita la base 2: 10

Il numero 2 richiede almeno la base 3 per essere scritto: 100

Ma ora il numero 3 può essere scritto cambiando la cifra in secondo luogo: 110

e 4 in questo modo: 200

Ecco alcuni altri esempi per aiutarti a ottenere l'idea:

5: 210

6: 1000

7 1010

8: 1100

9: 1110

10: 1200

11: 1210

12: 2000

13: 2010

14: 2100

15: 2110

16: 2200

17: 2210

18: 3000

Usando questo sistema le note del professore non avranno alcun senso per nessuno tranne loro, e potranno finalmente conquistare il mondo !!!! dormire bene la notte.

Naturalmente il metodo di codifica deve essere il più oscuro possibile.


Il tuo compito è scrivere 10 frammenti di codice, ognuno dei quali rappresenta una delle 10 cifre di base

0 1 2 3 4 5 6 7 8 9

che se combinato nell'ordine del numero da convertire produrrà un numero scritto nel sistema di numerazione diabolica del professore (il metodo di output può essere di tua scelta ma deve essere un numero leggibile dall'uomo usando solo le cifre 0-9)

Ad esempio se i miei frammenti sono:

0 = SCIMMIA 1 = ESEMPIO, 2 = CODICE, 3 = GOLF e 9 = TEST

poi

19 = EXAMPLETEST -> 3010

20 = CODEMONKEY -> 3100

21 = ESEMPIO CODICE -> 3110

22 = CODICE CODICE -> 3200

23 = CODEGOLF -> 3210

Non è necessario prendere in considerazione numeri di input con più di 10 cifre o numeri negativi, anche se se si desidera scrivere il codice per cifre aggiuntive si otterranno ulteriori complimenti. Questo è il golf del codice, quindi la risposta più breve (usando i totali di byte combinati di tutti i frammenti) vince e le scappatoie standard non sono consentite.

ADDENDUM: Prima che qualcuno inizi a stabilire se 0 è la rappresentazione corretta di 0 nella base 1, vorrei ricordare che questo professore è pazzo. Convivici.


1
Nota: il sistema del professore è anche noto come sistema numerico fattoriale .
ETHproductions


@ETHproductions Non ho mai detto che la codifica del professore fosse buona .
Joe Bloggs,

@KritixiLithos Grazie per quello! Lo stavo cercando come conferma.
Joe Bloggs,

4
Benvenuto in PPCG, a proposito :-)
ETHproductions

Risposte:


1

Mathematica (ambiente REPL), 858 byte totali

Ecco lo snippet di codice a 86 byte per la cifra 9:

1;ValueQ@a||(a=0;b=3);a=10a+9;b++;FromDigits[a~IntegerDigits~MixedRadix@Range[b,1,-1]]

Gli snippet di codice per le cifre da 1 a 8 sono identici, tranne per il fatto che il 9 è sostituito dalla cifra appropriata. Lo snippet di codice per la cifra 0 è identico, tranne che +9viene semplicemente eliminato.

a~IntegerDigits~MixedRadix@Range[b,1,-1]calcola l'elenco delle cifre del sistema numerico fattoriale di a, purché bsia grande almeno quanto il numero di cifre; FromDigitsconverte quell'elenco di cifre in un numero intero base-10 normale ai fini dell'output. (Se uno degli elementi dell'elenco supera 9, succede qualcosa di divertente.)

Nell'ambiente REPL di Mathematica, i calcoli possono essere terminati con punto e virgola per sopprimere l'output; quindi verrà visualizzato solo l'ultimo output in una catena separata da punto e virgola. Definiamo in modo ricorsivo l'intero adesignato dagli snippet e anche un limite bal numero di cifre del sistema fattoriale necessarie. Il comando ValueQ@a||(a=0;b=3)inizializza queste variabili se non sono inizializzate (vale a dire nel primo frammento) e le lascia solo in caso contrario; quindi a=10a+9;b++esegue la ricorsione. Infine, l'iniziale 1;è per incollare insieme i frammenti: moltiplica i calcoli intermedi per 1 (che comunque non vediamo mai).


Mi piace l'abuso di punto e virgola.
Joe Bloggs,

0

Goruby, 790 810 980

Ecco un secondo tentativo, basandosi sul fatto che, praticamente in qualsiasi shell, la stampa di un ritorno a capo ("\ r") senza una nuova riga ("\ n") sovrascriverà la riga precedentemente stampata, garantendo in definitiva che solo l'ultimo bit stampato (ovvero, il risultato finale) viene mostrato.

Questo deve essere eseguito in una shell, ad es ruby name_of_file.rb.

Funziona con numeri positivi di lunghezza illimitata.

Il codice è dieci copie dello snippet di seguito, con X(in alto) sostituito con le cifre da 0-9, una per snippet.

->*t{n,d,o="X#{t}".toi,0,''
dw{n,r=n.dm d+=1;o.pr r.ts;n>0}
$>.fu
pr"\r",o
o}

Cioè, lo snippet che rappresenta (ad esempio) 8 dovrebbe apparire come:

->*t{n,d,o="8#{t}".toi,0,''
dw{n,r=n.dm d+=1;o.pr r.ts;n>0}
$>.fu
pr"\r",o
o}

La sfida afferma che gli snippet devono essere "combinati" per creare un numero a più cifre, quindi, per aggiungere una cifra a un numero, è sufficiente posizionarlo tra parentesi quadre alla fine del numero. Pertanto, il numero 103 (in decimale) sarebbe:

->*t{n,d,o="1#{t}".toi,0,''
dw{n,r=n.dm d+=1;o.pr r.ts;n>0}
$>.fu
pr"\r",o
o}[->*t{n,d,o="0#{t}".toi,0,''
dw{n,r=n.dm d+=1;o.pr r.ts;n>0}
$>.fu
pr"\r",o
o}[->*t{n,d,o="8#{t}".toi,0,''
dw{n,r=n.dm d+=1;o.pr r.ts;n>0}
$>.fu
pr"\r",o
o}[]]]

Intendi il numero 108.
user75200
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.