Uscita N in base -10


18

Sfida:

Nel linguaggio di programmazione di tua scelta, accetta un numero intero come input nella base 10 e lo emette nella notazione negativa , che è anche nota come base -10

Algoritmo di esempio:

Questo è un algoritmo tratto da Wikipedia per convertire la base 10 in qualsiasi base negativa in VB.NET :

Function toNegativeBase(Number As Integer , base As Integer) As System.Collections.Generic.List(Of Integer)

    Dim digits As New System.Collections.Generic.List(Of Integer)
    while Number <> 0
        Dim remainder As Integer= Number Mod base
        Number = CInt(Number / base)

        if remainder < 0 then
            remainder += system.math.abs(base)
            Number+=1
        end if

        digits.Insert(0, remainder)
    end while

    return digits
end function

Ovviamente, puoi usare qualsiasi algoritmo, purché soddisfi la sfida

Esempi di ingressi / uscite:

Ingresso:

12

Produzione:

192

Un altro esempio:

Ingresso:

2048

Produzione:

18168

Regola:

Non è necessario utilizzare alcun metodo integrato che risolva questo problema esistente nel linguaggio di programmazione

Questo è un codice-golf , quindi vince il codice più corto!


3
Penso che tu voglia rinunciare solo ai built-in che risolvono questo problema specifico e non tutti i builltins esistenti.
Denker,

OEIS correlato: A039723
DevRicher,

6
È necessario aggiungere un caso di test negativo.
xnor

1
Sarebbe [0, 1, 8, 1, 6, 8]un output accettabile per l'input 2048?
Dennis,

2
Potrebbe valere la pena menzionarlo nelle specifiche. Il tuo codice VB sembra restituire un elenco.
Dennis,

Risposte:


12

JavaScript (ES6), 51 45 37 byte

f=n=>n&&n%10+((k=n<0)+f(k-n/10|0))*10

Casi test


C'è un riferimento per questo algoritmo?
Dfernan,

@dfernan Non lo so davvero. Questo è il risultato di diverse iterazioni del golf, a partire dall'algoritmo suggerito.
Arnauld,

5

Japt , 11 byte

_ì ìAn)¥U}a

Provalo online!

Spiegazione

_ì ìAn)¥U}a  // Implicit: U = input integer, A = 10
_        }a  // Return the smallest non-negative integer Z that returns a truthy value
             // when run through this function:
 ì           //   Convert Z to a list of its base 10 digits.
   ìAn)      //   Interpret this as a list of base -10 digits and convert to a base 10 integer.
       ¥U    //   Return (the result == U).
             // Implicit: output result of last expression

4

Lotto, 82 byte

@set/a"d=%1%%10,n=%1/-10-(a=d>>4),d-=a*10
@if %n% neq 0 %0 %n% %d%%2
@echo %d%%2

La divisione di Batch si tronca a zero, quindi se il resto è negativo devo aggiungere 1 (e anche aggiungere 10 al resto) per compensare. Le cifre vengono quindi accumulate %2fino a quando il risultato diventa zero.


4

Gelatina , 9 byte

Dḅ-10=ð1#

Questa è una forza bruta inversa della conversione da negativo a intero.

Provalo online!

Come funziona

Dḅ-10=ð1#  Main link. Argument: n

      ð    Combine the links to the left into a chain and start a new, dyadic
           chain with left and right argument n.
       1#  Repeatedly execute the chain with left argument k = n, n + 1, ... and
           right argument n until the first match is found.
D          Convert k to decimal.
 ḅ-10      Convert the result from base -10 to integer.
     =     Compare the result with n.


3

Python 3, 35 byte

