最好的基数是10…达到目标!


40

输入:

0-9范围内的数字组成的正整数n

挑战:

如果d是整数中的最高位数,则假定数字的底数是d + 1。例如,如果整数是1256,则应假定它以7,如果它是10110,则应假定其以2为底(二进制),如果是159,则应为十进制。

现在,执行以下操作,直到:1:达到以10底的整数, 2:达到一位整数。

  1. 将整数从base-(d + 1)转换base-10
  2. 查找此新整数的底数(再次是base-(d + 1),其中d是新数字中的最高位数)
  3. 转到步骤1

例子:

假设输入为n = 413574。最高位数d = 7,所以这是基数8(八进制)。将此转换为十进制并得到137084。最高位数d = 8,所以这是以9底的。将此转换为十进制并获得83911。最高位数是9,所以这是一个十进制数,我们停止。输出应为83911

假设输入为n = 13552。最高的数字是d = 5,所以这是以6底的数字。将此转换为十进制并得到2156。最高位数d = 6,所以这是基数7。将此转换为十进制并得到776。最高位数是d = 7,所以这是以8底的。将此转换为十进制并获得510。最高的数字是d = 5,所以这是以6底的数字。将此转换为十进制并得到186。最高的数字是8,所以这是以9底的数字。将此转换为小数并得到159。最高位数是9,所以这是一个十进制数,我们停止。输出应为159

假设输入为n = 17。这将使我们得到15,然后是11,然后是3,因为它是个位数,所以我们将输出。


测试用例:

5
5

17
3

999
999

87654321  (base-9 -> 42374116 in decimal -> base-7 -> 90419978 in decimal) 
9041998

41253  (5505 -> 1265 -> 488 -> 404 -> 104 -> 29)
29

笔记:

  • 有关I / O,漏洞等的标准规则。您可以将输入作为字符串
  • 鼓励解释
  • 您可以使用内置的基本转换命令
    • 不使用该语言的内置基本转换函数(如果存在)的解决方案是受欢迎的,即使它们比使用内置函数的明显方法要长得多。

显然,这是OEIS A091047


2
显然我喜欢矩阵,所以我认为我会做一个基数转换挑战。
Stewie Griffin

34
“最佳基数是10” ...“ 10”是用哪个基数写的?
奥利维尔·格雷戈尔(OlivierGrégoire),

5
@OlivierGrégoire这是聪明的事情……无论我们基于什么基础,它仍然是有效的声明!
Stewie Griffin

@StewieGriffin但是你怎么读呢?“ 10”在每个基数中都有不同的名称。
user11153

10
好吧,这取决于基础...或者就像梅根(Meghan)所说的那样,“一切都取决于那个基础,'打出那个基础,没有麻烦” ;-)
Stewie Griffin

Answers:


20

Mathematica,56个字节

#//.x_/;(b=Max[d=IntegerDigits@x]+1)<11:>d~FromDigits~b&

在线尝试!(使用数学。)

我以为我会检查一下序列是什么样的:

在此处输入图片说明

这是找到结果所需步骤数的图表:

在此处输入图片说明

(单击以获取较大的版本。请参见修订历史记录,以查看最多n = 1000的图。)

看起来像是大型结构和小型混沌的有趣混合体。我想知道30,000和60,000之间更大的差距是怎么回事。


4
@StewieGriffin应该在左侧。那里有一些小差距,因为导致10的幂的倍数的整数包含a 9,所以它们已经在基数10中。但是对于30k和60k,似乎数字等于8甚至7(必须检查),以至于最多9个步骤后,它始终以10为底数。
Martin Ender

@StewieGriffin确切地说,[28051,28888]范围内的所有数字都以9为底,并转换为19xxx形式的数字,因此该差距几乎翻了一番。
cmaster

啊,明白了... :)记录下来:我知道为什么10的幂的左边有间隙...只是双倍的间隙很奇怪(为什么30/60,而不是20 / 40/50)。我现在看到的数字范围是28xxx-> 19xxx,但38xxx-> 26xxx,而不是29xxx。
Stewie Griffin

10

爪哇8,172 166 163 152 151个 140 138 116 114 99字节

s->{for(Integer b=0;b<10&s.length()>1;s=""+b.valueOf(s,b=s.chars().max().getAsInt()-47));return s;}

将输入作为String

-64个字节,感谢@OlivierGrégoire。在这里,我认为我最初的172还不错。

在这里尝试。

说明:

