跳数


12

跳数定义为正数n,所有成对的连续十进制数字之差为1。此外,所有单数位数字均视为跳数。例如。3、45676、212是跳跃数字,但414和13不是。9与0之差不视为1

挑战 创建一个程序,输出以下结果之一:

  • 给定输入n输出的第一个n跳跃数。
  • 给定输入n输出,序列的nth项。

注意

  • 允许使用任何有效的I / O格式
  • 允许1索引或0索引(请指定)

以下是一些跳跃数字:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 21, 23, 32, 34, 43, 45, 54, 56, 65, 67, 76, 78, 87, 89, 98, 101, 121, 123, 210, 212, 232, 234, 321, 323, 343, 345, 432, 434, 454, 456, 543, 545, 565, 567, 654, 656, 676, 678, 765, 767, 787, 789, 876, ...

这也是A033075


这个索引是0还是1?
泰勒·斯科特

1
@TaylorScott序列仅包含正数。如果您的意思是输入n,则取决于您。
路易斯·费利佩·德·耶稣·穆尼奥斯

我猜“允许任何有效的I / O格式”包括将数字输出为十进制数字列表,但只是想确认-?
乔纳森·艾伦,

是@JonathanAllan
路易斯·

Answers:



6

果冻,8字节

1DI*`ƑƊ#

n从STDIN 接受整数的完整程序,该程序打印第一个n正跳数的列表。

在线尝试!

怎么样?

数字之间的可接受的增量差异为1-1而其他数字之间的差异[-9,-2]+[2,9]则不是。这与整数成对,当整数升为整数时不变。即因为:xx=x

00=1
11=1
22=4
11=1
22=14

1DI*`ƑƊ# - Main Link: no arguments (accepts a line of input from STDIN)
       # - count up keeping the first (input) n matches...
1        - ...start with n equal to: 1
      Ɗ  - ...match function: last three links as a monad:  e.g. 245       777      7656
 D       -   convert to a list of decimal digits                 [2,4,5]   [7,7,7]  [7,6,5,6]
  I      -   incremental differences                             [2,1]     [0,0]    [-1,-1,1]
     Ƒ   -   invariant under?:
    `    -     using left argument as both inputs of:
   *     -       exponentiation (vectorises)                     [4,1]     [1,1]    [-1,-1,1]
         -                                            --so we:   discard   discard  keep
         - implicitly print the list of collected values of n

6

05AB1E(旧版),5个字节

输入为1索引。

码:

µN¥ÄP

使用05AB1E编码。在线尝试!


说明

µ          # Get the nth number, starting from 0, such that...
   Ä       #   The absolute values
 N¥        #   Of the delta's of N
    P      #   Are all 1 (product function, basically acts as a reduce by AND)

正确的工作工具。
lirtosiast

5

Python 2中79 75个字节

xnor -4字节

f=lambda n,i=1:n and-~f(n-g(i),i+1)
g=lambda i:i<10or i%100%11%9==g(i/10)>0

在线尝试!

衍生自Chas Brown回答。辅助函数g(i)返回是否i为跳数。如果数字的最后两位数字的n绝对差为1,n%100%11则将为1或10,因此n%100%11%9为1。


不错的把戏%11f=lambda n,i=1:n and-~f(n-g(i),i+1)如果切换到单索引,则可以执行此操作。
xnor19

4

APL(Dyalog Unicode),36 字节SBCS

1个索引。感谢dzaima在打高尔夫球方面的帮助。

编辑:-15字节从ngn。

1+⍣{∧/1=|2-/⍎¨⍕⍺}⍣⎕⊢0

在线尝试!

说明

f⍣g⍣h作为运营商,我们在APL将其转换为(f⍣g)⍣h。(与2×3+1翻译的功能相反2×(3+1)

1+⍣{...}⍣⎕⊢0  This is equivalent to 
               "do {check} we find the n-th integer that fulfils {check}"

1+⍣{...}   0  Start with 0 and keep adding 1s until the dfn 
               (our jumping number check in {}) returns true.
        ⍣⎕    We take input n (⎕) and repeat (⍣) the above n times 
               to get the n-th jumping number.

{∧/1=|2-/⍎¨⍕⍺}  The dfn that checks for jumping numbers.

         ⍎¨⍕⍺   We take the base-10 digits of our left argument
                 by evaluating each character of the string representation of ⍺.
     |2-/        Then we take the absolute value of the pairwise differences of the digits
 ∧/1=            and check if all of the differences are equal to 1.

10⊥⍣¯1⊢⍺->⍎¨⍕⍺
ngn

它比使用递归要短得多:{1+⍣{∧/1=|2-/⍎¨⍕⍺}⍣⍵⊢0}1+⍣{∧/1=|2-/⍎¨⍕⍺}⍣⎕⊢0
ngn

“⍣是一个操作数”-它是一个“运算符”(我在聊天中犯了这个错误,并已将其改正,但似乎您选择了初始版本。对不起)
ngn



3

Python 2中88 87个字节

f=lambda n,i=2:n and f(n-g(i),i+1)or~-i
g=lambda i:i<10or abs(i/10%10-i%10)==1==g(i/10)

在线尝试!

返回索引为0的跳跃数(即f(0)=> 1,依此类推)。


@lirtosiast:可以,请把您的答案捐赠给您最喜欢的慈善机构:)。它有很大的区别,值得单独做出回应(以及可以使用跨语言)。
Chas Brown

3

Haskell,69个字节

  • 感谢Joseph Sible执行挑战规则并节省了三个字节。
  • 感谢nimi节省了两个字节。
(filter(all((==1).abs).(zipWith(-)<*>tail).map fromEnum.show)[1..]!!)

在线尝试!


1
这似乎在回答“这是一个跳数吗?”的问题。对于给定的输入数字,这不是挑战所要求的。
约瑟夫·西布尔-恢复莫妮卡

@JosephSible你是正确的。感谢您的注意。
乔纳森·弗雷希

而且,现在,此问题已解决,可以g通过将其重写为无点的方式来减少3个字节,然后使用<*>g=all((==1).abs).(zipWith(-)<*>tail).map(read.pure).show
Joseph Sible-Reinstate Monica

@JosephSible谢谢。
乔纳森·弗雷希

@nimi完成。谢谢。
乔纳森·弗雷希



1

迅捷,228个字节

func j(n:Int){
var r:[Int]=[]
for x in 0...n{
if x<=10{r.append(x)}else{
let t=String(x).compactMap{Int(String($0))}
var b=true
for i in 1...t.count-1{if abs(t[i-1]-t[i]) != 1{b=false}}
if b{r.append(x)}
}
}
print(r)
}
j(n:1000)

在线尝试!


1

Python 3中122个 121字节

g=lambda s:len(s)==1or 1==abs(ord(s[0])-ord(s[1]))and g(s[1:])
def f(n,i=1):
	while n:
		if g(str(i)):n-=1;yield i
		i+=1

在线尝试!

通过f从打印更改为-1字节到生成器功能。

g是一个递归帮助函数,它确定字符串s是否为“跳跃字符串”(这是可行的,因为0到9的字符代码是有序且连续的)。

f是一个生成器函数,可接收n并产生第一个n跳转数字。


1

R,85字节

i=scan();j=0;while(i)if((j=j+1)<10|all(abs(diff(j%/%10^(0:log10(j))%%10))==1))i=i-1;j

在线尝试!

怀疑这可以打更多。使用读取数字scan()并输出适当的跳跃数字。





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.