พิมพ์รูทดิจิทัล


19

สิ่งนี้แตกต่างจากMy Word ที่สามารถเอาชนะ Word ของคุณได้เนื่องจากมีความซับซ้อนน้อยกว่าและต้องการให้คุณคำนวณเท่านั้นและไม่เปรียบเทียบมัน

ในการค้นหารูทดิจิทัลใช้ตัวเลขทั้งหมดของตัวเลขเพิ่มและทำซ้ำจนกว่าคุณจะได้รับตัวเลขหนึ่งหลัก ตัวอย่างเช่นถ้าตัวเลขเป็น12345คุณจะต้องเพิ่ม1, 2, 3, 4และได้รับ5 15จากนั้นคุณจะเพิ่ม1และให้คุณ56

งานของคุณ

ได้รับจำนวนเต็มN (0 <= N <= 10000) ผ่านSTDINพิมพ์รากดิจิตอลN

กรณีทดสอบ

1 -> 1
45 -> 9
341 -> 8
6801 -> 6
59613 -> 6
495106 -> 7

จำไว้ว่านี่คือดังนั้นโค้ดที่มีจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ


1
อาจเป็นภารกิจย่อยของความท้าทายนี้
nimi

3
มีความเกี่ยวข้องอย่างใกล้ชิดกับความท้าทายนี้ ... อาจใกล้เคียงกับคู่ปรับ
AdmBorkBork

8
numberกรุณามีความแม่นยำมากขึ้นเมื่อพูด โดยเฉพาะอย่างยิ่ง. ต้องป้อนข้อมูล0ได้รับการสนับสนุน?
Ton Hospel

2
@TimmyD STALEMATEผมคิดว่าอันนี้เป็นความท้าทายที่ทำความสะอาดมากโดยไม่ต้องเพิ่มตัวอักษรเพื่อการแปลงจำนวนเต็มคอมพิวเตอร์ฟังก์ชั่นสำหรับสองค่านิยมและรวมทั้งตัวอักษร มันอาจจะดีกว่าที่จะปิดอีกอันหนึ่งเป็นคู่หูของสิ่งนี้
Martin Ender

3
@ มาร์ตินอีกต่อไปฉันถอนการโหวตอย่างใกล้ชิดของฉันฉันคิดว่ามันไม่ยุติธรรมที่จะปิดความท้าทายที่ดีเนื่องจากเป็นกลุ่มของความท้าทายที่ซับซ้อนยิ่งขึ้นอีก
Erik the Outgolfer

คำตอบ:



17

เยลลี่ , 7 5 4 3 ไบต์

ḃ9Ṫ

TryItOnline! หรือกรณีทดสอบทั้งหมด

อย่างไร?

รากดิจิตอลเป็นที่รู้จักกันที่จะปฏิบัติตามสูตร (n-1) 9% + 1
นี่เป็นตัวเลขเดียวกับหลักสุดท้ายในฐาน bijective 9
(และเนื่องจากการใช้งาน0ḃ9=[]และ[]Ṫ=0สิ่งนี้จะจัดการกับกรณีขอบของศูนย์)

ḃ9Ṫ - Main link: n
ḃ9  - convert to bijective base 9 digits (a list)
  Ṫ - tail (get the last digit)

13

JavaScript (ES6), 16 10 ไบต์

n=>--n%9+1

กรณีทดสอบ


6

MATL , 3 ไบต์

9X\

ลองออนไลน์!

(คำตอบที่ถูกลบไปแล้วจำนวนมาก) พยายามใช้ modulo 9 เพื่อให้ได้ผลลัพธ์ นี้เป็นทางลัดที่ดี แต่น่าเสียดายที่ไม่ได้ผลสำหรับหลายรายการ 9. MATL [1, n]มีฟังก์ชั่นสำหรับการโมดูโลในช่วงเวลา การใช้โมดูโล่นี้เรามี1 % 3 == 1, 2 % 3 == 2, 3 % 3 == 3, 4 % 3 == 1ฯลฯ คำตอบนี้ใช้อินพุทโมดูโลเก้าโดยใช้โมดูโล่แบบกำหนดเองนี้


6

Mathematica, 27 11 ไบต์

