การยุบตัวเลข


23

ลองกำหนดฟังก์ชั่นกับจำนวนธรรมชาติnซึ่งเขียนเป็นฐาน 10 หลักdkdk1d1d0ดังนี้:

ตราบใดที่มีตัวเลขที่อยู่ติดกันเท่ากับdidi1 , แทนที่ด้วยผลรวมdi+di1จากซ้ายไปขวา หากมีตัวเลขดังกล่าวให้ทำซ้ำขั้นตอนเดียวกัน

กล่าวอีกนัยหนึ่งในการทำซ้ำแต่ละครั้งเราจะนำตัวเลขที่อยู่ติดกันทุกคู่และแทนที่ด้วยผลรวมของพวกเขาในเวลาเดียวกัน (ใช้คู่ซ้ายสุดหากพวกเขาทับซ้อนกัน)

ตัวอย่าง

ลอง9988ตัวอย่าง:

  1. ตัวเลขที่อยู่ติดกันเป็นครั้งแรกซึ่งเท่ากับเป็นสอง9
  2. ดังนั้นเราจึงแทนที่พวกมันด้วย9 + 9=18ซึ่งให้เรา1888
  3. เนื่องจากเรายังคงอยู่ในการสำรวจเส้นทางซ้ายขวาครั้งแรกและยังมีสอง8วินาทีเราจึงต้องแทนที่สิ่งเหล่านี้ก่อน
  4. เราจึงได้1816
  5. มีบางอย่างเปลี่ยนแปลงไปดังนั้นเราต้องทำซ้ำอีกครั้ง
  6. แต่ไม่มีตัวเลขดังกล่าวดังนั้นเราจึงหยุด

ดังนั้น9988thตัวเลขในลำดับที่เป็น18161816

ท้าทาย

200 คำแรกคือ:

0,1,2,3,4,5,6,7,8,9,10,2,12,13,14,15,16,17,18,19,20,21,4,23,24,25,26,27,28,29,30,31,32,6,34,35,36,37,38,39,40,41,42,43,8,45,46,47,48,49,50,51,52,53,54,10,56,57,58,59,60,61,62,63,64,65,12,67,68,69,70,71,72,73,74,75,76,14,78,79,80,81,82,83,84,85,86,87,16,89,90,91,92,93,94,95,96,97,98,18,10,101,102,103,104,105,106,107,108,109,20,21,4,23,24,25,26,27,28,29,120,121,14,123,124,125,126,127,128,129,130,131,132,16,134,135,136,137,138,139,140,141,142,143,18,145,146,147,148,149,150,151,152,153,154,20,156,157,158,159,160,161,162,163,164,165,4,167,168,169,170,171,172,173,174,175,176,24,178,179,180,181,182,183,184,185,186,187,26,189,190,191,192,193,194,195,196,197,198,28

งานของคุณคือสร้างลำดับนั้น

  • กำหนดnส่งคืนหมายเลขnthในลำดับนั้น
  • กำหนดnส่งคืนหมายเลขnแรกในลำดับนั้น
  • หรือสร้างลำดับอย่างไม่มีกำหนด

คุณสามารถเลือกการส่งของคุณเพื่อใช้0 - หรือ1 -exexing แต่โปรดระบุว่า

กรณีทดสอบ

คุณสามารถใช้ข้อกำหนดที่ระบุข้างต้นอย่างไรก็ตามนี่คือบางส่วนที่มีขนาดใหญ่กว่า:

222 -> 42
1633 -> 4
4488 -> 816
15519 -> 2019
19988 -> 2816
99999 -> 18189
119988 -> 21816
100001 -> 101
999999 -> 181818

คำตอบ:




5

เยลลี่ 11 ไบต์

DŒg+2/€FVµ¡

นี่คือโปรแกรมเต็มรูปแบบที่ช้าและไม่จำเป็น

ลองออนไลน์!

รุ่นอื่น 12 ไบต์

DŒg+2/€FVµƬṪ

หนึ่งไบต์ยาวกว่า แต่เร็วกว่ามาก ทำงานเป็นโปรแกรมหรือฟังก์ชั่น

ลองออนไลน์!

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

