知己号码


14

知己号码

x是任意的基础上,使得一个整数D是其数字的阵列。x如果n1且介于的长度之间,则为Confidant Number D

D[n+1] = D[n] + D[n-1] + ... + D[1] + n

例如,以34910为底的数字。如果我们为该数字标记索引,则具有以下内容。

Index    Digit
-----    -----
1        3
2        4
3        9

从第一个数字开始,我们有1 + 3 = 4,它产生下一个数字。然后,使用第二个数字3 + 4 + 2 = 9,再次产生下一个数字。因此,该号码是密友号码。


给定一个整数,其底数在1到62之间,请计算该底数的所有Confidant Number,并输出它们的列表,并用换行符分隔。您可以假设给定的基数有有限数量的Confidant Number。

对于大于9的数字,请使用字母字符A-Z,对于大于数字的数字,请Z使用字母字符a-z。您不必担心超出的数字z

它们不必以任何特定顺序输出。


样本输入:

16

样本输出:

0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
12
23
34
45
56
67
78
89
9A
AB
BC
CD
DE
EF
125
237
349
45B
56D
67F
125B
237F

这是代码高尔夫球,所以最短的代码获胜。祝好运!

(感谢Zach帮助格式化并指出了一些问题。)


抱歉,我和Zach在这个问题上没什么困惑。一切都应该立即格式化。
意大利面条

一个有用的观察:在一个密友号码中,每个数字是一个数字加上前一个数字的两倍,除了第二个数字是一个数字加上第一个数字。
xnor

逐列显示另一个(可能)有用的模式;)
Geobits,2015年

1
在示例中,为什么CD不在列表中?由于列出了第二个数字比第一个数字大一个的所有其他组合,因此我不明白为什么CD不符合条件。
Reto Koradi

:P固定,谢谢你指出来。
意大利面条

Answers:


2

Pyth,38个字节