Mod[#,9,1]&

Mathematica Modใช้พารามิเตอร์ที่สามเป็นออฟเซ็ตของช่วงผลลัพธ์ของโมดูโล สิ่งนี้หลีกเลี่ยงการลดอินพุตและการเพิ่มเอาต์พุต


6

Python 16 16ไบต์

+4 ไบต์เพื่อจัดการกรณีขอบเป็นศูนย์

lambda n:n and~-n%9+1

repl.it


1
ว้าว. นี่เป็นเรื่องง่ายที่จะสามารถนำไปใช้กับภาษาใดก็ได้ คุณสามารถทำได้~-input()%9+1
Karl Napf

1
ไม่ได้ผลสำหรับ 0 อย่างน่าเสียดาย
Emigna

@KarlNapf นั้นจะไม่ต้องการprintหรือไม่
Jonathan Allan

@JonathanAllan Ah เป็นไปได้ ฉันเพิ่งทดสอบในสภาพแวดล้อม REPL และนั่นก็ทำ
Karl Napf

1
@ ผู้ใช้ที่ไม่ระบุตัวตนซึ่งพยายามแก้ไข - มันจะทำให้รหัสเสียจริง (ทำอินพุต0ผลลัพธ์9มากกว่า0ซึ่งเป็นสิ่งที่รองรับโดยn andส่วนหนึ่งของรหัส) และจะนับเป็น 19 ไบต์ไม่ใช่ 13 ( ตั้งแต่printและจะต้องนับพื้นที่)
Jonathan Allan

4

Julia ขนาด 12 ไบต์

!n=mod1(n,9)

หรือ

n->mod1(n,9)

mod1เป็นอีกทางเลือกกับผู้modที่แมปกับช่วงแทน[1, n][0, n)


4

PHP, 15 ไบต์

<?=--$argn%9+1;

PHP รุ่นก่อนหน้า, 55 ไบต์

$n=$argn;while($n>9)$n=array_sum(Str_split($n));echo$n;

ฉันจะทำอย่างไร!
CT14.IT

@ CT14.IT ฉันสามารถลบโพสต์นี้ได้ถ้าต้องการ โพสต์ที่ถูกลบของคุณแล้ว 1 นาทีก่อนหน้านี้และคุณลืมวงในขณะที่เพียง
JörgHülsermann

ไม่คำตอบที่ถูกลบนั้นผิดเพราะฉันไม่ได้อ่านคำถามอย่างถูกต้องตั้งแต่แรกฉันไม่ได้พยายามหาผลรวมของจำนวนที่สร้างขึ้น
CT14.IT

2
คุณสามารถเพิ่มเคล็ดลับของคำตอบอื่น ๆ ได้<?=--$argv[1]%9+1?>
Crypto

3

Haskell, 35 34 ไบต์

until(<10)$sum.map(read.pure).show

ลองใช้กับ Ideone

คำอธิบาย:

until(<10)$sum.map(read.pure).show
                              show  -- convert int to string
               map(         ).      -- turn each char (digit) into
                        pure        --    a string 
                   read.            --    and then a number
           sum.                     -- sum up the list of numbers
until(<10)$                         -- repeat until the result is < 10

3

Perl, 15 ไบต์

รวมถึง +2 สำหรับ -lp

ให้อินพุตบน STDIN

root.pl <<< 123

root.pl

#!/usr/bin/perl -lp
$_&&=~-$_%9+1

นี่เป็นโซลูชันที่น่าเบื่อที่มีให้ในหลายภาษาแล้ว แต่อย่างน้อยรุ่นนี้0ก็รองรับเช่นกัน

สิ่งที่น่าสนใจกว่าคือการเพิ่มสิ่งที่เกิดขึ้นจริงซ้ำ ๆ (แม้ว่าจะอยู่ในลำดับอื่น ๆ ) จริงๆแล้วมีความยาวเพียง 1 ไบต์:

#!/usr/bin/perl -p
s%%$_+=chop%reg

3

R, 72 67 29 ไบต์

แก้ไข: ขอบคุณ @rturnbull สำหรับการลบสองไบต์

n=scan();`if`(n%%9|!n,n%%9,9)

ฉันเพิ่งเรียนรู้ว่าifelseสามารถถูกแทนที่`if`ด้วยพฤติกรรมที่เหมือนกันซึ่งช่วยให้คุณประหยัดได้ไม่กี่ไบต์
rturnbull

@rtbull ฉันมักจะสงสัยว่า ` if` ทำงานอย่างไร คุณสามารถยกตัวอย่างหรือเพิ่มลงใน เคล็ดลับสำหรับการเล่นกอล์ฟได้หรือไม่
Billywob

ifelseวิธีที่ง่ายที่สุดที่จะเข้าใจมันก็คือว่ามันไม่ใช่ vectorized ในกรณีนี้`if`(n%%9|!n,n%%9,9)แสดงพฤติกรรมที่เหมือนกันกับรหัสที่คุณโพสต์ เท่าที่ฉันสามารถบอกได้พฤติกรรมนี้ไม่มีเอกสาร! ฉันจะเพิ่มความคิดเห็นในหัวข้อเคล็ดลับ
rturnbull

3

เรติน่า 7 ไบต์

{`.
*
.

ลองออนไลน์!

ฉันเห็นโซลูชันทางคณิตศาสตร์มากมาย แต่ใน Retina วิธีการที่ตรงไปตรงมาดูเหมือนจะดีที่สุด

คำอธิบาย

{`ทำให้โปรแกรมทั้งหมดทำงานในลูปจนกว่าสตริงจะไม่เปลี่ยนอีกต่อไป การวนซ้ำประกอบด้วยสองขั้นตอน:

.
*

แปลงตัวเลขแต่ละหลักเป็นเอก

.

นับจำนวนตัวอักษร (= แปลงจำนวนยูนารีให้เป็นทศนิยม)

วิธีนี้ใช้งานได้เนื่องจากการแปลงแต่ละหลักให้เป็นเอกเทศโดยไม่มีตัวคั่นระหว่างตัวเลขจะสร้างหมายเลขแบบเอกนารีเดียวซึ่งเท่ากับผลรวมของตัวเลขทั้งหมด


2

Brachylogขนาด 9 ไบต์

#0|@e+:0&

ลองออนไลน์!

คำอธิบาย

#0            Input = Output = a digit
  |           OR
   @e         Split the input into a list of digits
     +        Sum
      :0&     Call this predicate recursively

ทางเลือกวิธี 11 ไบต์

: ผม: {@ + e} I # 0

อันนี้ใช้ meta-predicate i - Iterateเพื่อเรียกIเวลาเพรดิเคต{@e+}บนอินพุต สิ่งนี้จะลองใช้ค่าIจาก0ถึงอนันต์จนกว่าจะทำให้ค่าผลลัพธ์iเป็นตัวเลขหลักเดียวซึ่งทำให้#0เป็นจริง


2

JavaScript (ES6), 41 38 ไบต์

บันทึกแล้ว 3 ไบต์ขอบคุณ Bassdrop Cumberwubwubwub

รับและส่งคืนสตริง

f=s=>s[1]?f(''+eval([...s].join`+`)):s

กรณีทดสอบ


4
คุณสามารถเปลี่ยนs.split``เป็น[...s]
Bassdrop Cumberwubwubwub

2

CJam , 19 13 ไบต์

r{:~:+_s\9>}g

ล่าม

คำอธิบาย:

r{:~:+_s\9>}g Code
r             Get token
 {:~:+_s\9>}  Block: :~:+_s\9>
   ~          Eval
  :           Map
     +        Add
    :         Map
      _       Duplicate
       s      Convert to string
        \     Swap
         9    9
          >   Greater than
            g Do while (pop)

ขอบคุณ 8478 (Martin Ender) สำหรับ -6 ไบต์


CJam, 6 ไบต์

ri(9%)

แนะนำโดย 8478 (Martin Ender) ล่าม

ฉันกำลังคิดเกี่ยวกับมัน แต่มาร์ตินเพิ่งได้รับก่อนที่ฉัน คำอธิบาย:

ri(9%) Code
r      Get token
 i     Convert to integer
  (    Decrement
   9   9
    %  Modulo
     ) Increment

แผนที่คำสั่งเดียวและลดทั้งสองจะสามารถเขียนด้วยคำนำหน้าเพื่อให้คุณสามารถทำ: :~:+นอกจากนี้ยังไม่เจ็บที่จะเรียกใช้บล็อกอย่างน้อยหนึ่งครั้งเพื่อให้คุณสามารถใช้การgวนซ้ำแทนการwวนซ้ำ
Martin Ender

@ มาร์ตินเอนเดอร์r{_,1>}{:~:+`}wทำงานได้ แต่ฉันไม่รู้ว่าบนโลกนี้ฉันควรจะใช้gที่นี่อย่างไร
Erik the Outgolfer

เช่นนี้r{:~:+_s\9>}g(แน่นอนการแก้ปัญหารูปแบบปิดri(9%)จะสั้นกว่ามาก
Martin Ender

@ มาร์ตินเอนเดอร์โอ้จริงแล้วตอนนี้ฉันช่างเป็นมือใหม่ ...
Erik the Outgolfer

อันที่สองไม่ทำงานกับทวีคูณของ 9
ThePlasmaRailgun

2

Java 7, 63 ไบต์

int f(int n){int s=0;for(;n>0;n/=10)s+=n%10;return s>9?f(s):s;}

ฟังก์ชั่นวนซ้ำซึ่งเพิ่งได้รับตัวเลขด้วย mod / div ไม่มีอะไรแฟนซี

พอร์ตราคาถูก

ของJonathan Allanจะเป็น 28 ไบต์ที่เลวทรามต่ำช้า:

int f(int n){return~-n%9+1;}

1

Python 2, 54 51 ไบต์

i=input()
while~-len(i):i=`sum(map(int,i))`
print i 

ขอบคุณ Oliver และ Karl Napf ที่ช่วยฉันประหยัด 3 ไบต์


คุณสามารถเปลี่ยนwhile len(i)>1เพื่อwhile~-len(i)ที่จะบันทึกหนึ่งไบต์
Oliver Ni

ฉันคิดว่าคุณสามารถละเว้นเห็บรอบ ๆinput()และบังคับให้อินพุตถูกล้อมรอบด้วยเครื่องหมายคำพูดเพื่อบันทึก 2 ไบต์
Karl Napf

@KarlNapf ฉันไม่คิดว่าคุณจะทำสิ่งนี้ได้เมื่อข้อมูลป้อนเข้าเป็นจำนวนเต็ม
Erik the Outgolfer

@EriktheGolfer ผู้ปฏิบัติการกล่าวว่าอินพุตสามารถใช้เป็นสตริงได้
Daniel

1

Python ขนาด 45 ไบต์

f=lambda x:x[1:]and f(`sum(map(int,x))`)or x

รับอาร์กิวเมนต์เป็นสตริง



1

C, 64 29 ไบต์

พอร์ต C จากคำตอบของJonathan Allan (พร้อมกรณีพิเศษ 0)

f(i){return i>0?~-i%9+1:0;}

รหัส 64 ไบต์ก่อนหน้า:

q(i){return i>9?i%10+q(i/10):i;}
f(i){i=q(i);return i>9?f(i):i;}

qใช้เวลาผลรวมไขว้และfทำซ้ำการรวมกันข้ามจนหลักเดียว


1

เรติน่า 15 ไบต์

.+
$*
1{9}\B

1

ลองออนไลน์! (บรรทัดแรกเปิดใช้งานชุดทดสอบที่แยกบรรทัดด้วยฟีด)

คำอธิบาย

.+
$*

แปลงอินพุตเป็น unary

(1{9})*\B

รับโมดูโล่แบบ 1 ตัวโดยการลบเก้าที่มีอักขระอย่างน้อยหนึ่งตัวขึ้นไป

1

นับจำนวน 1s ที่เหลือเพื่อแปลงกลับเป็นทศนิยม


1

Perl 6 , 29 ไบต์

{($_,*.comb.sum...10>*)[*-1]}

ขยาย:

{ # bare block lambda with implicit parameter 「$_」
  ( # generate a sequence

    $_,         # starting with the input
    *.comb.sum  # Whatever lambda that splits into digits, and finds sum
    ...         # keep doing that
    10 > *      # until it is less than 10

  )[ * - 1 ] # get the last value
}


1

เขาวงกต 8 ไบต์

?(_9%)!@

ใช้สมการ(n-1)%9+1:

  • ? อ่านอินพุตเป็นทศนิยมและส่งไปที่สแต็ก
  • ( ลดค่าส่วนบนสุดของสแต็ก
  • _ ดันศูนย์บนด้านบนของสแต็ก
  • 9 ดันด้านบนของสแต็คที่ผุดคูณ 10 หลัก (ในกรณีนี้ 9)
  • % ปรากฏ y, ปรากฏ x, กด x% y
  • ) เพิ่มชั้นบนสุดของสแต็ก
  • ! ดึงส่วนบนสุดของสแต็กออกมาวางเป็นสตริงทศนิยม
  • @ ยุติโปรแกรม

1

Pyth - 7 4 6 7 ไบต์

ไม่ใช่คำตอบที่ดีที่สุด แต่ก็ยังมีคำตอบอยู่พอสมควร:

|ejQ9 9

เช่นเดียวกับรุ่นก่อนหน้านี้ แต่การจัดการกรณีของทวีคูณของ 9 ใช้ตรรกะหรือ


รุ่นนี้ล้มเหลวในการทดสอบ 45 ครั้ง :

ejQ9

คำอธิบาย:

 jQ9  -> converting the input to base 9
e     -> taking the last digit

ลองที่นี่

ลองรุ่นก่อนหน้าที่นี่!


โซลูชันก่อนหน้า:

&Qh%tQ9

คำอธิบาย :

    tQ    -> tail: Q-1
   %tQ9   -> Modulo: (Q-1)%9
  h%tQ9   -> head: (Q-1)%9+1
&Qh%tQ9   -> Logical 'and' - takes the first null value. If Q is 0 - returns zero, otherwise returns the (Q-1)%9+1 expression result

คุณได้รับเชิญให้ลองที่นี่ !


รุ่น 4 ไบต์ของคุณล้มเหลวกรณีทดสอบ45
เดนนิส

สิ่งนี้จะไม่ให้ 0 สำหรับผลคูณของ 9 หรือไม่
xnor

ใช่ฉันเพิ่งสังเกตเห็น จะทำการแก้ไขบางอย่างที่นั่น เห็นได้ชัด jQ9ว่าไม่ได้ทำตัวเหมือนเยลลี่ḃ9:-P
Yotam Salmon


1

Hexagony, 19 15 ไบต์

.?<9{(/>!@!/)%' 

อ่านเพิ่มเติม:

  . ? < 
 9 { ( /
> ! @ ! / 
 ) % ' .
  . . . 

ลองออนไลน์!

-3 ไบต์โดยใช้วิธีการที่ต่างกันทำให้ 0 edge case เป็นเรื่องเล็กน้อย
-1 ไบต์โดยแก้ไขบั๊กเคส 0 edge

การใช้สูตร ((n-1) mod 9) + 1 เหมือนโซลูชันอื่น ๆ มากมายเช่นกัน


1

K (oK) , 9 ไบต์

วิธีการแก้:

(+/.:'$)/

ลองออนไลน์!

คำอธิบาย:

ตรงไปตรงมาสุด แบ่งจำนวนออกเป็นตัวเลขและสรุปผล - ทำสิ่งนี้จนกว่าผลลัพธ์จะมาบรรจบกัน:

(+/.:'$)/ / the solution
(      )/ / do this until result converges
      $   / string, 1234 => "1234"
   .:'    / value each, "1234" => 1 2 3 4
 +/       / sum over, 1 2 3 4 => 10

1
ในการติดตั้ง k ของฉันฉันได้x\yเข้ารหัสเป็นyฐานxโดยมีจำนวนมากที่สุดเท่าที่จำเป็นดังนั้นจึงสั้นกว่าเล็กน้อย:(+/10\)/
ngn

ดี ใน kdb รุ่นที่ใหม่กว่า + (ฉันคิดว่าตั้งแต่ 3.4 ขึ้นไป) คุณสามารถทำได้10\:.. แต่ไม่ได้อยู่ใน oK - และ.:'$เป็นจำนวนไบต์เดียวกัน - ดังนั้นฉันจึงไปกับมัน :)
streetster

oK ใช้ \ และต้องการรายการทางด้านซ้าย: `(, 10)`
ngn

อันที่จริงการใช้งานของคุณเพิ่ม "มากที่สุดเท่าที่จำเป็น" ซึ่งเป็นสิ่งที่คุณได้รับจาก\:ใน kdb + (3.4+) แต่สำหรับโอเคฉันต้องรู้ว่า 10s ที่จะใส่ในรายการของฉัน
ท้องถนน

1

Kegขนาด 6 ไบต์ (SBCS บน Keg wiki)

¿;9%1+

คำอธิบาย:

¿#      Take implicit input
 ;9%1+# Digital Root Formula
# Implicit output

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