Вихід N в базі -10


18

Виклик:

На обраній вами мові програмування прийміть ціле число як вхід у базі 10 та виведіть його у позначці negadecimal , яка також відома як base -10

Приклад алгоритму:

Це алгоритм, взятий з Вікіпедії для перетворення бази 10 в будь-яку негативну базу в 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

Очевидно, ви можете використовувати будь-який алгоритм, якщо він виконує завдання

Приклади входів / виходів:

Вхід:

12

Вихід:

192

Інший приклад:

Вхід:

2048

Вихід:

18168

Правило:

Ви не повинні використовувати жодних вбудованих методів, які вирішують цю проблему, що існують у вашій мові програмування

Це код-гольф , тому найкоротший код виграє!


3
Я думаю, ви хочете заборонити лише вбудовані модулі, які вирішують цю специфічну проблему, а не всі існуючі буллінтини.
Денкер

Пов'язані OEIS: A039723
devRicher

6
Вам слід додати негативний тестовий випадок.
xnor

1
Буде [0, 1, 8, 1, 6, 8]прийнятним вихід для введення 2048?
Денніс

2
Це, можливо, варто згадати у специфікації. Ваш код VB виглядає так, що він повертає список.
Денніс

Відповіді:


12

JavaScript (ES6), 51 45 37 байт

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

Тестові справи


Чи є посилання на цей алгоритм?
dfernan

@dfernan я насправді не знаю. Це результат декількох ітерацій з гольфу, починаючи з запропонованого алгоритму.
Арнольд

5

Japt , 11 байт

_ì ìAn)¥U}a

Перевірте це в Інтернеті!

Пояснення

_ì ì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

Пакет, 82 байти

@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

Поділ партії скорочується до нуля, тому якщо залишок від'ємний, мені потрібно додати 1 (а також додати 10 до залишку), щоб компенсувати. Потім цифри накопичуються, %2поки результат не стане нульовим.


4

Желе , 9 байт

Dḅ-10=ð1#

Це обернена сила зворотного перетворення negadecimal в ціле число.

Спробуйте в Інтернеті!

Як це працює

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 байт

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

Порт Python алгоритму Арнольда .

Крім того, для 102 байтів загальна функція, що використовує алгоритм вихідної публікації:

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 не дозволяє оголосити введення за замовчуванням, яке залежить від іншого введення.
xnor

@xnor Вона працює на моїй установки Python: Python 3.5.1 (v3.5.1:37a07cee5969, Dec 5 2015, 21:12:44).
dfernan

Як ти це називаєш? Я роблю це (в 3.5.2). Ви можете декларувати kабо nдеінде в коді?
xnor

1
Виглядає добре, приємне поліпшення! Вам більше не потрібні паролі навколо виклику функції.
xnor

1
Останній я можу пояснити як пріоритет оператора. -n//10робить -(n//10): заперечує n, потім підлогу ділить на 10, яка округляє до негативної нескінченності, а не 0. На противагу цьому 0-n//10робить 0-(n//10), яка перший поверх ділить на 10, потім заперечує. З будь-якої причини Python трактує одинарне заперечення з вищим пріоритетом, ніж бінарний мінус. Дивіться цю таблицю пріоритетів . Я зіткнувся з такою ж ситуацією і раніше, коли займався гольфом.
xnor

2

Желе , 10 байт

:⁵NµÐĿ%⁵ṚḌ

Спробуйте в Інтернеті!

Фон

Перетворення списку невід’ємних з бази b в ціле число може бути досягнуто складанням ліворуч за допомогою функції x, y ↦ bx + y . Щоб перетворити ціле число на базу b , ми повинні просто змінити цю функцію, тобто знайти вираз для bx + y ↦ x, y .

У Python (і, за розширенням, Jelly) результат оператора модуля завжди негативний, тому (bx + y)% | b | = у .

Крім того, ціле ділення завжди округляється вниз, переконуючись, що якщо q = n / d і r = n% d , то дорівнює рівність n = qd + r . Якщо s - знак b , то (sx) | b | + y = bx + y , тому sx = (bx + y) / | b | і, отже, s ((bx + y) / | b |) = x.

Як це працює

:⁵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 байт

Це мова шаблонів, над якою я працював.
Ні в якому разі це не призначено для гри в гольф.
Навіть не вистачає повної базової математики, але це дозволяє писати крихітні фрагменти PHP безпосередньо.
Це вирішує проблему.

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

Це кидає купу попереджень.
Код "компілюється" в PHP.

Нерозпущений, з пробілом сміття:

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

Якщо потрібно, може бути додано поетапне пояснення, але я вважаю, що це досить просто.


Відмова :

Остання фіксація станом на час написання цієї відповіді була 2017-01-07 20:36 UTC + 00: 00.
Це працює на фіксації 140e56ff38f45fa4fd40fd3ec382094e707b1bad з 2017-01-06 23:27 UTC + 00: 00.
Це версія, яка використовується для виконання цієї відповіді.

PHP-код доступний на https://raw.githubusercontent.com/ismael-miguel/SimpleTemplate/140e56ff38f45fa4fd40fd3ec382094e707b1bad/SimpleTemplate.php

Я рекомендую запустити цю програму з останньою версією, але ця проблема чудово працює в цьому питанні.


Як бігати?

Створіть файл із кодом та запустіть його так:

<?php

    include 'path/to/SimpleTemplate.php';

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

    $template->render(<number>);

Значення буде відображено на екрані.


2

PHP, 71 67 байт

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

або 62 байти для відповіді порту Арнальда :

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

1

Математика, 49 байт

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

Визначає функцію, яка dбере один цілий аргумент і повертає рядок. Рекурсивний алгоритм - схожий на той же алгоритм у відповіді Арнальда . Це працює і за від’ємними числами. (Він повертає порожній рядок intsead "0", якщо вхід дорівнює 0.) Примітка для гравців у гольф Mathematica: для використання ±потрібен один додатковий набір дужок, і, таким чином, здається, він не буде коротшим.


0

C, 68 байт

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

Замість друку отриманого номера програма просто повертає його. Очевидно, що це відповідь Арнальда , єдина відмінність полягає в тому, що оскільки C не є інтерпретованою мовою, я відчував, що я повинен зробити її повноцінною програмою, а не просто функцією.


1
Як це повернути? fвиходить за межі, коли функція повертається, якщо я не дуже тупа.
abligh

@abligh Ви насправді не дурні, це просто GCC насправді німий. Якщо недійсна функція припиняється без повернення, вона просто використовуватиме останнє призначення.
Etaoin Shrdlu

0

Іржа, 88 байт

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

Це лише рекурсивна версія алгоритму, подана у питанні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.