ตรงข้ามรูทดิจิทัล!


19

หรือที่รู้จักในชื่อ [analog root]

( ตรงข้ามรูทดิจิทัล! );)

รูทดิจิทัลของตัวเลขคือผลรวมของตัวเลขอย่างต่อเนื่องจนกว่าจะเป็นตัวเลขหลักเดียวตัวอย่างเช่นรูทดิจิทัลของ 89456 จะถูกคำนวณดังนี้:

8 + 9 + 4 + 5 + 6 = 32

3 + 2 = 5

รากดิจิตอลของ 89456 คือ 5

ให้ตัวเลขเป็นอินพุตผ่านSTDINพิมพ์ / ส่งกลับตัวเลขสองหลักที่เป็นไปได้ทั้งหมดที่มีรูทดิจิทัลนั้น หากคุณต้องการมันสามารถรวมตัวเองเช่น 05

นี่เป็นอินพุตและเอาต์พุตที่เป็นไปได้ทั้งหมด:

(คุณจะต้องเลือกว่าจะรวมศูนย์นำหน้าสำหรับตัวเลขด้วยตนเองหรือไม่)

I / O

0 => 0 หรือ 00 หรืออะไรก็ได้

1 => 01 และ / หรือ 1, 10, 19, 28, 37, 46, 55, 64, 73, 82, 91 - ตรวจสอบให้แน่ใจว่า 1 ไม่ได้คืน

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 Manกับคำตอบที่น่าประทับใจ 46 ไบต์!


1
ตัวเลขจึงนับเป็นตัวเลขสองหลัก (05)?
มะนาวที่สามารถทำลายได้


5
เอาต์พุตควรเป็นอะไรสำหรับ 0 และอีกครั้งในกรณีเช่นนี้ที่มีเพียง 10 อินพุตที่เป็นไปได้มันจะเป็นประโยชน์อย่างมากในการจัดหาเอาต์พุตในการท้าทายของคุณ
FryAmTheEggman

1
การตัดสินใจของคุณเกี่ยวกับวิธีจัดการกับศูนย์ทำให้โมฆะคำตอบมากมายที่โพสต์ มันจะมีน้ำใจเพื่อให้ผู้เข้าร่วมรู้ว่าคุณได้ทำการตัดสินใจ
FryAmTheEggman

2
ตรงข้ามกับรากดิจิตอลเป็นรากอนาล็อกหรือไม่?
tuskiomi

คำตอบ:



9

JavaScript (ES6), 27 31 30 ไบต์

ส่งคืน0สำหรับ0หรืออาเรย์ของการแก้ปัญหาเป็นอย่างอื่น

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

การสาธิต


3
downvote โดยไม่ต้องแสดงความคิดเห็นใด ๆ ไม่ได้ช่วยมากในการปรับปรุงคำตอบ ...
Arnauld

สำหรับบางคนมันอาจไม่ชัดเจนว่าส่วนใดเป็นฟังก์ชัน codegolfed จริงและส่วนใดเป็นการสาธิต มันอาจจะเป็นความคิดที่ดีที่จะวางฟังก์ชั่นไว้ตรงด้านล่างบรรทัดJavaScript
David Mulder

@DavidMulder ขอบคุณสำหรับคำแนะนำ นั่นเป็นวิธีที่ฉันตอบได้บ่อยครั้ง Updated
Arnauld

ทางออกที่ดี! ขออภัยที่ลากโซลูชันเก่า แต่คุณสามารถปล่อย+เพื่อบันทึกไบต์อื่นได้หรือไม่ แม้ว่ามันจะไม่ทำงานกับสตริง stdin อย่างที่ฉันคิด
Craig Ayre

@CraigAyre ฉันไม่แน่ใจว่าสิ่งนี้+มาจากไหน... อัปเดต ขอบคุณ!
Arnauld

8

05AB1E , 13 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

ฉันคิดว่าคุณสามารถแทนที่ infinite loop ได้SOSOเนื่องจากจำนวนจะไม่มากกว่า 99
Adnan

@Adnan อย่าคิดว่าฉันรับรองว่าเขาทำได้
Erik the Outgolfer

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==1สำหรับ0และ==0สำหรับตัวเลขอื่น ๆ ทั้งหมด ดังนั้น99^0^0^dให้1สำหรับ0แต่99สำหรับสิ่งอื่น


7

Brain-Flakขนาด 46 ไบต์

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

ลองออนไลน์!

คำอธิบาย

