Wyjście N w bazie -10

18

Wyzwanie:

W wybranym języku programowania zaakceptuj liczbę całkowitą jako dane wejściowe w bazie 10 i wyślij ją w notacji ujemnej , znanej również jako baza -10

Przykładowy algorytm:

Jest to algorytm pobrany z Wikipedii w celu konwersji bazy 10 na dowolną bazę ujemną w 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

Oczywiście możesz użyć dowolnego algorytmu, o ile spełnia on wyzwanie

Przykładowe wejścia / wyjścia:

Wejście:

12

Wynik:

192

Inny przykład:

Wejście:

2048

Wynik:

18168

Reguła:

Nie wolno używać żadnych wbudowanych metod, które rozwiązują ten problem, które istnieją w języku programowania

To jest golf golfowy , więc wygrywa najkrótszy kod!

P. Ktinos
źródło
3
Myślę, że chcesz jedynie wymyślić wbudowane rozwiązania, które rozwiązują ten specyficzny problem, a nie wszystkie istniejące builltyny.
Denker,
Powiązany OEIS: A039723
devRicher
6
Powinieneś dodać negatywny przypadek testowy.
xnor
1
Czy [0, 1, 8, 1, 6, 8]byłby akceptowalny wynik dla danych wejściowych 2048?
Dennis
2
Warto o tym wspomnieć w specyfikacji. Twój kod VB wygląda tak, jakby zwraca listę.
Dennis

Odpowiedzi:

12

JavaScript (ES6), 51 45 37 bajtów

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

Przypadki testowe

Arnauld
źródło
Czy istnieje odwołanie do tego algorytmu?
dfernan
@dfernan Naprawdę nie wiem. Jest to wynik kilku iteracji golfowych, zaczynając od sugerowanego algorytmu.
Arnauld
5

Japt , 11 bajtów

_ì ìAn)¥U}a

Przetestuj online!

Wyjaśnienie

_ì ì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
ETHprodukcje
źródło
4

Partia, 82 bajty

@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

Podział partii jest obcinany do zera, więc jeśli reszta jest ujemna, muszę dodać 1 (a także dodać 10 do reszty), aby to zrekompensować. Cyfry są następnie kumulowane, %2aż wynik wyniesie zero.

Neil
źródło
4

Galaretka , 9 bajtów

Dḅ-10=ð1#

Jest to odwrotność brutalnej siły odwrotna do liczby całkowitej ujemnej.

Wypróbuj online!

Jak to działa

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.
Dennis
źródło
3

Pyth - 9 bajtów

Niech to ma płaczące emoji.

fqQijT;_;

Pakiet testowy .

Maltysen
źródło
1
Dlaczego płaczesz?? Jesteś na równi!
NoOneIsHere
Ponieważ on ma płaczące emoji na odpowiedzi Pyth.
user75200
3

Python 3, 35 bajtów

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

Port Pythona w algorytmie Arnaulda .

Alternatywnie, dla 102 bajtów funkcja ogólna wykorzystująca algorytm oryginalnego postu:

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 ""
dfernan
źródło
Python nie pozwala zadeklarować domyślnego wejścia, które zależy od innego wejścia.
xnor
@xnor To działa na mojej instalacji Python: Python 3.5.1 (v3.5.1:37a07cee5969, Dec 5 2015, 21:12:44).
dfernan
Jak to nazywasz? Robię to (w 3.5.2). Czy mógłbyś zadeklarować klub ngdzie indziej w kodzie?
xnor
1
Wygląda dobrze, niezła poprawa! Nie potrzebujesz już parenów wokół wywołania funkcji.
xnor
1
Ostatni mogę wyjaśnić jako pierwszeństwo operatora. -n//10robi -(n//10): neguje n, a następnie dzieli piętro przez 10, co zaokrągla w dół w kierunku ujemnej nieskończoności, a nie 0. Przeciwnie, 0-n//10robi 0-(n//10), który najpierw dzieli piętro przez 10, a następnie neguje. Z jakiegokolwiek powodu Python traktuje jednoznaczną negację z wyższym priorytetem niż binarny minus. Zobacz tę tabelę pierwszeństwa . W golfa spotkałem już tę samą sytuację.
xnor
2

Galaretka , 10 bajtów