DŒg+2/€FVµƬṪ  Main link. Argument: n (integer)

         µ    Combine the previous links into a chain. Begin a new one.
D               Decimal; yield n's digit array in base 10.
 Œg             Group adjacent, identical digits into subarrays.
   +2/€         Map non-overlapping, pairwise sum over the subarrays.
                If there is an odd number of digits in a subarray, the
                last digit will remain untouched.
       F        Flatten; dump all sums and digits into a single array.
        V       Eval; turn the result into an integer.
          Ƭ   Execute the chain 'til the results are no longer unique.
              Return all unique results.
           Ṫ  Tail; extract the last result.

เวอร์ชัน 11 ไบต์ทำเช่นเดียวกันยกเว้นจะเรียกลิงก์nครั้งสำหรับอินพุตnแทนที่จะเรียกมันจนกว่าจะถึงจุดคงที่


3
ไม่จำเป็นถ้ามันช่วยประหยัด 1 ไบต์ :-)
Luis Mendo

4

Haskell, 70 ไบต์

until((==)=<<f)f
f(a:b:c)|a==b=show(2*read[a])++f c|1<2=a:f(b:c)
f a=a

อินพุตถูกใช้เป็นสตริง

ลองออนไลน์!


มันไม่ได้ช่วยให้คุณประหยัดอะไรเพื่อให้ห่างไกล แต่มีความยาวเดียวกันคุณสามารถแทนที่ข้อที่สองกับ|x<-b:c=a:f xหรือแม้กระทั่งf(a:c)=a:f cในกรณีหนึ่งหรืออื่น ๆ จริงอาจนำไปสู่การปรับปรุง :)
flawr

4

JavaScript, 48 47 46 ไบต์

อินพุตและเอาต์พุตเป็นสตริง ส่งคืนnthคำศัพท์ของลำดับ

f=s=>s-(s=s.replace(/(.)\1/g,x=>x/5.5))?f(s):s

ลองออนไลน์

  • บันทึก 1 ไบต์ขอบคุณArnauld
  • บันทึก 1 ไบต์ขอบคุณ tsh

1
x[0]*2->x/5.5
tsh

ขอบคุณ @tsh คงไม่คิดอย่างนั้น
Shaggy

3

Perl 6 , 37 ไบต์

{($_,{S:g[(\d)$0]=2*$0}...*==*)[*-1]}

ลองออนไลน์!

นี่คือฟังก์ชั่นที่สร้างคำที่ n ของลำดับให้ n เป็นอาร์กิวเมนต์

($_, { ... } ... * == *)คือลำดับของการเปลี่ยนแปลงที่ต่อเนื่องกับหมายเลขอินพุตที่สร้างโดยนิพจน์ที่มีวงเล็บ (การทดแทน regex แบบง่าย) และหยุดเมื่อ* == *นั่นคือเมื่อตัวเลขสองตัวสุดท้ายในลำดับนั้นเท่ากัน จากนั้น[*-1]ใช้องค์ประกอบสุดท้ายของลำดับนั้นเป็นค่าส่งคืน


คุณสามารถบันทึกไบต์โดยการลบ==*และแทนที่*-1ด้วย$_เนื่องจากมีน้อยกว่าการnแทนที่สำหรับตัวเลขnเสมอ 33 ไบต์
Jo King

3

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

+`(.)\1
$.(2*$1*

ลองออนไลน์! ลิงค์มีกรณีทดสอบ คำอธิบาย:

+`

ทำซ้ำจนกระทั่งอินพุตหยุดการเปลี่ยนแปลง

(.)\1

แทนที่คู่ของตัวเลขที่อยู่ติดกัน ...