คำตอบนี้ใช้แนวคิดจากคำตอบของ Megatomคือการใช้ความสูงของสแต็กเป็นความแตกต่างระหว่างตัวนับลูปและการเพิ่มขึ้น เช่นเดียวกับคำตอบก่อนหน้าคำตอบนี้มีวงรอบนอกขนาดใหญ่ที่จะจับศูนย์ทั้งหมด ภายในลูปที่เรากด 10 เพื่อทำหน้าที่เป็นตัวนับจากนั้นเราจะเริ่มลูปที่ซ้อนกันอีกอัน ในวงนี้เราจะลดจำนวนตัวนับ 1

({}[()])

จากนั้นเราก็เปิดรายการสองอันดับแรกซึ่งเป็นตัวนับและรายการสุดท้ายที่เราคำนวณ เราเพิ่มสิ่งเหล่านี้ลงในความสูงของสแต็กเพื่อที่จะรักษาสมดุลของการลดลงจากนั้นเรากดสองครั้งครั้งเดียวสำหรับเอาท์พุทและอีกครั้งเพื่อให้สามารถใช้ในการคำนวณผลลัพธ์ต่อไป การกดสองครั้งหมายความว่าเราบังเอิญกดค่าเพิ่มเติมซึ่งจำเป็นต้องลบออกเมื่อสิ้นสุดการทำงาน

เหตุผลที่การเต้นของ Megatom นั้นแทบจะไม่ได้เพราะคำตอบของ Megatom นั้นถูกบังคับให้รับความสูงของกองในขณะที่ผลสุดท้ายยังอยู่ในกอง ซึ่งหมายความว่าพวกเขาถูกบังคับให้ใช้ราคาค่อนข้างแพง[()]เพื่อลดยอดรวมลงหนึ่งรายการ ด้วยการย้ายสิ่งที่ซ้ำกันไปยังจุดสิ้นสุดของลูปฉันสามารถหลีกเลี่ยงการใช้[()]ค่าใช้จ่ายของการเพิ่ม{}ในตอนท้ายสุดของโปรแกรม ถ้า Megatom ใช้กลยุทธ์นี้คำตอบของเขาจะเป็นดังนี้

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

ยัง 46 ไบต์

Brain-Flakขนาด 52 ไบต์

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

ลองออนไลน์!

คำอธิบาย

วงแหวนรอบนอกหลักทำเคสพิเศษสำหรับอินพุตของศูนย์ หากศูนย์คืออินพุตเรากระโดดข้ามลูปทั้งหมดให้ป๊อปศูนย์แล้วไม่แสดงผลใด ๆ มิฉะนั้นเราจะเข้าสู่วง ที่นี่เรากดลูป 10 ครั้งแต่ละครั้งเพิ่ม 9 ไปที่ด้านบนสุดของสแต็กรักษาค่าเก่า ตั้งแต่ 9 รักษาผลรวมดิจิตอลสิ่งนี้จะทำให้เราได้รับมูลค่าต่อไป เมื่อลูปหมดอายุเราใช้ศูนย์มันสร้างขึ้นเพื่อออกจากลูปซึ่งจะถูกตอกด้วย{}ตอนท้าย

Brain-Flakขนาด 56 ไบต์

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

ลองออนไลน์!

คำอธิบาย

รุ่นนี้ใช้งานได้ใกล้เคียงกับรุ่นสุดท้ายยกเว้นว่าเราวนซ้ำ 9 ครั้งแทนที่จะเป็น 10 ครั้งโดยทิ้งค่าเดิมเอาไว้ ในการทำเช่นนี้เราต้องจัดเรียงวิธีการจัดการหน่วยความจำอีกเล็กน้อย ไบต์ทั้งหมดที่เราอาจบันทึกไว้โดยใช้วิธีการนี้จะได้รับการล้าง