:⁵NµÐĿ%⁵ṚḌ

Wypróbuj online!

tło

Przekształcanie listy nieujemnych z podstawy b na liczbę całkowitą można osiągnąć przez złożenie w lewo za pomocą funkcji x, y ↦ bx + y . Aby przekonwertować i liczbę całkowitą na bazę b , musimy po prostu odwrócić tę funkcję, tj. Znaleźć wyrażenie dla bx + y ↦ x, y .

W Pythonie (i przez rozszerzenie Jelly) wynik działania modulo jest zawsze nieujemny, więc (bx + y)% | b | = y .

Również dzielenie liczb całkowitych zawsze zaokrągla w dół, upewniając się, że jeśli q = n / d i r = n% d , równość n = qd + r . Jeśli s jest znakiem b , to (sx) | b | + y = bx + y , więc sx = (bx + y) / | b | i dlatego s ((bx + y) / | b |) = x.

Jak to działa

:⁵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.
Dennis
źródło
2

SimpleTemplate , 147 bajtów

To jest język szablonów, nad którym pracuję.
W żadnym wypadku nie jest przeznaczony do gry w golfa.
Brakuje nawet kompletnej podstawowej matematyki, ale umożliwia bezpośrednie pisanie małych fragmentów PHP.
To rozwiązuje ten problem.

{@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}

To rzuca wiele ostrzeżeń.
Kod jest „kompilowany” do PHP.

Nie golfowany, z białymi miejscami na śmieci:

{@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}

W razie potrzeby można dodać wyjaśnienie krok po kroku, ale uważam, że jest to dość proste.


Zrzeczenie się :

Ostatnie zatwierdzenie, w momencie pisania tej odpowiedzi, miało miejsce 01.01.2017, 20:36 UTC + 00: 00.
To działa na commit 140e56ff38f45fa4fd40fd3ec382094e707b1bad od 23:27 UTC + 00: 00.
To jest wersja używana do uruchomienia tej odpowiedzi.

Kod PHP jest dostępny w dniu https://raw.githubusercontent.com/ismael-miguel/SimpleTemplate/140e56ff38f45fa4fd40fd3ec382094e707b1bad/SimpleTemplate.php

Polecam uruchomić to z ostatnią wersją, ale ta działa dobrze dla tego pytania.


Jak biegać?

Utwórz plik z kodem i uruchom go w następujący sposób:

<?php

    include 'path/to/SimpleTemplate.php';

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

    $template->render(<number>);

Wartość zostanie wyświetlona na ekranie.

Ismael Miguel
źródło
2

PHP, 71 67 bajtów

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

lub 62 bajty dla portu odpowiedzi Arnaulda :

function n($n){return$n?$n%10+(($k=$n<0)+f($k-$n/10|0))*10:0;}
Tytus
źródło
1

Mathematica, 49 bajtów

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

Definiuje funkcję dprzyjmującą jeden argument liczby całkowitej i zwracającą ciąg znaków. Algorytm rekurencyjny - wygląda jak ten sam algorytm w odpowiedzi Arnaulda . Działa również na liczbach ujemnych. (Zwraca pusty ciąg „0”, jeśli wartość wejściowa wynosi 0.) Uwaga dla golfistów Mathematica: używanie ±wymaga jednego dodatkowego zestawu nawiasów, a zatem nie wydaje się być krótszy.

Greg Martin
źródło
0

C, 68 bajtów

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

Zamiast wydrukować wynikową liczbę, program po prostu ją zwraca. Oczywiście jest to odpowiedź Arnaulda , jedyną różnicą jest to, że ponieważ C nie jest językiem interpretowanym, czułem, że powinienem uczynić go pełnym programem, a nie tylko funkcją.

Etaoin Shrdlu
źródło
1
Jak to się zwraca? fwychodzi poza zakres, gdy funkcja powraca, chyba że jestem naprawdę głupi.
dniu
@abligh Nie jesteś naprawdę głupi, tylko GCC jest naprawdę głupi. Jeśli funkcja nieważna zakończy się bez powrotu, po prostu użyje ostatniego przypisania.
Etaoin Shrdlu
0

Rdza, 88 bajtów

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}}

To tylko rekurencyjna wersja algorytmu podanego w pytaniu.

bearbear2k
źródło