Выход N в базе -10


18

Вызов:

На выбранном вами языке программирования примите целое число в качестве ввода в базе 10 и выведите его в нечетно-десятичной записи , также известной как база -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#

Это обратная перестановка в преобразование негадецимального числа в целое.

Попробуйте онлайн!

Как это устроено

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).
17

Как ты это называешь? Я делаю это (в 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 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>);

Значение будет отображаться на экране.



1

Mathematica, 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 очень глупы. Если не пустая функция завершается без возврата, она просто использует последнее присваивание.
Этаоин Шрдлу

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.