46 ไม่เก็บหมายเลขเดิม :(
Jo King

@ โจกิ้งใช่มันแค่ทำ 2 หลัก ซึ่งฉันคิดว่าเป็นความตั้งใจของคำถามดังนั้นมันทำให้ฉันมีความสุขมาก
ข้าวสาลีตัวช่วยสร้าง

งานที่ดี! คุณได้รับรางวัล
FantaC



5

ทุบตี ,วันที่ 31 27 ไบต์

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

ลองออนไลน์!

ก่อน

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

จะพบหน้า man / bash help ได้อย่างไร? เกี่ยวกับ "{x..y..z}"? มันเรียกว่าอะไร?
Olivier Dulac

พบมัน: ใน man page ค้นหา [^.] \. \. [^.]: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 วิ9( ⍵ 9 9 9 9 9 9 9 9 9 9)

+\ - ผลรวมสะสม

(×⍵)/ - ขยายเวลา Signum โดยที่ Signum ให้ 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

5

Brain-Flak , 48 ไบต์

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

ลองออนไลน์!

ฉันอาจเพิ่มคำอธิบายในภายหลัง


ยอดเยี่ยม! ฉันพยายามรวม +9 กับความยาวเพื่อสร้างเคาน์เตอร์ แต่ฉันไม่เคยคิดที่จะทำแบบนั้นเลย
โจคิง


4

Mathematica ขนาด 25 ไบต์

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

ทำงานได้สำหรับ 0


0ไม่ทำงานสำหรับ สิ่งนี้จะไม่รวมถึงตัวเลขที่มีตัวเลขเพิ่มขึ้นเป็นตัวเลขมากกว่า 9 (เช่น9จะไม่มี99ในผลลัพธ์)
JungHwan Min

ฉันเห็นสิ่งที่คุณหมายถึง คุณตรวจสอบรหัส "ของฉัน" เท่านั้นหรือไม่ ทำให้รหัสจำนวนมากที่นี่ไม่ทำงานสำหรับ 0 ...
J42161217

1
Welp ฉันมักจะมุ่งเน้นไปที่รหัส Mathematica เพราะนั่นเป็นภาษาที่ฉันรู้จักดีที่สุด ไม่ได้หมายถึงการกำหนดเป้าหมายคุณหรืออะไรก็ตาม ฉันขอโทษถ้ามันดูเหมือนว่ามัน
JungHwan Min

ทั้งหมดคงที่และทำงานอยู่
J42161217

อะไร? ไม่มี builtin?
OldBunny2800

4

เยลลี่ 12 ไบต์

⁵²Ḷµ,³%9EµÐf

ลองออนไลน์!

มันทำงานอย่างไร

⁵²Ḷµ,³%9EµÐf
⁵             - literal 10
 ²            - square
  R           - lowered range: 0 to 99 inclusive.
   µ     µÐf  - filter based on:
    ,³          - element and input
      %9        - mod 9
        E       - are equal

1
เมื่อฉันใช้ 1 เป็นอาร์กิวเมนต์มันก็ให้ 100 ซึ่งไม่ใช่ตัวเลขสองหลัก
FantaC

สิ่งนี้ไม่แยกกรณี 0 และ 9
Ørjan Johansen


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-Flak , 54 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 48ไบต์

บันทึก 3 ไบต์ด้วย @WheatWizard

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

1
ลอง~-xแทน(x-1)
Wheat Wizard

1
ยังอยู่กับเคล็ดลับของ @ WheatWizard ลบช่องว่างในif ~-x%9
Felipe Nardi Batista

ตอนนี้คุณสามารถทำได้~-n==~-x%9or x==nเพื่อบันทึกไบต์
Wheat Wizard


ฉันต้องถามคำถามที่งี่เง่า ... ฉันจะรับรหัสนี้ให้ทำงานได้อย่างไร มีโครงสร้างบางอย่างที่นี่ฉันกำลังเรียนรู้เกี่ยวกับ (ส่วนใหญ่ผู้ประกอบการ ~)
อัลเลนฟิชเชอ




2

C (gcc), 55 bytes

f() need not actually be called with any argument; the n is just there instead of outside the function to save a byte.

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

Try it online!


You can save 2 bytes by putting the printf inside the loop header: Try it online!
DLosc

@DLosc myeah, but then it starts one number too late.
gastropner

The wording could be clearer, but the question does allow starting at (e.g.) 10 instead of 1: "... all of the possible two digit numbers that have that digital root. If you need it to, it can include [the single-digit number] itself, e.g. 05." In other words, including the single-digit number in the output is permitted but not required.
DLosc

2

Charcoal, 14 11 bytes

I∧N⁺Iθ×⁹…¹¹

Try it online! Link is to verbose version of code. Edit: Saved 2 bytes by not printing anything for zero input and 1 byte by using vectorising operations 3 bytes thanks to @ASCII-only. Explanation:

         ¹¹ 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


i think i just found an alternative that prints 0, here
ASCII-only

1

Julia 0.6, 18 bytes

I use a ternary to catch the 0 case, and a range n:9:99 to create the numbers. In julia a range is an AbstractVector and can be used in place of an actual Vector of numbers in most cases, but it will just print as 1:9:91 which doesn't satisfy the challenge, so I wrap it in [_;] to collect the contents into a Vector.

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

Try it online!






0

Gol><>, 12 bytes

I:ZhbF:N9+|;

Try it online!

How it works

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.