s->{                    // Method with String as parameter and return-type
  for(Integer b=0;b<10  //  Loop as long as the largest digit + 1 is not 10
      &s.length()>1;    //  and as long as `s` contains more than 1 digit
    s=""+               //   Replace `s` with the String representation of:
         b.valueOf(s,   //    `s` as a Base-`b` integer
          b=s.chars().max().getAsInt()-47)
                        //     where `b` is the largest digit in the String + 1
  );                    //  End of loop
  return s;             //  Return result-String
}                       // End of method

1
保证保持冷静?:P好吧...让我们去:s->{for(Integer b=0;b<10&s.length()>1;)s=""+b.valueOf(s,b=s.chars().max().getAsInt()-47);return s;}。我也删除了我的大部分评论,因为它们现在已经完全不相关了(b是基准,您的a; s是我们正在研究的数字)。
奥利维尔·格雷戈尔

1
我尝试用以下方法递归化它以减少一些字节:Integer b;return(b=s.chars().max().getAsInt()-47)>9|s.length()<2?s:c(""+b.valueOf(s,b));(88),但是我是第一次使用高尔夫编程。这是一个摘要,对不对?有没有一种方法可以将其声明为方法而无需添加public String c(String s)
法夸德勋爵(Lord Farquaad)

1
@LordFarquaad您不需要public,但是恐怕您确实必须使用String c(String s){}递归调用,即使在Java 8中也是如此。当您使用java.util.function.Function<String, String> c=s->{Integer b;return(b=s.chars().max().getAsInt()-47)>9|s.length()<2?s:c‌.apply​(""+b.valueOf(s,b));}或接口创建lambda时interface N{String c(String s);}N n = s->{Integer b;return(b=s.chars().max().getAsInt()-47)>9|s.length()<2?s:n.c‌​(""+b.valueOf(s,b));};,它将在初始化器中提供“ 自引用 ” 两种情况下均出现错误 ”。但是还是非常好的方法!
Kevin Cruijssen

啊,我想我应该取消它几个字节了。但是,谢谢您的帮助!我会牢记这一点继续前进。
法夸德勋爵(Lord Farquaad)

8

Pyth,9个字节

ui`GhseS`

测试套件

说明:

ui`GhseS`
ui`GhseS`GQ    Implicit variable introduction
u         Q    Repeatedly apply the following function until the value repeats,
               starting with Q, the input.
        `G     Convert the working value to a string.
      eS       Take its maximum.
     s         Convert to an integer.
    h          Add one.
 i`G           Convert the working value to that base

您如何使用两个变量的lambda最终使用一个变量有点奇怪...并且它没有引发错误。哦,这两个变量是QQ,我明白了。
暴民埃里克(Erik the Outgolfer)'17年

@EriktheOutgolfer不完全是。u如果没有重复输入,则应用其第三次输入,直到重复;如果重复输入第三次,则应用固定的次数。ulambda具有GH,但是您不需要使用H
isaacg

实际替换GH将会得到相同的结果... btw隐式变量是G吗?
暴民埃里克(Erik the Outgolfer)'17年

@EriktheOutgolfer隐式变量是G,是。H每次迭代从0开始计数,因此完全不同。我不太确定你在说什么。这是一个示例程序,向您显示正在发生的事情:pyth.herokuapp.com/…–
isaacg

6

JavaScript(ES6),63 57 54 53字节

f=a=>a>9&(b=Math.max(...a+""))<9?f(parseInt(a,b+1)):a

感谢Shaggy和Dom Hastings,节省了8个字节

f=a=>a>9&(b=Math.max(...a+""))<9?f(parseInt(a,b+1)):a;

console.log(f("413574"))


击败我。我认为您可以节省一些字节+a>9||b<9并反转三进制。
毛茸茸的

1
@Shaggy编辑:我很傻
Tom

1
汤姆,别对自己这么狠!你不傻,但是你绝对不像@Shaggy聪明!
Stewie Griffin

1
55个字节的替代格式f=n=>n>9&&(k=Math.max(...n+"")+1)<10?f(parseInt(n,k)):n
Dom Hastings

@DomHastings感谢您的改进!:)
Tom

5

Python 3中91个78 76 75 73字节

@Emigna删除了5个字节。@FelipeNardiBatista保存了1个字节。@RomanGräf保存了2个字节

i=input()
while'9'>max(i)and~-len(i):i=str(int(i,int(max(i))+1))
print(i)

在线尝试!


说明