$.(2*$1*

... ด้วยตัวเลขสองหลัก ( $1*สร้างสตริงของ$1 _s 2*ทำซ้ำและ$.(ใช้ความยาวจริง ๆ แล้วเครื่องยนต์ Retina นั้นฉลาดกว่านั้นและเพิ่มเป็นสองเท่า$1)


3

C # (. NET Core) , 231 , 203 , 200 , 196 , 192 ไบต์

แก้ไข: ฟังก์ชั่นขณะนี้ที่ 185 ไบต์บวก 18 สำหรับ using System.Linq;

ขอบคุณ BMO (สำหรับ 1> 0 ที่เท่ากับการลบ true บวกบรรทัดใหม่) และ Mr. XCoder (สำหรับคำสั่ง f =! f)!

แก้ไข 2: ลดลงไป 182 bytes บวก 18 using System.Linqด้วยขอบคุณ dana สำหรับการแบ่งปันเคล็ดลับกอล์ฟ!

EDIT3: ขอขอบคุณที่ศูนย์รวมแห่งความไม่รู้สำหรับ int [] -> var, การกำจัดไฟฟ้าลัดวงจร && -> & และการเปลี่ยนแปลงถึง ToArray -> ToList! (178 ไบต์ + 18 ใช้)

EDIT4: ศูนย์รวมของความไม่รู้หลุด 4 ไบต์โดยการเปลี่ยนการกำหนด Dummy me shoulda ถูกนับ! ขอบคุณอีกครั้ง: D

p=>{var f=1>0;while(f){var t=p.Select(n=>n-48).ToList();p="";f=!f;for(var j=0;j<t.Count;j++){if(j<t.Count-1&t[j]==t[1+j]){p+=t[j]+t[++j];f=!f;continue;}p+=t[j];}};return p;};

ลองออนไลน์!




2

Japt v2.0a0 -h, 15 14 ไบต์

ส่งคืนnthคำศัพท์ของลำดับ

Æ=s_r/(.)\1/ÏÑ

ลองมัน

สิ่งนี้ควรใช้งานได้ 10 ไบต์ แต่ดูเหมือนว่าจะมีข้อบกพร่องในวิธีการแทนที่แบบซ้ำของ Japt

e/(.)\1/ÏÑ


2

05AB1E , 11 ไบต์

Δγε2ôSO}˜J

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

Δ             # Continue until the (implicit) input no longer changes:
 γ            #  Split the integer in chunks of the same adjacent digits
              #   i.e. 199999889 → [1,99999,88,9]
  ε     }     #  Map each to:
   2ô         #   Split it into parts of size 2
              #    i.e. 99999 → [99,99,9]
     S       #   Split each part into digits
              #    i.e. [99,99,9] → [[9,9],[9,9],[9]]
       O      #   And take the sum of each part
              #    i.e. [[9,9],[9,9],[9]] → [18,18,9]
         ˜    #  Flatten the list
              #   i.e. [[1],[18,18,9],[16],[9]] → [1,18,18,9,16,9]
          J   #  Join everything together
              #   i.e. [1,18,18,9,16,9] → 118189169
              # (And output the result implicitly at the end)
              #  i.e. output = 28189169

2

ภาษา Wolfram 108 ไบต์