0jms@L+s`MT+rG1Gdf<eTQsm.u+N+lNsNQ]dSQ

在线试用:演示

说明:

0jms@L+s`MT+rG1Gdf<eTQsm.u+N+lNsNQ]dSQ  implicit: Q = input base
0                                       print 0
                       m            SQ  map each d of [1, 2, ..., Q] to:
                        .u       Q]d      start with N=[d], apply v Q times
                          +N+lNsN           add (len(N) + sum(N)) to N
                                          gives all intermediate results
                      s                 join to one list of candidates
                 f<eTQ                  filter those, where every digit < Q
  ms@L+s`MT+rG1Gd                       convert numbers to letters 0-9A-Za-z
 j                                      print each on separate line

9

Python 2,104字节

n=input()
for i in range(n):
 s=''
 while i<n:s+=chr(48+i+(i>9)*7+i/36*6);print s;i+=n**0**i+i*(s>s[:1])

这使用以下观察:在密友号码中,该数字i后面是2*i+1,但i+1第二个数字除外。通过尝试所有可能的第一位数字并添加更多的数字,直到它们变得太大为止,我们可以生成所有密友数字。

我们计算与数字ias 对应的字符chr(48+i+(i>9)*7+i/36*6),将其转换为间隔内的数字,大写字母或大写字母范围0-9, 10-35, 36-61

然后,我们i通过i+=i+1两个调整来增加。为了i+=1在第一个数字之后进行替换,我们添加is有多个1字符的条件。同样,我们需要避免打印以0开头的数字,同时允许0。为此,我们进行了黑客攻击,将其添加到下一个循环中,从而导致i=0条件失败。这可以通过替换为,右关联到等于或。i<nn1n**0**in**(0**i)n**(i==0)n if i==0 else 1


哇哇 相较于Python 3,尺寸几乎缩小了一半!嗯 我想知道如果我使用一些技巧可以节省多少字节...
El'endia Starman

4

Python 3,201,200字节

n=int(input())
X=[[i]for i in range(1,n)]
for x in X:
 y=sum(x)+len(x)
 if y<n:X.append(x+[y])
X=[[0]]+X
print('\n'.join(''.join(map(lambda x:[str(x),chr(x+55),chr(x+61)][(x>9)+(x>35)],x))for x in X))

说明

这里的关键结论是给出一个序列x(如,说[1,2,5]),你可以用序列中的下学期sum(x)+len(x),这使得11在这种情况下,( B)。检查是否小于n,如果是,则将扩展序列添加到所有此类序列的列表中(由所有个位数填充)。

[str(x),chr(x+55),chr(x+61)][(x>9)+(x>35)]

这就是我将序列项映射到字符的方式。将它们一起''.join编辑,然后打印,并用换行符分隔。


您可以通过将最后一行更改为来节省一个字节print('\n'.join(''.join(map(lambda x:[str(x),chr(x+55),chr(x+61)][(x>9)+(x>35)],x))for x in X))。另外,目前为201字节;不是200
扎克·盖茨

@ZachGates:我确实想到了这一点,但没有意识到我可以省去括号。谢谢!
El'endia Starman

4

GS2,44个字节

26 c8 2f 08 4d 08 40 64 45 2e 30 42 67 40 24 d0
75 d3 20 e1 35 09 cb 20 23 78 22 09 34 30 e0 32
08 86 84 30 85 30 92 58 09 34 10

它以不同的顺序生成数字,但是问题描述未指定,所以我要这样做!这是输入16的输出。

1
12
125
125B
2
23
237
237F
3
34
349
4
45
45B
5
56
56D
6
67
67F
7
78
8
89
9
9A
A
AB
B
BC
C
CD
D
DE
E
EF
F
0

以下是这些字节的助记符:

read-num dec save-a
range1
{
    itemize
    {
        dup 
        sum
        over length
        add

        swap right-cons

        dup last push-a le

            push-d eval
        block2 when
    }
    save-d eval
    init inits tail
} map

+ ' fold 

{
    ascii-digits
    uppercase-alphabet catenate
    lowercase-alphabet catenate
    select 
    show-line
} map

0

天哪,这太棒了。我一直在尝试学习GS2,但是我一直在经历艰难的时光:P
意大利面条2015年

3

CJam,46 42 40字节

ri:R,{Q{+_A,s'[,_el^+f=oNo__,+:+_R<}g&}*

CJam解释器中在线尝试。

怎么运行的

ri:R            e# Read an integer from STDIN and save it in R.
,               e# Push [0 ... R-1].
{               e# Fold; For each element but the first:
                e#   Push the element.
  Q             e#   Push an empty array (accumulator for base-R digits).
  {             e#   Do:
    +           e#     Concatenate the integer and the array on the stack.
    _           e#     Push a copy of the result.
    A,s'[,_el^+ e#     Push "0...0A...Za...z".
                e#     See: http://codegolf.stackexchange.com/a/54348
    f=          e#     Replace each base-R digit with the corresponding character.
    oNo         e#     Print the resulting string and a linefeed.
    _           e#     Push another copy of the accumulator.
    _,+         e#     Append its length to it.
    :+          e#     Add all digits (including the length).
    _R<         e#     Push a copy of the result and compare it with R.
  }g            e#   If the sum is less than R, it is a valid base-R digit,
                e#   the comparison pushes 1, and the loop is repeated.
  &             e#   Intersect the accumulator with an integer that is greater
                e#   or equal to R. This pushes an empty array.
}*              e#

在末尾0和几个空数组留在堆栈上,因此解释器打印0


1

gawk,111个字节

{for(n=$0;n>c=++i;)for(j=0;n>$++j=c+=j;print"")for(c=k=0;k++<j;c+=$k)printf"%c",$k+($k>9?$k>35?61:55:48)}$0="0"

对于从其开始的每个起始数字1base-1它都会计算下一个数字,尽管这些数字低于基数,但我们仍然有一个密友数字。打印时计算下一位。最后打印0

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.