ลดจำนวนตามหลักที่ใหญ่ที่สุด


33

งาน:

ระบุตัวเลขจำนวนเต็มในระบบเลขฐานสิบให้ลดลงเป็นทศนิยมหนึ่งหลักดังนี้:

  1. แปลงตัวเลขเป็นรายการเลขทศนิยม
  2. ค้นหาตัวเลขที่ใหญ่ที่สุด D
  3. ลบ D ออกจากรายการ หากมีเหตุการณ์ D มากกว่าหนึ่งรายการให้เลือกรายการแรกจากด้านซ้าย (ที่ตำแหน่งที่สำคัญที่สุด) รายการอื่น ๆ ทั้งหมดควรยังคงเหมือนเดิม
  4. แปลงรายการผลลัพธ์เป็นตัวเลขทศนิยมและคูณด้วย D
  5. หากตัวเลขมากกว่า 9 (มีทศนิยมมากกว่า 1 หลัก) ให้ทำซ้ำขั้นตอนทั้งหมดแล้วป้อนผลลัพธ์เข้าไป หยุดเมื่อคุณได้รับผลลัพธ์ตัวเลขเดียว
  6. แสดงผล

ตัวอย่าง:

26364 -> 
1. 2 6 3 6 4 
2. The largest digit is 6, so D=6
3. There are two occurrences or 6: at positions 1 and 3 (0-based). We remove the left one,
    at position 1 and get the list 2 3 6 4 
4. we convert the list 2 3 6 4 to 2364 and multiply it by D:
   2364 * 6 = 14184
5. 14184 is greater than 9 so we repeat the procedure, feeding 14184 into it.

เราดำเนินการต่อโดยทำซ้ำขั้นตอนสำหรับ 14184 และต่อไปและเราจะผ่านผลกลางดังต่อไปนี้ในที่สุดก็มาถึง 8:

11312
3336
1998
1782
1376
952
468
368
288
224
88
64
24
8

ดังนั้นผลลัพธ์สำหรับ 26364 คือ 8

อินพุต:สตริงจำนวนเต็ม / a ที่แทนค่าจำนวนเต็ม

ผลลัพธ์:ตัวเลขหลักเดียวผลลัพธ์ของการลดที่นำไปใช้กับตัวเลข

กรณีทดสอบ:

9 -> 9
27 -> 4
757 -> 5
1234 -> 8
26364 -> 8
432969 -> 0
1234584 -> 8
91273716 -> 6

นี่คือดังนั้นคำตอบที่สั้นที่สุดเป็นไบต์ในแต่ละภาษาที่ชนะ


3
ซึ่งมันคือถ้าตัวเลขที่มีขนาดใหญ่กว่า 10หรือมีมากกว่า 1 ทศนิยมหลัก หมายเลข 10 มีตัวเลขทศนิยมมากกว่า 1 หลัก แต่ไม่มากกว่าสิบ
2560

@ Adámโดยการเข้ารหัส logics แล้วควร10 -> 10?
เอียนเอช

1
@ Adámคุณพูดถูกฉันควรเขียนว่า "ใหญ่กว่า 9" ฉันจะแก้ไขคำอธิบาย ขอบคุณ!
กาเลนอีวานอฟ

มีใครตรวจสอบฮิสโตแกรมของฟังก์ชั่นนี้สำหรับบริเวณที่มีขนาดใหญ่เพียงพอหรือไม่? ดูเหมือนจะมีเลขศูนย์เป็นจำนวนมาก ฉันยังมี 8s อีกมากมายในขณะที่เขียนกรณีทดสอบ
Galen Ivanov

2
นอกจากนี้ตัวเลขสุ่มหารด้วย 4 มีความน่าจะเป็น 3/5 ของผลิตภัณฑ์ของตัวเลขสองหลักสุดท้ายที่หารด้วย 8
Ørjan Johansen

คำตอบ:



11

JavaScript (ES6), 49 ไบต์

f=n=>n>9?f(""+n.replace(m=Math.max(...n),"")*m):n