f=lambda n:n and n%10+f(0-n//10)*10

Porta Python dell'algoritmo di Arnauld .

In alternativa, per 102 byte una funzione generica che utilizza l'algoritmo del post originale:

def f(n,b,r=0):
 if n:
  r,n=n%b,n//b
  if r<0:r+=abs(b);n+=1
  return f(n,b,r)+str(r)
 else:return ""

Python non ti consente di dichiarare un input predefinito che dipende da un altro input.
xnor

@xnor Funziona sulla mia installazione di Python: Python 3.5.1 (v3.5.1:37a07cee5969, Dec 5 2015, 21:12:44).
Dfernan,

Come lo chiami? Sto facendo questo (in 3.5.2). Potresti dichiarare ko naltrove nel codice?
xnor

1
Sembra buono, bel miglioramento! Non hai più bisogno delle parentesi attorno alla chiamata della funzione.
xnor

1
L'ultimo che posso spiegare come precedenza dell'operatore. -n//10fa -(n//10): nega n, quindi dividi piano per 10, che si arrotonda verso l'infinito negativo, non 0. Al contrario, 0-n//10fa 0-(n//10), che per primo divide il piano per 10, quindi nega. Per qualsiasi motivo, Python tratta la negazione unaria con una precedenza superiore rispetto al meno binario. Vedi questa tabella di precedenza . Ho incontrato questa stessa situazione prima nel golf.
xnor

2

Gelatina , 10 byte

:⁵NµÐĿ%⁵ṚḌ

Provalo online!

sfondo

La conversione di un elenco di non negativi dalla base b all'intero può essere ottenuta piegando a sinistra con la funzione x, y ↦ bx + y . Per convertire e integer in base b , dobbiamo semplicemente invertire quella funzione, cioè trovare un'espressione per bx + y ↦ x, y .

In Python (e, per estensione, Jelly), il risultato dell'operatore modulo è sempre non negativo, quindi (bx + y)% | b | = y .

Inoltre, la divisione intera viene sempre arrotondata per difetto, assicurandosi che se q = n / d e r = n% d , l'uguaglianza n = qd + r vale. Se s è il segno di b , quindi (sx) | b | + y = bx + y , quindi sx = (bx + y) / | b | e, quindi, s ((bx + y) / | b |) = x.

Come funziona

:⁵NµÐĿ%⁵ṚḌ  Main link. Argument: n

   µ        Combine the links to the left into a monadic chain.
    ÐĿ      Iteratively apply the chain until the results are no longer unique.
            Collect all unique results in an array.
:⁵            Divide the previous return value (initially n) by 10.
  N           Negate; multiply the result by -1.
      %⁵    Take all results modulo 10.
        Ṛ   Reverse the results.
         Ḍ  Convert from base 10 to integer.

2

SimpleTemplate , 147 byte

Questo è un linguaggio modello su cui ho lavorato.
Non è pensato per il golf.
Manca anche la matematica di base completa, ma consente di scrivere direttamente piccoli frammenti di PHP.
Questo risolve questo problema.

{@setN argv.0}{@whileN}{@setM N}{@php$DATA[N]=($DATA[M]/-10)|0;$DATA[R]=$DATA[M]%-10}{@ifR is lower0}{@incby10 R}{@incN}{@/}{@setD R,D}{@/}{@echoD}

Questo genera un sacco di avvertimenti.
Il codice viene "compilato" in PHP.

Ungolfed, con spazio bianco spazzatura:

{@set no argv.0}
{@while no}
    {@set temp_no no}
    {@php $DATA["no"] = ($DATA["temp_no"] / -10) | 0}
    {@php $DATA["remainder"] = $DATA["temp_no"] % 10}

    {@if remainder is lower than 0}
        {@inc by 10 remainder}
        {@inc no}
    {@/}
    {@set digits remainder, digits}
{@/}
{@echo digits}

Se necessario, è possibile aggiungere una spiegazione passo-passo, ma credo che sia piuttosto semplice.


disconoscimento :

L'ultimo commit, al momento della stesura di questa risposta, è stato il 07/01/2017 20:36 UTC + 00: 00.
Funziona su commit 140e56ff38f45fa4fd40fd3ec382094e707b1bad dal 06-01-2017 alle 23:27 UTC + 00: 00.
Questa è la versione utilizzata per eseguire questa risposta.

Il codice PHP è disponibile su https://raw.githubusercontent.com/ismael-miguel/SimpleTemplate/140e56ff38f45fa4fd40fd3ec382094e707b1bad/SimpleTemplate.php

Consiglio di eseguirlo con l'ultima versione, ma quello funziona bene per questa domanda.


Come correre?

Crea un file con il codice ed eseguilo in questo modo:

<?php

    include 'path/to/SimpleTemplate.php';

    $template = new SimpleTemplate('<code>');

    $template->render(<number>);

Il valore verrà quindi visualizzato sullo schermo.


2

PHP, 71 67 byte

for(;$n=&$argn;$n=$g-$n/10|0)$d=($r=$n%10)+10*($g=$r<0).$d;echo+$d;

o 62 byte per una porta della risposta di Arnauld :

function n($n){return$n?$n%10+(($k=$n<0)+f($k-$n/10|0))*10:0;}

1

Mathematica, 49 byte

d@0="";d@n_:=d[-Floor[n/10]]<>ToString[n~Mod~10];

Definisce una funzione dche accetta un argomento intero e restituisce una stringa. Un algoritmo ricorsivo: sembra lo stesso algoritmo nella risposta di Arnauld . Funziona anche su numeri negativi. (Restituisce la stringa vuota entro "0" se l'ingresso è 0.) Nota per i golfisti Mathematica: l'utilizzo ±richiede un set di parentesi extra e quindi non sembra essere più breve.


0

C, 68 byte

main(f,a){f&&scanf("%d",&a);f=a?a%10+((f=a<0)+main(0,f-a/10))*10:0;}

Invece di stampare il numero risultante, il programma lo restituisce. Ovviamente questa è la risposta di Arnauld , l'unica differenza è che dal momento che C non è un linguaggio interpretato, mi sono sentito come se dovessi renderlo un programma completo anziché solo una funzione.


1
Come lo sta restituendo? fesce dall'ambito quando la funzione ritorna a meno che non sia davvero stupido.
circa l'

@abligh Non sei davvero stupido, è solo GCC ad essere davvero stupido. Se una funzione non nulla termina senza ritorno, utilizzerà semplicemente l'ultima assegnazione.
Etaoin Shrdlu,

0

Ruggine, 88 byte

fn g(mut n:i32)->i32{let mut r=n%10;n/=-10;if r<0{r+=10;n+=1;}if n==0{r}else{r+g(n)*10}}

Questa è solo una versione ricorsiva dell'algoritmo fornito nella domanda.

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.