与数字根相反!


19

也称为[模拟根]

与数字根相反!);)

数字的数字根是数字的连续求和,直到成为单个数字为止,例如,计算89456的数字根是这样的:

8 + 9 + 4 + 5 + 6 = 32

3 + 2 = 5

89456的数字根为5。

给定一个数字作为通过STDIN的输入,请打印/返回具有该数字根的所有可能的两个数字。如果需要,它可以包含自身,例如05

这些是所有可能的输入和输出:

(您可以选择是否为数字本身包括前导零)

输入输出

0 => 0或00或全无

1 => 01和/或1、10、19、28、37、46、55、64、73、82、91-确保1不返回100

2 => 02和/或2、11、20、29、38、47、56、65、74、83、92

3 => 03和/或3、12、21、30、39、48、57、66、75、84、93

4 => 04和/或4,13,22,31,40,49,58,67,76,85,94

5 => 05和/或5、14、23、32、41、50、59、68、77、86、95

6 => 06和/或6、15、24、33、42、51、60、69、78、87、96

7 => 07和/或7、16、25、34、43、52、61、70、79、88、97

8 => 08和/或8、17、26、35、44、53、62、71、80、89、98

9 => 09和/或9、18、27、36、45、54、63、72、81、90、99

没有标准漏洞,而是,因此以字节为单位的最短答案为胜。

恭喜Heeby Jeeby人他的惊人的46字节脑高射炮的答案!


1
这个数字本身算作两位数字吗?(05)?
破坏的柠檬


5
0的输出应该是什么?再说一次,在这样的情况下,只有10个可能的输入,在挑战中提供输出将是非常有益的。
FryAmTheEggman's

1
您对如何处理零的决定会使许多已发布的答案无效。让参与者知道您已做出决定是体贴的。
FryAmTheEggman'5

2
数字根的反面是模拟根吗?
tuskiomi

Answers:


5

Pyke,6个字节

ITV
9+

在这里尝试!