f("26364")จะเข้าเป็นตัวแทนสตริงของจำนวนเต็มเช่น

กรณีทดสอบ



6

Pyth , 16 ไบต์

.WtH`*s.-ZKeSZsK

รับอินพุตเป็นสตริง ลองที่นี่! (ทางเลือก: .WtH`*s.-ZeSZseS)

Pyth , 18 ไบต์

.WgHT*s.-`ZKeS`ZsK

รับอินพุตเป็นจำนวนเต็ม ลองที่นี่!

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

16 byter

.WtH` * s. -ZKeSZsK ~ โปรแกรมเต็มรูปแบบ

.W ~ ใช้งานได้ในขณะที่ ในขณะที่ A (ค่า) คือความจริงค่า = B (ค่า)
                 ~ ค่าสุดท้ายจะถูกส่งกลับ
  tH ~ A, เงื่อนไข: คุณค่า [1:] จริงไหม? ความยาว≥ 2 หรือไม่
    `* s. -ZKeSZsK ~ B ผู้ตั้งตัว
       .- ~ การลบ Bagwise ใช้สำหรับการลบตัวเลขสูงสุดด้วย ...
         Z ~ ค่าปัจจุบัน Z และ ...
          KeSZ ~ ตัวเลขสูงสุดของ Z (เป็นสตริง) ยังกำหนดให้กับตัวแปร K
      s ~ ส่งไปเป็นจำนวนเต็ม
     * ~ คูณด้วย ...
              sK ~ ตัวเลขสูงสุด
    `~ แปลงเป็นสตริง

18 byter

.WgHT * s. -`ZKeS`ZsK ~ โปรแกรมเต็มรูปแบบ

.W ~ ใช้งานได้ในขณะที่ ในขณะที่ A (ค่า) คือความจริงค่า = B (ค่า)
                   ~ ค่าสุดท้ายจะถูกส่งกลับ
  gHT ~ A, เงื่อนไข: ค่า (H) ≥ 10 คืออะไร
     * s. -`ZKeS`ZsK ~ B, setter
       .- ~ การลบแบบ Bagwise (ใช้สำหรับการลบการเกิดขึ้นครั้งแรก)
         `Z ~ การแทนสตริงของ Z
           KeS`Z ~ และตัวละคร (lexicographically) สูงสุดของ Z (ตัวเลขสูงสุด)
                     นอกจากนี้ยังกำหนดให้ตัวแปรที่เรียกว่า K
      s ~ ส่งถึงจำนวนเต็ม
     * ~ คูณด้วย ...
                sK ~ K เข้าสู่ int

การที่ใกล้ชิดกับ Jelly ในประเภทของความท้าทายนั้นดีมากสำหรับ Pyth IMO :-)


6

Husk , 14 13 12 ไบต์

ขอบคุณ Zgarb สำหรับการบันทึก 1 ไบต์

Ω≤9oṠS*od-▲d

ลองออนไลน์!

คำอธิบาย:

Ω≤9            Repeat the following function until the result is ≤ 9
           d     Convert to a list of digits
         -▲      Remove the largest one
       od        Convert back to an integer
   oṠS*          Multiply by the maximum digit

12 ไบต์พร้อมการจัดเรียงใหม่
Zgarb

@Zgarb ขอบคุณฉันกำลังมองหาบางอย่างเช่นนั้น
H.PWiz

6

R , 99 95 ไบต์

f=function(x)"if"(n<-nchar(x)-1,f(10^(n:1-1)%*%(d=x%/%10^(n:0)%%10)[-(M=which.max(d))]*d[M]),x)

ลองออนไลน์!

ฟังก์ชั่นวนซ้ำ เพิ่มf(number)ในส่วนท้ายสามารถใช้ในการทดสอบค่าอื่น ๆ numberของ การนำไปปฏิบัติได้อย่างตรงไปตรงมาdคือรายการของตัวเลขและ10^(n:2-2)%*%d[-M]คำนวณจำนวนด้วยการลบตัวเลขที่ใหญ่ที่สุด


5

Python 2 , 72 ไบต์

f=lambda n:`n`*(n<=9)or f(int(`n`.replace(max(`n`),'',1))*int(max(`n`)))

ลองออนไลน์!


1
... ผมได้รับการแก้จุดบกพร่องผิดพลาดโง่ในนี้ Darn ฉันได้นินจามาแล้ว
สิ้นเชิงมนุษย์

ฉันได้รับข้อผิดพลาดในอินพุต 9
RoryT

432969นี้ดูเหมือนว่าจะล้มเหลวสำหรับกรณีทดสอบ "ValueError: ตัวอักษรที่ไม่ถูกต้องสำหรับ int () พร้อมฐาน 10: ''"
James Webster

@JamesWebster ควรได้รับการแก้ไขแล้ว
FlipTack

1
@recursive ไม่หากnเป็น 0 n*(n<=9)จะยังคงประเมินค่าที่เป็นเท็จ 0 ทำให้การเรียกใช้ซ้ำดำเนินการต่อและก่อให้เกิดข้อผิดพลาดในขณะที่สตริง'0'เป็นค่าความจริงและดังนั้นการเรียกซ้ำจึงหยุด
FlipTack


4

เยลลี่ 15 ไบต์

D×Ṁ$œṡṀ$FḌµ>9µ¿

ลองออนไลน์! หรือดูการทดสอบในตัว

อย่างไร?

D×Ṁ$œṡṀ$FḌµ>9µ¿ - Link: number, n
              ¿ - while:
             µ  - ...condition (monadic):
            9   -    literal 9
           >    -    loop value greater than (9)?
          µ     - ...do (monadic):               e.g. 432969
D               -    convert to a decimal list        [4,3,2,9,6,9]
   $            -    last two links as a monad:
  Ṁ             -      maximum                         9
 ×              -      multiply (vectorises)          [36,27,18,81,54,81]
       $        -    last two links as a monad:
      Ṁ         -      maximum                         81
    œṡ          -      split at first occurrence      [[36,27,18],[54,81]]
        F       -    flatten                          [36,27,18,54,81]
         Ḍ      -    convert from base 10              389421  (i.e. 360000 + 27000 + 1800 + 540 + 81)

4

Haskell , 70 67 66 ไบต์

บันทึกแล้ว3 4 ไบต์ขอบคุณ nimi!

f x|x<10=x|(a,b:c)<-span=<<(>).maximum$show x=f$read[b]*read(a++c)

ลองออนไลน์!


recursion untilอย่างชัดเจนจะสั้นกว่า ลองออนไลน์! .
nimi

อีกหนึ่งไบต์ที่จะบันทึก: ...span=<<(>).maximum....
nimi

โอ้ ... Nice :)
H.PWiz

4

C # (. NET Core) , 126 ไบต์

int F(int n){var x=(n+"").ToList();var m=x.Max();x.RemoveAt(x.IndexOf(m));return n>9?F(int.Parse(string.Concat(x))*(m-48)):n;}

ลองออนไลน์!


ยินดีต้อนรับสู่ PPCG! คุณสามารถลบพื้นที่
Erik the Outgolfer

@EriktheOutgolfer ขอบคุณที่พลาดไป
Timmeh

1
@tallyallyhuman ขอขอบคุณลงมาที่ 137 หลังจากทำการปรับโครงสร้างใหม่
Timmeh

คุณสามารถเปลี่ยนif(n<10)return n;...return F(...);เป็นการคืนแบบเดี่ยวด้วย ternary-if เช่นนี้: int F(int n){var x=(n+"").ToList();var m=x.Max(d=>d);x.RemoveAt(x.IndexOf(m));return n<10?n:F(int.Parse(string.Concat(x))*(m-48));}( 131 bytes )
Kevin Cruijssen

ฉันคิดว่าคุณต้องรวมusing System.Linq;(18 ไบต์) เป็นจำนวนไบต์
เอียนเอช

4

APL (Dyalog) , 36 35 33 ไบต์

-1 เนื่องจากข้อมูลจำเพาะ OP ที่อัปเดตแล้ว -2 ขอบคุณ ngn

ฟังก์ชันนำหน้าเงียบโดยไม่ระบุชื่อ ใช้จำนวนเต็มเป็นอาร์กิวเมนต์

{⍵>9:∇(⌈/×10⊥⊂⌷⍨¨⍳∘≢~⊢⍳⌈/)⍎¨⍕⍵⋄⍵}

ลองออนไลน์!

{... }ฟังก์ชั่นที่เป็นข้อโต้แย้ง:

⍵>9: ถ้าอาร์กิวเมนต์มากกว่า 9 ให้ทำดังนี้

  ⍕⍵ จัดรูปแบบ (stringify) อาร์กิวเมนต์

  ⍎¨ ดำเนินการ (ประเมิน) แต่ละอัน (ทำให้เรามีตัวเลขเป็นตัวเลข)

  () ใช้ฟังก์ชั่นโดยปริยายต่อไปนี้กับสิ่งเหล่านั้น

   ⌈/ ตัวเลขที่ใหญ่ที่สุด

   × ครั้ง

   10⊥ ถอดรหัสฐาน 10 ของ (รวบรวมตัวเลข)

    ตัวเลขทั้งหมด

   ⌷⍨¨ จัดทำดัชนีโดยแต่ละรายการ

   ⍳∘≢ฉัน ndices จำนวนตัวเลข

    แตกต่างจาก

   ⊢⍳⌈/ ตัวเลขที่ใหญ่ที่สุดของi ndex ในรายการตัวเลขทั้งหมด

   recurse (เช่นเรียกตนเอง) ในที่

 อื่น

   ส่งคืนอาร์กิวเมนต์ที่ไม่ได้แก้ไข


ไม่ควร>10จะเป็น>9?
Erik the Outgolfer

@EriktheOutgolfer อาจเป็นไปได้ แต่ OP ไม่ชัดเจน (ขัดแย้งกับตัวเอง) เกี่ยวกับเรื่องนี้
อดัม

เป็นเรื่องจริง แต่>9จะช่วยประหยัดไบต์
Erik the Outgolfer

@EriktheOutgolfer อัปเดตแล้ว
Adám

@ Adám∇แทน⍣ = สำหรับ -1 ไบต์: {⍵> 9: ∇ (⌈ / ... ⋄⍵}
2560

3

Perl 6 ,  45  41 ไบต์

{($_,{$/=.comb.max;S/"$/"//*$/}...10>*).tail}

ทดสอบมัน

{($_,{S/"{.comb.max}"//*$/}...10>*).tail}

ทดสอบมัน

ขยาย:

{  # bare block lambda with implicit parameter 「$_」

  (  # generate the sequence

      $_,                      # start the sequence with the input

      {                        # generate the rest of the values in the sequence

          S/                   # find and replace (not in-place)
            "{  .comb.max  }"  # find the max digit and match against it
          //                   # replace it with nothing
          *                    # multiply the result with
          $/                   # the digit that was removed
      }

      ...                      # keep generating values until

      10 > *                   # the value is less than 10

  ).tail                       # get the last value from the sequence
}

3

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

{1`(..+)?
1$&;$&
O`\G\d
.+((.);.*?)\2
$1
\d+
$*
1(?=.*;(1+))|.
$1
1

ลองออนไลน์! ลิงค์นั้นรวมถึงกรณีทดสอบที่เร็วพอที่จะไม่ใช้เซิร์ฟเวอร์ของเดนนิส คำอธิบาย:

{1`(..+)?
1$&;$&