i=input()                                  - takes input and assigns it to a variable i
while '9'>max(i)and~-len(i):               - repeatedly checks if the number is still base-9 or lower and has a length greater than 1
    i=str(...)                             - assigns i to the string representation of ...
          int(i,int(max(i))+1)             - converts the current number to the real base 10 and loops back again
print(i)                                   - prints the mutated i

5

05AB1E10 5字节

魔术章鱼缸节省了5个字节

F§Z>ö

对于大的输入,它的增长速度非常快,因此,我将旧的快得多的版本留在这里进行测试。算法相同,只是迭代次数不同。

[©Z>öD®Q#§

在线尝试!

说明

[             # start a loop
 ©            # store a copy of the current value in the register
  Z>          # get the maximum (digit) and increment
    ö         # convert the current value to base-10 from this base
     D        # duplicate
      ®Q#     # break loop if the new value is the same as the stored value
         §    # convert to string (to prevent Z from taking the maximum int on the stack)

另外,您不能只使用тFZ>ö§吗?看到迭代次数(如此处所示)似乎处于稳定状态?如果您想获得技术性知识,则迭代的速度可能是对数的...因此,您可以使用类似这样的方法:DFZ>ö§并声明它不会运行很大n。甚至可能:T.n>FZ>ö§直接将迭代次数计算为log_10(n)
Magic Octopus Urn

@MagicOctopusUrn:是的,您现在已经提到它了,因为该序列肯定比线性序列慢,F§Z>ö应该解决这个问题。
Emigna

我认为您可以删除§
大公埃里克(Erik the Outgolfer)'17年

@EriktheOutgolfer:不幸的是没有。如果我们删除§Z则会使用堆栈中的最高数字,而不是堆栈顶部数字中的最高数字。
Emigna '17


3

APL(Dyalog)20 16字节

获取并返回一个字符串

((⍕⊢⊥⍨1+⌈/)⍎¨)⍣≡

()⍣≡ 应用以下功能,直到两个连续的术语相同为止:

⍎¨ 执行每个字符(将字符串转换为数字列表)

(…… ) 对此应用以下默认功能:

  ⌈/ 找到参数的最大值

  1+ 加一

  ⊢⊥⍨ 在该基础上评估论点

   格式(字符串化,为外部函数的其他应用做准备)

在线尝试!



3

Mathematica,52个字节

FromDigits[s=IntegerDigits@#,Max@s+1]&~FixedPoint~#&

将非负整数作为输入并返回非负整数的纯函数。使用相同的核心机制FromDigits[s=IntegerDigits@#,Max@s+1]Jenny_mathy的回答,但是利用FixedPoint做迭代。


3

Perl 6,49个字节

{($_,{.Str.parse-base(1+.comb.max)}...*==*).tail}

测试一下

展开:

{
  (

    $_,                 # seed the sequence with the input

    {
      .Str
      .parse-base(      # parse in base:
        1 + .comb.max   # largest digit + 1
      )
    }

    ...                 # keep generating values until

    * == *              # two of them match (should only be in base 10)

  ).tail                # get the last value from the sequence
}


2

,17字节

Wa>9>YMXaaFB:1+ya

将输入作为命令行参数。在线尝试!

说明

这很有趣-我必须拔出链接比较运算符。

我们要循环直到数字是一个数字或包含9。等效地,我们要循环而数字是多个数字并且不包含9。等效于,当数字大于9并且最大数是少于9 :a>9>MXa

Wa>9>YMXaaFB:1+ya
                   a is 1st cmdline arg (implicit)
     YMXa          Yank a's maximum digit into the y variable
Wa>9>              While a is greater than 9 and 9 is greater than a's max digit:
         aFB:1+y    Convert a from base 1+y to decimal and assign back to a
                a  At the end of the program, print a

2

Python 2中60个 59 56 53字节

感谢Felipe Nardi Batista
保存了4个字节感谢ovs保存了3个字节

f=lambda x,y=0:x*(x==y)or f(`int(x,int(max(x))+1)`,x)

在线尝试!

使用递归lambda,将基本转换的结果与上一个迭代进行比较。


为什么不使用x==y and x or ...x永远不会使用0)(基数1)。甚至(x==y)*x or ...
菲利普·纳迪巴蒂斯塔

@FelipeNardiBatista:谢谢!我尝试了x and x==y or ...哪种方法都行不通,但是我对这些技巧不太熟练,因此我没有意识到我可以扭转它:)
Emigna

@ovs:是的。谢谢!
Emigna

“ @FelipeNardiBatista”输入:由0到9范围内的数字组成的正整数n。0仍然是有效输入,现在代码拒绝它。
桅杆

@Mast:对我们来说幸运的是,0不是正整数,因此不会作为输入给出。
Emigna

2

C#,257个 244 243 244 233 222字节

using System.Linq;z=m=>{int b=int.Parse(m.OrderBy(s=>int.Parse(s+"")).Last()+""),n=0,p=0;if(b<9&m.Length>1){for(int i=m.Length-1;i>=0;i--)n+=int.Parse(m[i]+"")*(int)System.Math.Pow(b+1,p++);return z(n+"");}else return m;};

好吧,C#总是占用很多字节,但这太荒谬了。内置程序都无法处理任意基数,因此我必须自己计算转换。取消高尔夫:

using System.Linq;
z = m => {
int b = int.Parse(m.OrderBy(s => int.Parse(s + "")).Last()+""), n = 0, p = 0; //Get the max digit in the string
if (b < 9 & m.Length > 1) //if conditions not satisfied, process and recurse
{
    for (int i = m.Length - 1; i >= 0; i--)
        n += int.Parse(m[i] + "") * (int)System.Math.Pow(b+1, p++); //convert each base-b+1 representation to base-10
    return z(n + ""); //recurse
}
else return m; };

1

Mathematica,92个字节

f[x_]:=FromDigits[s=IntegerDigits@x,d=Max@s+1];(z=f@#;While[d!=10&&Length@s>1,h=f@z;z=h];z)&

1

具有0箭头功能的Javascript(ES6),74个字节

function f(a){a>9&&b=Math.max(...a)<9&&f(parseInt(a,b+1));alert(a)}f('11')

3
欢迎来到PPCG!:)这可能是一个很好的答案,但我不能不加解释就告诉。我(可能还有其他人)从未赞成不包含解释的答案。
Stewie Griffin

1
为什么要调用f('11')该函数?除非我遗漏了一些看起来只是用途的东西,但实际上并不是提交的一部分。如果是这样,则应将其从代码部分中删除,并放入说明中(添加一个时),并将字节数更新为
67。– PunPun1000

1

K4,19个字节

解:

{(1+|/x)/:x:10\:x}/

例子:

q)\
  {(1+|/x)/:x:10\:x}/413574
83911
  {(1+|/x)/:x:10\:x}/13552
159
  {(1+|/x)/:x:10\:x}/17
3
  {(1+|/x)/:x:10\:x}/41253
29    

说明:

使用/:内置转换基数。

{(1+|/x)/:x:10\:x}/ / the solution
{                }/ / converge lambda, repeat until same result returned
            10\:x   / convert input x to base 10 (.:'$x would do the same)
          x:        / store in variable x
 (     )/:          / convert to base given by the result of the brackets
    |/x             / max (|) over (/) input, ie return largest
  1+                / add 1 to this

1

Kotlin,97个字节

fun String.f():String=if(length==1||contains("9"))this else "${toInt(map{it-'0'}.max()!!+1)}".f()

美化

fun String.f(): String = if (length == 1 || contains("9")) this else "${toInt(map { it - '0' }.max()!! + 1)}".f()

测试

fun String.f():String=if(length==1||contains("9"))this else "${toInt(map{it-'0'}.max()!!+1)}".f()
val tests = listOf(
        5 to 5,
        17 to 3,
        999 to 999,
        87654321 to 9041998,
        41253 to 29
)

fun main(args: Array<String>) {
    tests.forEach { (input, output) ->
        val answer = input.toString().f()
        if (answer != output.toString()) {
            throw AssertionError()
        }
    }
}

蒂奥

在线试用




0

C,159157字节

#include <stdlib.h>
char b[99];i=0;m=-1;c(n){do{m=-1;sprintf(b,"%d",n);i=0;while(b[i]){m=max(b[i]-48,m);i++;}n=strtol(b,0,++m);}while(b[1]&&m<10);return n;}

0

Scala,119字节

if(x.max==57|x.length==1)x else{val l=x.length-1
f((0 to l).map(k=>(((x(k)-48)*math.pow(x.max-47,l-k))) toInt).sum+"")}

在线尝试!

Scala,119字节

if(x.max==57|x.length==1)x else f((0 to x.length-1).map(k=>(((x(k)-48)*math.pow(x.max-47,x.length-1-k))) toInt).sum+"")

在线尝试!

两种方法的工作方式相同,但是在第一个方法中,我放入x.length-1了一个变量,而在第二个方法中,我则没有。

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.