以-10为底的输出N


18

挑战:

在您选择的编程语言中,接受一个整数 作为基数10的输入,并以十进制表示法(也称为基数-10)输出该整数。

示例算法:

这是一种从Wikipedia提取的算法,可以将VB.NET中的10转换为负数

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
我认为您只想绕过解决此特定问题的内置组件,而不是所有现有的builltin。
Denker

相关OEIS:A039723
devRicher

6
您应该添加一个否定的测试用例。
xnor

1
[0, 1, 8, 1, 6, 8]是用于输入一个可接受的输出2048
丹尼斯

2
在规范中可能值得一提。您的VB代码看起来像是返回了一个列表。
丹尼斯

Answers:


12

JavaScript(ES6),51 45 37字节

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

测试用例


该算法有参考吗?
dfernan '17

@dfernan我真的不知道。从建议的算法开始,这是多次高尔夫迭代的结果。
Arnauld

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

Arnauld算法的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 '17

你怎么称呼它?我在做这个(3.5.2)。您可能在代码中声明k或声明n其他地方吗?
xnor

1
看起来不错,不错的改进!您不再需要函数调用周围的括号。
xnor

1
我可以解释为运算符优先级的最后一个。-n//10dos -(n//10):negate n,然后由floor划分为10,向下舍入为负无穷大,而不是0。相反,0-n//10dos 0-(n//10),首先将其划分为10,然后求反。无论出于何种原因,Python都将一元否定的优先级高于二进制减号。请参阅此优先级表。在打高尔夫球之前,我也遇到过同样的情况。
xnor

2

果冻,10字节

:⁵NµÐĿ%⁵ṚḌ

在线尝试!

背景

将非负数列表从基b转换为整数可以通过函数x,y a bx + y的左折来实现。要将整数转换b,我们必须简单地反转该函数,即找到bx + y↦x,y的表达式。

在Python(以及扩展为Jelly)中,取模运算符的结果始终为非负数,因此(bx + y)%| b | = y

同样,整数除法总是四舍五入,确保如果q = n / dr = n%d,则等式n = qd + r成立。如果sb的符号,则(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。
这适用于从2017-01-06 23:27 UTC + 00:00 提交的140e56ff38f45fa4fd40fd3ec382094e707b1bad
那是用于运行此答案的版本。

可在https://raw.githubusercontent.com/ismael-miguel/SimpleTemplate/140e56ff38f45fa4fd40fd3ec382094e707b1bad/SimpleTemplate.php上获得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个字节的Arnauld答案端口:

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

1

Mathematica,49个字节

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

定义一个d接受一个整数参数并返回字符串的函数。递归算法-看起来像Arnauld答案中的相同算法。它也适用于负数。(如果输入为0,则返回空字符串intsead为“ 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;}

程序不打印结果编号,而是返回它。显然,这是Arnauld的回答,唯一的区别是,由于C不是一种解释型语言,我觉得我应该使它成为一个完整的程序,而不是一个函数。


1
它如何退货?f函数返回时超出范围,除非我真的很笨。
abligh

@abligh你不是真的很傻,只是GCC真的很傻。如果非空函数终止而没有返回,它将仅使用最后一个赋值。
Etaoin Shrdlu

0

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

这只是问题中提供的算法的递归版本。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.