สำหรับตัวเลขสองหลักนี้จะทำซ้ำหมายเลขด้วย ;ตัวคั่นโดยนำหน้า 1 ไปเป็นที่ซ้ำกัน สำหรับตัวเลขหนึ่งตัวนำหน้า1;หมายเลขนี้

O`\G\d

เรียงตัวเลขของซ้ำ (สำหรับตัวเลขหนึ่งตัวสิ่งนี้ไม่มีผล)

.+((.);.*?)\2
$1

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

\d+
$*
1(?=.*;(1+))|.
$1
1

คูณตัวเลขด้วยหลัก สำหรับตัวเลขหนึ่งตัวผลลัพธ์นี้จะเป็นหมายเลขดั้งเดิมและการวนซ้ำจะสิ้นสุดลง มิฉะนั้นโปรแกรมจะวนซ้ำจนกว่าจะถึงตัวเลขหลักเดียว


3

C # (.NET Core) , 177 164 + 18 ไบต์

บันทึกแล้ว 13 ไบต์ขอบคุณ @raznagul!

int f(int n){string s=n+"",m=s.Max(d=>d)+"";if(n<10)return n;var x=s.ToList();x.RemoveAt(s.IndexOf(m));int y=int.Parse(string.Join("",x))*int.Parse(m);return f(y);}

ลองออนไลน์!


คุณสามารถเปลี่ยนไปs.Length<2 n<10นอกจากนี้คุณสามารถลบผู้ประกอบการที่ประกอบไปด้วยและreturn f(y)ในตอนท้ายเนื่องจากกรณีได้รับการจัดการโดยifในขั้นตอนต่อไปของการเรียกซ้ำ
raznagul

3

Java 8, 126 104 ไบต์

n->{for(;n>9;n=new Long((n+"").replaceFirst((n=(n+"").chars().max().getAsInt()-48)+"",""))*n);return n;}

-22 ไบต์ขอบคุณ@ OlivierGrégoire @

คำอธิบาย:

ลองที่นี่

n->{         // Method with long as both parameter and return-type
  for(;n>9;  //  Loop as long as the number contains more than 1 digit
    n=       //   Replace the current number with:
      new Long((n+"").replaceFirst((n=(n+"").chars().max().getAsInt()-48)+"",""))
             //    Remove the first largest digit from the number,
      *n     //    and multiply this new number with the removed digit
  );         //  End of loop
  return n;  //  Return the result
}            // End of method


1
104 ไบต์ (เหมือนข้างบน แต่ทำซ้ำแทนที่จะวนซ้ำยัง: n>9และย้อนกลับเงื่อนไขแทนn<10)
Olivier Grégoire

2

Jq 1.5 , 86 ไบต์

until(.<10;"\(.)"|(./""|max)as$v|index($v)as$x|.[:$x]+.[1+$x:]|tonumber*($v|tonumber))

ขยาย

until(
    .<10                    # until number is below 10
  ; "\(.)"                  # convert to string
  | (./""|max) as $v        # find largest digit, call it $v
  | index($v) as $x         # find index of digit
  | .[:$x]+.[1+$x:]         # remove digit
  | tonumber*($v|tonumber)  # convert back to number and multiply by $v
)

ลองออนไลน์!



2

Lua, 137 108 ไบต์

function f(n)while n>9 do b="0"g=b.gsub g(n,".",function(m)b=math.max(m,b)end)n=b*g(n,b,"",1)end print(n)end

ขอบคุณ Jonathan S สำหรับการเล่นกอล์ฟ 29 ไบต์

ลองออนไลน์!



ขอบคุณ ที่มีค่าควรสำหรับคำตอบของตัวเอง - จะเชื่อมโยงไปยังโพสต์ที่คุณสร้างไว้มิฉะนั้นจะแก้ไข & เครดิต
MCAdventure10

เพิ่งแก้ไขได้ยังเป็นรหัสของคุณฉันยังไม่ได้เขียนตั้งแต่เริ่มต้น
Jonathan S.

2

D , 188 186 185 ไบต์

import std.conv,std.algorithm;T f(T,U=string)(T u){if(u<10)return u;T[]r;u.text.each!(n=>r~=n.to!T-48);T m=r.maxElement;U s;r.remove(r.maxIndex).each!(n=>s~=n.to!U);return f(m*s.to!T);}

ลองออนไลน์!

ฉันเกลียดการประเมินที่ขี้เกียจมาก ยินดีต้อนรับเคล็ดลับใด ๆ !


2

Lua, 154 ไบต์

ฉันควรมีวิธีที่จะตีกอล์ฟนี้ฉันกำลังทดลองอยู่

n=...z=table
while n+0>9 do
t={}T={}n=n..''n:gsub(".",function(c)t[#t+1]=c T[#T+1]=c
end)z.sort(t)x=t[#t]z.remove(T,n:find(x))n=z.concat(T)*x
end
print(n)

ลองออนไลน์!

คำอธิบาย

n=...                    -- define n as a shorthand for the argument
z=table                  -- define z as a pointer to the object table
while n+0>9              -- iterate as long as n is greater than 9
do                       -- n+0 ensure that we're using a number to do the comparison
  t={}                   -- intialise two tables, one is used to find the greatest digit
  T={}                   -- the other one is used to remove it from the string
  n=n..''                -- ensure that n is a string (mandatory after the first loop)
  n:gsub(".",function(c) -- apply an anonymous function to each character in n
               t[#t+1]=c -- fill our tables with the digits
               T[#T+1]=c
             end)        
  z.sort(t)              -- sort t to put the greatest digit in the last index
  x=t[#t]                -- intialise x to the value of the greatest digit
  z.remove(T,n:find(x))  -- remove the first occurence of x from the table T 
                         -- based on its position in the input string
  n=z.concat(T)*x        -- assign the new value to n
end                      -- if it still isn't a single digit, we're looping over again
print(n)                 -- output the answer

2

PowerShellขนาด 123 ไบต์

[Collections.ArrayList]$a=[char[]]"$args"
while(9-lt-join$a){$a.remove(($b=($a|sort)[-1]));$a=[char[]]"$(+"$b"*-join$a)"}$a

ลองออนไลน์!

Ooof PowerShell อาร์เรย์ไม่เปลี่ยนรูปดังนั้นเราต้องใช้การ[Collections.ArrayList]คัดเลือกนักแสดงที่นี่เพื่อให้เราสามารถโทรได้ใน.remove()ภายหลัง

จะเข้า$argsมาแปลงเป็นสตริงแล้วchar-array ArrayListแล้ว ร้านค้าที่เข้า$aมา จากนั้นเราก็ห่วงจนกว่าเราจะอยู่ที่หรือต่ำกว่าwhile 9การวนซ้ำแต่ละครั้งเราเรียก.removeองค์ประกอบที่ใหญ่ที่สุดของ$a(ทำโดยsortและรับองค์ประกอบสุดท้าย[-1] ) โดยจัดเก็บองค์ประกอบที่ใหญ่ที่สุดใน$bเวลาเดียวกัน สิ่งนี้เกิดขึ้นเพราะค่า ASCII เรียงตามแบบเดียวกับตัวอักษร

ต่อไปเราจะคำนวณใหม่$aอีกครั้งในฐานะ - charเรย์ (และArrayListโดยปริยาย) โดยการแปลงของเรา$b(ซึ่งปัจจุบันคือchar) ไปยังสตริงจากนั้นจึงเป็น int ด้วย+และการคูณนั้นเพื่อ$a -joinเอ็ดเป็นสตริง สิ่งนี้สอดคล้องกับส่วน "คูณด้วย D" ของความท้าทาย

ในที่สุดเมื่อเราออกจากลูปแล้วเราก็ใส่$aไปป์ไลน์และเอาท์พุทก็เป็นนัย


2

Pip , 22 21 ไบต์

Wa>9a:aRAa@?YMXax*:ya

รับอินพุตเป็นอาร์กิวเมนต์บรรทัดคำสั่ง ตรวจสอบกรณีทดสอบทั้งหมด: ลองออนไลน์!

คำอธิบาย

Ungolfed พร้อมความคิดเห็น:

                 a is 1st cmdline arg
W a>9 {          While a > 9:
  Y MXa           Yank max(a) into y
  a RA: a@?y ""   Find index of y in a; replace the character at that position with ""
  a *: y          Multiply a by y
}
a                Autoprint a

ในเวอร์ชัน golfed ตัวลูปจะถูกรวมเป็นนิพจน์เดียว:

a:aRAa@?YMXax*:y
        YMXa      Yank max(a)
     a@?          Find its index in a
  aRA       x     Replace at that index with x (preinitialized to "")
             *:y  Multiply that result by y (using : meta-operator to lower the precedence)
a:                Assign back to a


2

Java 8: 115 ไบต์


-10 ไบต์ขอบคุณ Jo King

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

long f(long n){int m=(n+"").chars().max().getAsInt()-48;return n>9?f(new Long((n+"").replaceFirst(""+m,""))*m):n;};

ลองออนไลน์


คุณสามารถย้าย-48จากแผนที่ไปยังจุดสิ้นสุดของmคำจำกัดความ ลองออนไลน์! นอกจากนี้คุณยังมีช่องว่างพิเศษในลิงค์ TIO ของคุณ
Jo King

@ โจกิ้งขอบคุณ
Benjamin Urquhart

1

J, 40 ไบต์

((]*<^:3@i.{[)>./)&.(10&#.inv)^:(9&<)^:_

ลองออนไลน์!

คำอธิบาย

(      iterate                   )^:(9&<)^:_    NB. keep iterating while the number is > 9
 (     stuff         )&.(10&#.inv)              NB. convert to digits, do stuff, convert back to number
 (           )>./)                              NB. stuff is a hook, with max digit >./  on the right
 (]*<^:3@i.{[)                                  NB. so that in this phrase, ] means "max" and [ means "all digits"
  ]                                             NB. the max digit...
   *                                            NB. times...        
    <^:3@                                       NB. triple box...
         i.                                     NB. the first index of the max in the list of all digits
           {                                    NB. "from" -- which because of the triple box means "take all indexes except..."
            [                                   NB. from all the digits of the number

1
ฉันเรียนรู้เกี่ยวกับการเลือกกล่องแบบสามทางจากคุณวันนี้ขอบคุณ!
Galen Ivanov

1

PowerShellขนาด 230 ไบต์

$n="$args";do{$n=$n.ToString();$a=@();0..$n.Length|%{$a+=$n[$_]};$g=[convert]::ToInt32(($a|sort|select -last 1),10);[regex]$p=$g.ToString();[int]$s=$p.replace($n,'',1);if($n.Length-eq1){$n;exit}else{$r=$s*$g}$n=$r}until($r-lt10)$r

ลองออนไลน์!

เสียมากเกินไปกับการหล่อทุกประเภท


1

PHP, 82 77 + 1 ไบต์

for($n=$argn;$n>9;)$n=join("",explode($d=max(str_split($n)),$n,2))*$d;echo$n;

ทำงานเป็นท่อที่มี-nRหรือลองออนไลน์


1

dc , 98 85 ไบต์

?dsj[0dsosclj[soIlc^sr0]sn[I~dlo!>nrlc1+scd0<i]dsixljdlr%rlrI*/lr*+lo*dsj9<T]sT9<Tljp

ขอบคุณมากสำหรับคำตอบนี้สำหรับแนวคิดในการใช้~การแยกตัวเลขจากตัวเลขทำให้มีการบันทึกสองไบต์บนรหัสต้นฉบับ

นี่เป็นสิ่งที่ค่อนข้างจะสมบูรณ์dcด้วยความสามารถในการจัดการสตริงที่ไม่มีอยู่

ลองออนไลน์!


1

Bash, 80 ไบต์

แพคเกจการใช้งานหลักของยูทิลิตี้ (สำหรับsortและtail) grepและ

while((n>9));do m=$(grep -o .<<<$n|sort|tail -n1);n=$((${n/$m/}*m));done;echo $n

มันทำงานยังไง?

while (( n > 9 )); do  # C-style loop conditional
    grep -o .          # Separate the string into one char per line
              <<< $n   # Use the content of variable `n` as its stdin
    | sort             # Pipe to `sort`, which sorts strings by line
    | tail -n 1        # Take the last line

m=$(                 ) # Assign the output of the command chain to `m`
n=$((          ))      # Assign the result of the evaluation to n
     ${n/$m/}          # Replace the first occurrence of $m with empty
             *m        # ... and multiply it by the value of `m`
done; echo $n          # After loop, print the value of `n`
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.