ToExpression[""<>ToString/@Total/@Flatten[Partition[#,UpTo@2]&/@Split@IntegerDigits@#,1]]&~FixedPoint~#&

คำอธิบาย

IntegerDigits แปลงหมายเลขอินพุตให้เป็นรายการของตัวเลข

Split กลุ่มตัวเลขซ้ำติดกัน

Partition[#, UpTo@2]&/@ แบ่งจำนวนหลักที่คล้ายคลึงกันออกเป็นรายการความยาวสูงสุด 2 รายการ

Flatten[...,1] กำจัดวงเล็บที่ซ้อนกันมากเกินไปเป็นครั้งคราว - เช่น {{2,2}} กลายเป็น {2,2}

Total/@รวมผลรวมของตัวเลขที่จับคู่ ไม่ต้องรวมตัวเลขหลักที่แยกได้

ToString แปลงผลรวม (และหลักที่แยก) เป็นสตริง

""<> รวมสตริงทั้งหมดในรายการ

ToExpression แปลงผลลัพธ์เป็นจำนวนเต็ม

...~FixedPoint~#& ใช้ฟังก์ชั่นจนกว่าผลลัพธ์จะหยุดการเปลี่ยนแปลง


2

C # (Visual C # Interactive Compiler)พร้อมแฟล็/u:System.Text.RegularExpressions.Regexก 70 ไบต์

s=>{for(;s[0]!=(s[0]=Replace(s[0],@"(.)\1",m=>m.Value[0]*2-96+"")););}

เอาท์พุทโดยการปรับเปลี่ยนอินพุต ใช้ในรายการที่มีหนึ่งสตริงสำหรับอินพุต

ขอบคุณ @dana สำหรับการเล่นกอล์ฟทั้ง 23 ไบต์!

ลองออนไลน์!


95 + 34 - 33 + 1 สำหรับพื้นที่พิเศษที่คุณต้องการใน commandline args, iirc
เท่านั้น

ฟังก์ชันที่ไม่ระบุตัวตนแบบเรียกซ้ำจะต้องมีการกำหนดก่อนและคำจำกัดความจะรวมอยู่ในการนับไบต์
ศูนย์รวมแห่งความไม่รู้

โอ้มันซ้ำ
ASCII เท่านั้น

1
ดี! ฉันคิดว่าฉันสามารถทำให้มันลดลงได้อีกเล็กน้อย
ศูนย์รวมแห่งความไม่รู้

นั่นเป็นคะแนนที่ดีงามพิจารณาของ C # :)
dana

1

ทำความสะอาด , 118 ไบต์

import StdEnv,Data.List
$[a,b:t]|a==b=[1,(a*2)rem 10]%(1-a/5,1)++ $t=[a: $[b:t]]
$l=l

limit o iterate$o map digitToInt

ลองออนไลน์!

รับค่าซ้ำครั้งแรก ( limit) จากรายการที่ไม่มีที่สิ้นสุดของแอปพลิเคชัน ( iterate) ของแลมบ์ดาที่ดำเนินการในขั้นตอนเดียวของกระบวนการยุบ [Char]ป้อนข้อมูลนำมาเป็น


1

สีแดง , 84 83 80 ไบต์

func[n][if parse s: form n[to some change[copy d skip d](2 * do d)to end][f s]s]

ลองออนไลน์!

ส่งคืนnthคำศัพท์ของลำดับ

คำอธิบาย:

Red[]
f: func [ n ] [
    if parse s: form n [  ; parse the input converted to a string
        to some change [  ; find and change one or more
            copy d skip   ; digit (in fact any character, no predefined character classes)
            d             ; followed by itself
        ] (2 * do d)      ; with its doubled numeric value 
        to end            ; go to the end of the string
    ] [ f s ]             ; call the function with the altered string if parse returned true
    s                     ; finally return the string 
]


1

C # (Visual C # Interactive Compiler) , 111 ไบต์

s=>{var t=s;do{s=t;t="";for(int i=0;i<s.Length;)t+=s[i]%48*(s[i++]!=(s+0)[i]?1:2*++i/i);}while(t!=s);return t;}

ลองออนไลน์!

ให้เครดิตอย่างมาก @ASCIIO สำหรับการเล่นกอล์ฟ ~ 30;) ตอนแรกเราทั้งคู่โพสต์การอัพเดทพร้อมกัน แต่ในบางครั้งเขาก็ไปเมืองอย่างชัดเจน!

-2 ขอบคุณ @EmbodimentOfIgnorance!

น้อยรหัส golfed ...

// s is the input as a string
s=>{
  // t is another string used
  // to hold intermediate results
  var t=s;
  // the algorithm repeatedly
  // processes s and saves the
  // result to t
  do{
    // copy the last result to s
    // and blank out t
    s=t;
    t="";
    // iterate over s
    for(int i=0;i<s.Length;)
      // append either 1 or 2 times
      // the current digit to t
      t+=s[i]%48*
        // compare the current digit
        // to the next digit. to prevent
        // an out-of-bounds exception,
        // append a 0 to s which either
        // gets ignored or collapses
        // to 0
        (s[i++]!=(s+0)[i]
          // if they are different, then
          // the multiplier is 1
          ?1
          // if they are the same, then
          // the multiplier is 2, and we
          // have to increment i
          :2*++i/i);
  }
  // continue this until the input
  // and output are the same
  while(t!=s);
  return t;
}



@ASCIIOnly - Good move :) (s[i++]-48)*2=>s[i++]*2-96
dana


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