ITV\n9+ - if input: (don't print anything for 0 case)
 TV\n9+ -  repeat 10 times:
   \n   -    print ^
     9+ -   ^ += 9

9

JavaScript(ES6),27 31 30字节

返回00否则返回一组解决方案。

n=>n&&[...1e9+''].map(_=>n+=9)

演示版


3
不加任何评论的否决票对改善答案没有太大帮助...
Arnauld

对于某些人来说,可能尚不清楚哪一部分是实际的代码高尔夫功能,哪一部分是演示。将函数本身直接放在JavaScript行的下方可能是一个好主意。
David Mulder

@DavidMulder感谢您的建议。实际上,多数时候这就是我的回答方式。更新。
Arnauld

不错的解决方案!对不起,您拖拽一个旧的解决方案,但是您可以放下+以保存另一个字节吗?虽然我认为以这种方式不适用于stdin字符串。
Craig Ayre '18

@CraigAyre我不确定这+是哪里来的...更新。谢谢!
Arnauld

8

05AB1E13 12 9字节

-3个字节感谢Adnan

тL<ʒSOSOQ

在线尝试!

说明

тL<ʒSOSOQ   Main link. Argument n
тL<         List from 1 to 100, then decrement to get 0 to 99
   ʒ        Filter
    SOSO    Sum of all chars, twice
        Q   Compare to input

我认为您可以用代替无限循环SOSO,因为该数字永远不会大于99。–
Adnan

@Adnan不要以为,我向你保证他可以。
暴民埃里克(Erik the Outgolfer)'17年

1
тL<并不比普通短99Ý。;)
暴民埃里克(Erik the Outgolfer

1
@EriktheOutgolfer好吧,我可能想尽力在那儿保存一个字节; D
kalsowerus

2
主“链接”?从05AB1E开始具有链接?不是果冻。
Andrew Savinykh

7

Haskell,21个字节

f 接受一个整数并返回一个整数列表。

f d=[d,d+9..99^0^0^d]

在线尝试!

  • 以数字开头,d并生成范围为第9个数字,直到99的界限,棘手的情况除外0
  • 要提前停止了0,使用电源0^d==10==0所有其他数字。因此99^0^0^d10,但99其他的事。


7

Brain-Flak,46个字节

{((()()()()()){}){(({}[()])<(({}{}[]))>)}}{}{}

在线尝试!

说明

该答案使用了Megatom答案中的一个想法,即使用堆栈高度作为循环计数器与增量之间的差。像以前的答案一样,此答案具有较大的外循环以捕获所有零。在循环内部,我们按下10作为计数器,然后开始另一个嵌套循环。在此循环中,我们将计数器递减1

({}[()])

然后,我们弹出顶部的两个项目,即计数器和我们计算的最后一个项目。我们将这些值加到堆栈高度上以抵消减量,然后将其两次按下,一次用于输出,一次一次,以便可以消耗它来计算下一个结果。两次推送意味着我们不小心推送了一个附加值,该附加值需要在执行结束时删除。

勉强击败Megatom的原因是Megatom的答案被迫获得其堆栈高度,而最后一个结果仍在堆栈中。这意味着他们被迫使用相当昂贵的设备[()]将总数减少一倍。通过将重复项移到循环末尾,我可以避免在程序的最后不得不使用[()]额外{}的代码。如果Megatom使用此策略,他的答案将如下所示:

{<>((()()()()()){}){((({}[()])<>{}[]))<>}}<>{}

也是46个字节

Brain-Flak,52个字节

{((()()()()()){}){({}[()]<(({})((()()())){}{})>)}}{}

在线尝试!

说明

主外循环为零输入提供了一种特殊情况。如果输入零,则跳过整个循环,弹出零,然后什么也不输出。否则,我们进入循环。在这里,我们每次将循环推10次,每次将9加到栈顶,保留旧值。由于9保留数字和,因此将为我们提供下一个值。循环到期后,我们使用生成的零退出循环,然后{}在最后将其弹出。

Brain-Flak,56字节

{([(((()()())){}{})]){({}()<(({})<(({}{}))>)>)}}{}({}{})

在线尝试!

说明

这个版本与上一个版本非常相似,除了我们循环9次而不是10次而忽略了原始值。为了做到这一点,我们必须重新安排我们处理内存的方式。我们可能使用此方法保存的所有字节都将放入清理中。


46号未保留原始号码:(
乔·金

@JoKing是的,它只处理两位数的情况。我认为这是该问题的意图,因此使我非常高兴。
小麦巫师

不错的工作!您获得了赏金。
FantaC


5

Brachylog,12个字节

0g|g{t+₉}ᵃ¹⁰

在线尝试!

说明

0g               Input = 0, Output = [0]
  |              Or
   g{   }ᵃ¹⁰     Accumulate 10 times, starting with [Input]
     t+₉         Take the last element, add 9

5

31 27个字节

seq $1 9 $(($1?99:0))|xargs

在线尝试!

以前

eval echo {$1..$(($1?99:0))..9}

如何找到手册页/ bash帮助/?关于“ {x..y..z}”?这叫什么?
奥利维尔·杜拉克

找到了:在手册页中搜索[^。] \。\。[^。]:brace expansion: (...) A sequence expression takes the form {x..y[..incr]}, where x and y are either integers or single characters, and incr, an optional increment, is an integer. (...) When the increment is supplied, it is used as the difference between each term. The default increment is 1 or -1 as appropriate.
Olivier Dulac

5

Dyalog APL,15个字节

{(×⍵)/+\⍵,109}

怎么样?

⍵,10⍴9-将输入连接10 9s(⍵ 9 9 9 9 9 9 9 9 9 9)。

+\ -累计金额。

(×⍵)/ -扩展签署时间-签署将1表示为1-9,0表示为0。

在线尝试!

Dyalog APL,24个字节

{⍵/⍨⎕=(⍵≠01+9|⍵-1}⍳100

需要⎕IO←0

怎么样?

                      100   0 .. 99
              1+9|⍵-1       digit sum (⍵-1 mod 9 + 1)
        (⍵≠0              edge case for 0
     ⎕=                     equals to the input
 ⍵/⍨                        compress with the range


4

Mathematica,25个字节

If[#==0,0,Range[#,99,9]]&

适用于0


不适用于0。这也将不包括其数字加起来数量大于9(例如数字9不会有99输出)。
JungHwan Min

我明白你的意思了。您只检查“我的”代码吗?导致许多代码在这里不适用于0 ...
J42161217

1
抱歉,我倾向于专注于Mathematica代码,因为这是我最了解的语言。并不是要针对您或其他任何目标。如果是这样,我表示歉意。
JungHwan Min

所有固定和工作
J42161217

什么?没有内置的?
OldBunny2800 '17


4

其实是18个位元组

╗2╤DR⌠╜-9@%Y⌡░╜;)I

在线尝试!

说明:

╗2╤DR⌠╜-9@%Y⌡░╜;)I
╗                   save input to register 0
 2╤DR               range(1, 100)
     ⌠╜-9@%Y⌡░      elements in range where function returns truthy:
      ╜-              subtract from input
        9@%           mod 9
           Y          is equal to 0
              ╜;)   push a copy of the input on the top and the bottom of the stack
                 I  if input is truthy, return the filtered range, else return the input (special-cases 0)

@FryAmTheEggman已修复。
Mego

4

PHP,41字节

打印下划线分隔值

for(;100>$a=&$argn;$a+=$a?9:ERA)echo$a._;

ERA是PHP中具有值的最短常量131116。您可以将其替换为无聊的替代方案,100或者以die

在线版本


4

Brain-Flak54 52字节

{<>((((()()())){}{})()){({}<(({})<>({}))><>[()])}}<>

在线尝试!

我第一次尝试Brain-Flak,我认为我做得很好。有更多经验的人有建议吗?

怎么运行的:

{ Don't do anything if input is 0
  <>((((()()())){}{})()) Switch to other stack and add 9 and 10
                         10 is the counter, 9 is to add to the current num
  { While counter
     (
       {} Pop the counter
       <(({})<>({}))> Get a copy of the 9, switch to the other stack and add it to a copy of the top of it. Use <...> to make it return 0
       <>[()] Switch to the other stack and decrement the counter
     ) 
  }
}<> Switch to the stack with the values on it

1
做得好!欢迎来到Brain-Flak。
MegaTom


3

PHP,35岁

print_r(range($argn,!!$argn*99,9));

[$argn, 100)以步长9为数组创建范围并打印。如果输入,0则创建范围[0,0]=> array(0)


3

Python,48 51字节

@WheatWizard节省了3个字节

lambda n:[x for x in range(100)if~-n==~-x%9or x==n]

1
尝试~-x而不是(x-1)
小麦巫师

1
仍然使用@WheatWizard的技巧,请删除if ~-x%9
Felipe Nardi Batista

现在您可以~-n==~-x%9or x==n保存一个字节
Wheat


我需要问一个愚蠢的问题...我想运行这个。如何使此代码运行?我正在学习一些结构(主要是〜运算符)
Allen Fisher


2

Pyke,6个字节(旧版本)

工作承诺

TXU#sq

说明:

TX     -   10**2
  U    -  range(^)
   #   - filter(^)
    s  -   digital_root(^)
     q -  ^==input


2

C(gcc),55个字节

f()实际上不需要使用任何参数来调用;的n是就在那里,而不是外部的功能,可以节省一个字节。

f(n){for(scanf("%d",&n);n&&n<100;n+=9)printf("%d ",n);}

在线尝试!


通过将printf循环头放入内部,可以节省2个字节:在线尝试!
DLosc

@DLosc myeah,但随后以一个数字开始为时已晚。
gastropner

措词可能更清楚,但是问题确实允许从(例如)10而不是1开始:“ ...具有该数字根的所有可能的两位数字。如果需要可以包含[数字]本身,例如05。” 换句话说,允许但不要求在输出中包含一位数字。
DLosc

2

木炭14 11字节

I∧N⁺Iθ×⁹…¹¹

在线尝试!链接是详细版本的代码。编辑:通过不打印零输入内容来节省2个字节,通过向量化操作将1个字节保存 3个字节,这归功于@ ASCII-only。说明:

         ¹¹ Literal 11
        …   Range
       ⁹    Literal 9
      ×     Vector multiply
     θ      (First) input
    I       Cast to number
   ⁺        Vector add
  N         Input digit as a number
 ∧          Logical AND
I           Cast to string
            Implicitly print on separate lines


我认为我刚刚找到了一个打印0的替代项,这里
仅ASCII的

1

朱莉娅0.6,18字节

我使用三元数来捕获0情况,并使用范围n:9:99来创建数字。在julia中,范围是AbstractVector,可以Vector在大多数情况下代替数字的实际值,但是它只能打印出来,因为1:9:91它不能满足要求,因此我将其包装起来[_;]以将内容收集到中Vector

n->n>0?[n:9:99;]:0

在线尝试!




1

Clojure,38个字节

(defn f[n](if(pos? n)(range n 100 9)))

或作为29个字节的匿名函数

(#(if(pos? %)(range % 100 9))n)

在线尝试!

谢谢@steadybox


1
n=9缺少最后一个数字时的输出99在线尝试!此外,您还可以通过删除之间的空间节省了字节f[n](if(...
Steadybox

0

Perl 5,62个字节

sub x{$f=$_[0];@x=("0$f",$f);push@x,map$f+$_*10,(1..9)if$f;@x}

一定会有更短的路


0

Gol> <>,12个字节

I:ZhbF:N9+|;

在线尝试!

怎么运行的

I:ZhbF:N9+|;

I             Take input as number
 :            Duplicate
  Z           Pop and skip one if nonzero
   h          If zero, print the top as number and halt
              Otherwise...
    bF....|   Repeat these commands 11 times
      :N      Print top as number, with newline
        9+    Add 9
           ;  Halt
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.