Sụp đổ số


23

Hãy xác định hàm trên số tự nhiên , được viết dưới dạng 10 chữ số cơ bản , như sau:ndkdk1d1d0

Miễn là có các chữ số liền kề bằng nhau , thay thế chúng bằng tổng của chúng từ trái sang phải. Nếu có bất kỳ chữ số nào như vậy, lặp lại quy trình tương tự.didi1di+di1

Nói cách khác, trong mỗi lần lặp, chúng ta tham lam lấy tất cả các cặp chữ số liền kề bằng nhau và thay thế chúng bằng tổng của chúng cùng một lúc (sử dụng cặp ngoài cùng bên trái nếu chúng trùng nhau).

Thí dụ

Hãy lấy làm ví dụ:9988

  1. Các chữ số liền kề đầu tiên bằng nhau là hai9
  2. Vì vậy, chúng tôi thay thế chúng bằng mang lại cho chúng tôi9 + 9=181888
  3. Vì chúng ta vẫn ở trong giao dịch trái phải đầu tiên và vẫn còn hai , trước tiên chúng ta cần thay thế chúng8
  4. Vì vậy, chúng tôi nhận được1816
  5. Một cái gì đó đã thay đổi, vì vậy chúng ta cần phải thực hiện một bước lặp khác
  6. Nhưng không có chữ số nào như vậy, vì vậy chúng tôi dừng lại

Do đó, số trong chuỗi đó là .9988th1816

Thử thách

200 điều khoản đầu tiên là:

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

Nhiệm vụ của bạn là tạo ra chuỗi đó, hoặc

  • đã cho , trả về số trong chuỗi đó,nnth
  • cho , trả về số đầu tiên trong chuỗi đónn
  • hoặc tạo ra chuỗi vô thời hạn.

Bạn có thể chọn gửi của mình để sử dụng - hoặc -exexing, nhưng vui lòng chỉ định cái nào.01

Các trường hợp thử nghiệm

Bạn có thể sử dụng các thuật ngữ đã cho ở trên, tuy nhiên đây là một số thuật ngữ lớn hơn:

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

Câu trả lời:




5

Thạch , 11 byte

DŒg+2/€FVµ¡

Đây là một chương trình đầy đủ chậm, không cần thiết.

Hãy thử trực tuyến!

Phiên bản thay thế, 12 byte

DŒg+2/€FVµƬṪ

Một byte dài hơn, nhưng nhanh hơn nhiều. Hoạt động như một chương trình hoặc một chức năng.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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.

Phiên bản 11 byte cũng làm như vậy, ngoại trừ nó gọi liên kết n lần cho đầu vào n , thay vì gọi nó cho đến khi đạt được một điểm cố định.


3
Không cần thiết nếu nó tiết kiệm 1 byte :-)
Luis Mendo

4

Haskell, 70 byte

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

Đầu vào được lấy dưới dạng một chuỗi.

Hãy thử trực tuyến!


Nó không tiết kiệm cho bạn bất cứ điều gì cho đến nay, nhưng với cùng độ dài, bạn có thể thay thế mệnh đề thứ hai bằng |x<-b:c=a:f xhoặc thậm chí f(a:c)=a:f c, trong trường hợp cái này hoặc cái kia thực sự có thể dẫn đến một sự cải thiện :)
flawr

4

JavaScript, 48 47 46 byte

Đầu vào và đầu ra dưới dạng chuỗi. Trả về số hạng nthcủa chuỗi.

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

Dùng thử trực tuyến

  • Lưu 1 byte nhờ Arnauld
  • Lưu 1 byte nhờ tsh

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

Cảm ơn, @tsh. Sẽ không nghĩ về điều đó.
Xù xì

3

Perl 6 , 37 byte

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

Hãy thử trực tuyến!

Đây là một hàm tạo ra số hạng thứ n của chuỗi, lấy n làm đối số của nó.

($_, { ... } ... * == *)là chuỗi các thay đổi liên tiếp đến số đầu vào, được tạo bởi biểu thức ngoặc (một thay thế regex đơn giản) và dừng khi * == *, nghĩa là khi hai số cuối trong chuỗi bằng nhau. Sau đó, [*-1]chỉ lấy phần tử cuối cùng của chuỗi đó làm giá trị trả về.


Bạn có thể lưu byte bằng cách loại bỏ ==* và thay thế *-1bằng $_, vì luôn có ít hơn nthay thế cho một số n. 33 byte
Jo King

3

Võng mạc , 16 byte

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

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Giải trình:

+`

Lặp lại cho đến khi đầu vào dừng thay đổi.

(.)\1

Thay thế các cặp chữ số liền kề ...

$.(2*$1*

... Với hai chữ số. ( $1*tạo ra một chuỗi $1 _s, 2*nhân đôi số đó và $.(lấy độ dài. Trên thực tế, công cụ Retina thông minh hơn thế và chỉ tăng gấp đôi $1.)


3

C # (Lõi .NET) , 231 , 203 , 200 , 196 , 192 byte

EDIT: Chức năng hiện ở mức 185 byte cộng với 18 cho using System.Linq;

Cảm ơn BMO (cho 1> 0 bằng với loại bỏ cộng mới thực sự) và ông XCoder (cho các câu lệnh f =! F)!

EDIT2: Xuống tới 182 byte cộng với 18 using System.Linqnhờ cảm ơn dana vì đã chia sẻ một vài mẹo chơi gôn!

EDIT3: Cảm ơn Hiện thân của sự thiếu hiểu biết đối với int [] -> var, loại bỏ ngắn mạch && -> &, và thay đổi ToArray -> ToList! (178 byte + 18 bằng cách sử dụng)

EDIT4: Hiện thân của sự thiếu hiểu biết đã giảm 4 byte bằng cách thay đổi một bài tập. Giả tôi nên tính! Cảm ơn một lần nữa: 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;};

Hãy thử trực tuyến!




2

Japt v2.0a0 -h, 15 14 byte

Trả về số hạng nthcủa chuỗi.

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

Thử nó

Điều này sẽ hoạt động trong 10 byte nhưng dường như có một lỗi trong phương pháp thay thế đệ quy của Japt.

e/(.)\1/ÏÑ


2

05AB1E , 11 byte

Δγε2ôSO}˜J

Dùng thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

Δ             # 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

Ngôn ngữ Wolfram 108 byte

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

Giải trình

IntegerDigits biến số đầu vào thành một danh sách các chữ số của nó.

Split các nhóm chữ số lặp lại liên tiếp.

Partition[#, UpTo@2]&/@ ngắt các chữ số giống như thành các danh sách, nhiều nhất là độ dài 2.

Flatten[...,1] loại bỏ các dấu ngoặc đôi quá mức thỉnh thoảng - ví dụ: {{2,2}} trở thành {2,2}

Total/@tổng các chữ số được ghép nối. Các chữ số riêng biệt không cần phải được tóm tắt.

ToString chuyển đổi tổng (và chữ số bị cô lập) thành chuỗi.

""<> tham gia tất cả các chuỗi trong danh sách.

ToExpression chuyển đổi kết quả thành một số nguyên.

...~FixedPoint~#& áp dụng hàm cho đến khi kết quả không còn thay đổi.


2

C # (Trình biên dịch tương tác Visual C #) với cờ /u:System.Text.RegularExpressions.Regex, 70 byte

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

Đầu ra bằng cách sửa đổi đầu vào. Đưa vào một danh sách chứa một chuỗi cho đầu vào.

Cảm ơn @dana vì đã chơi golf toàn bộ 23 byte!

Hãy thử trực tuyến!


95 + 34 - 33 + 1 cho không gian thừa bạn cần trong dòng lệnh args, iirc
ASCII - chỉ

Các hàm ẩn danh đệ quy phải được xác định trước và định nghĩa được bao gồm trong số byte.
Hiện thân của sự thiếu hiểu biết

Ồ, đó là đệ quy
ASCII - chỉ

1
Tốt đẹp! Tôi nghĩ rằng tôi có thể hạ nó xuống một chút nữa
Hiện thân của sự thiếu hiểu biết

Đó là một điểm khá tốt khi xem xét nó là C # :)
dana

1

Sạch , 118 byte

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

Hãy thử trực tuyến!

Lấy giá trị lặp lại đầu tiên ( limit) từ danh sách vô hạn các ứng dụng ( iterate) của lambda thực hiện một bước duy nhất của quy trình thu gọn. Đầu vào lấy là a [Char].


1

Đỏ , 84 83 80 byte

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

Hãy thử trực tuyến!

Trả về số hạng nthcủa chuỗi.

Giải trình:

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 # (Trình biên dịch tương tác Visual C #) , 111 byte

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;}

Hãy thử trực tuyến!

Tín dụng rất lớn cho @ASCIIOnly cho việc chơi golf ~ 30;) Lúc đầu, cả hai chúng tôi đều đăng cập nhật đồng thời, nhưng đến một lúc nào đó, anh ấy rõ ràng đã đi đến thị trấn!

-2 cảm ơn @EmbodimentOfIgnorance!

Mã đánh gôn ít hơn ...

// 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 - Di chuyển tốt :) (s[i++]-48)*2=>s[i++]*2-96
dana


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.