sfondo
La maggior parte delle persone qui dovrebbe avere familiarità con alcuni sistemi di base interi: decimale, binario, esadecimale, ottale. Ad esempio nel sistema esadecimale, un numero abc.de 16 rappresenterebbe
a*16^2 + b*16^1 + c*16^0 + d*16^-1 + e*16^-2
Tuttavia, si possono anche usare basi non intere, come numeri irrazionali. Una volta che tale base usa il rapporto aureo φ = (1 + √5) / 2 ≈ 1,618 ... . Questi sono definiti in modo analogo alle basi intere. Quindi un numero abc.de φ (dove da a a e sono numeri interi) rappresenterebbe
a*φ^2 + b*φ^1 + c*φ^0 + d*φ^-1 + e*φ^-2
Nota che in linea di principio una qualsiasi delle cifre potrebbe essere negativa (anche se non ci siamo abituati): rappresenteremo una cifra negativa con un segno iniziale ~
. Ai fini di questa domanda ci limitiamo alle cifre da ~9
a 9
, in modo da poter scrivere inequivocabilmente un numero come una stringa (con tilde in mezzo). Così
-2*φ^2 + 9*φ^1 + 0*φ^0 + -4*φ^-1 + 3*φ^-2
sarebbe scritto come ~290.~43
. Chiamiamo un tale numero un numero phinary .
Un numero phinary può sempre essere rappresentato in forma standard , il che significa che la rappresentazione utilizza solo cifre 1
e 0
, senza contenere da 11
nessuna parte, e con un segno meno facoltativo per indicare che l'intero numero è negativo. (È interessante notare che ogni numero intero ha una rappresentazione finita unica in forma standard.)
Le rappresentazioni che non sono in forma standard possono sempre essere convertite in forma standard usando le seguenti osservazioni:
- 011 φ = 100 φ (perché φ 2 = φ + 1)
- 0200 φ = 1001 φ (perché φ 2 + 1 / φ = 2φ)
- 0 ~ 10 φ = ~ 101 φ (perché φ - 1 / φ = 1)
Inoltre:
- Se la cifra più significativa è
~1
(con il resto del numero in forma standard), il numero è negativo e possiamo convertirlo in forma standard scambiando tutto1
e~1
, anteponendo un segno meno e applicando nuovamente le tre regole precedenti fino a quando ottenere il modulo standard.
Ecco un esempio di tale normalizzazione di (sto usando spazi aggiuntivi per cifre positive, per mantenere allineata ogni posizione delle cifre):
1~3.2~1φ
1~3. 2~1φ Rule:
= 0~2. 3~1φ (3)
= ~1~1. 4~1φ (3)
= ~1 0 0. 4~1φ (3)
= ~1 0 0. 3 0 1φ (3)
= ~1 0 1. 1 0 2φ (2)
= ~1 1 0. 0 0 2φ (1)
= ~1 1 0. 0 1 0 0 1φ (2)
= - 1~1 0. 0~1 0 0~1φ (4)
= - 0 0 1. 0~1 0 0~1φ (3)
= - 0 0 1.~1 0 1 0~1φ (3)
= - 0 0 0. 0 1 1 0~1φ (3)
= - 0 0 0. 0 1 1~1 0 1φ (3)
= - 0 0 0. 0 1 0 0 1 1φ (3)
= - 0 0 0. 0 1 0 1 0 0φ (1)
Cedendo .-0.0101φ
Per ulteriori letture, Wikipedia ha un articolo molto informativo sull'argomento.
La sfida
Quindi, o altrimenti, scrivere un programma o una funzione che, data una stringa che rappresenta un numero phinary (come descritto sopra), produce la sua forma standard, senza zeri iniziali o finali. L'input non contiene necessariamente il punto phinary, ma conterrà sempre la cifra rimasta (quindi no .123
). L'output deve sempre includere il punto phinary e almeno una cifra alla sua sinistra.
È possibile accettare input tramite STDIN, ARGV o argomento della funzione e restituire il risultato o stamparlo su STDOUT.
È possibile utilizzare un algoritmo diverso rispetto alla procedura sopra indicata, purché sia in linea di principio corretto ed esatto per input arbitrari (validi), ovvero gli unici limiti che potrebbero potenzialmente interrompere l'implementazione dovrebbero essere limitazioni tecniche come la dimensione del built-in tipi di dati o la RAM disponibile. Ad esempio, non è consentito valutare l'input come un numero in virgola mobile e quindi selezionare avidamente le cifre, poiché si potrebbero trovare input per i quali imprecisioni in virgola mobile porterebbero a risultati errati.
Questo è il codice golf, vince la risposta più breve (in byte).
Casi test
Input Output
1 1.
9 10010.0101
1.618 10000.0000101
1~3.2~1 -0.0101
0.~1021 0. (or -0.)
105.~2 1010.0101
~31~5.~1 -100000.1001