Nomor yang diciutkan

23

Mari kita mendefinisikan fungsi pada bilangan n , ditulis sebagai basis 10 digit dkdk1d1d0 , sebagai berikut:

Selama ada angka yang berdekatan yang sama , ganti dengan jumlah mereka dari kiri ke kanan. Jika ada angka seperti itu, ulangi prosedur yang sama.didi1di+di1

Dengan kata lain, dalam setiap iterasi kami dengan rakus mengambil semua pasangan angka yang berdekatan yang sama dan menggantinya dengan jumlah mereka pada saat yang sama (menggunakan pasangan paling kiri jika tumpang tindih).

Contoh

Mari kita ambil 9988 misalnya:

  1. Digit berdekatan pertama yang sama adalah dua 9
  2. Jadi kita menggantinya dengan 9 + 9=18 yang memberi kita 1888
  3. Karena kita masih berada di traversal kiri-kanan pertama dan masih ada dua 8 s kita harus terlebih dahulu menggantinya
  4. Jadi kami mendapatkan1816
  5. Sesuatu berubah, jadi kita perlu melakukan iterasi lain
  6. Tetapi tidak ada angka seperti itu, jadi kami berhenti

Oleh karena itu angka dalam urutan itu adalah .9988th1816

Tantangan

200 istilah pertama adalah:

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

Tugas Anda adalah untuk menghasilkan urutan itu, baik

  • diberikan , kembalikan nomor dalam urutan itu,nnth
  • diberikan n , kembalikan nomor n pertama dalam urutan itu
  • atau menghasilkan urutan tanpa batas.

Anda dapat memilih kiriman Anda untuk menggunakan indeks 0 - atau 1 , tetapi harap tentukan yang mana.

Uji kasus

Anda dapat menggunakan ketentuan yang diberikan di atas, namun berikut adalah beberapa yang lebih besar:

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

Jawaban:

6

Python 3 , 128 byte

def t(z):j=z and(z[0]==z[1:2])+1;return[str(int(z[0])*j),*t(z[j:])]if j else''
def c(n):r="".join(t(n));return r!=n and c(r)or r

Cobalah online!

anon3128
sumber
5
Selamat datang di PPCG! Posting pertama yang bagus!
Rɪᴋᴇʀ
1
108 byte
Jo King
5

Python 2 , 97 96 93 byte

def f(n):r=re.sub(r'(.)\1',lambda m:`int(m.group(1))*2`,n);return r!=n and f(r)or r
import re

Cobalah online!


Versi non regex:

Python 2 , 133 130 122 122 112 98 byte

def f(n):
 r='';s=n
 while s:a=1+(s[0]==s[1:2]);r+=`int(s[0])*a`;s=s[a:]
 return r!=n and f(r)or r

Cobalah online!

TFeld
sumber
5

Jelly , 11 byte

DŒg+2/€FVµ¡

Ini adalah program lengkap yang tidak perlu, lambat.

Cobalah online!

Versi alternatif, 12 byte

DŒg+2/€FVµƬṪ

Satu byte lebih lama, tetapi jauh lebih cepat. Berfungsi sebagai program atau fungsi.

Cobalah online!

Bagaimana itu bekerja

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.

Versi 11-byte melakukan hal yang sama, kecuali memanggil tautan n kali untuk input n , alih-alih memanggilnya sampai titik tetap tercapai.

Dennis
sumber
3
Ini tidak perlu jika menghemat 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

Input diambil sebagai string.

Cobalah online!

nimi
sumber
Sejauh ini tidak menyelamatkan Anda, tetapi dengan panjang yang sama Anda dapat mengganti klausa kedua dengan |x<-b:c=a:f xatau bahkan f(a:c)=a:f c, jika satu atau yang lain benar-benar dapat mengarah pada peningkatan :)
flawr
4

JavaScript, 48 47 46 byte

Input dan output sebagai string. Mengembalikan nthistilah urutan.

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

Cobalah online

  • 1 byte disimpan berkat Arnauld
  • 1 byte disimpan berkat tsh
Shaggy
sumber
1
x[0]*2->x/5.5
tsh
Terima kasih, @tsh. Tidak akan memikirkan itu.
Shaggy
3

Perl 6 , 37 byte

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

Cobalah online!

Ini adalah fungsi yang menghasilkan istilah ke-n dari urutan, diberikan n sebagai argumennya.

($_, { ... } ... * == *)adalah urutan perubahan berurutan ke nomor input, yang dihasilkan oleh ekspresi kurung (substitusi regex sederhana) dan berhenti ketika * == *, yaitu, ketika dua angka terakhir dalam urutan sama. Kemudian [*-1]hanya mengambil elemen terakhir dari urutan itu sebagai nilai kembali.

Sean
sumber
Anda dapat menyimpan byte dengan menghapus ==*dan mengganti *-1dengan $_, karena selalu ada kurang dari npenggantian untuk suatu angka n. 33 byte
Jo King
3

Retina , 16 byte

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

Cobalah online! Tautan termasuk kasus uji. Penjelasan:

+`

Ulangi sampai input berhenti berubah.

(.)\1

Ganti pasangan digit yang berdekatan ...

$.(2*$1*

... dengan dua kali digit. ( $1*Menghasilkan string $1 _s, 2*duplikat itu, dan $.(membutuhkan waktu lama. Sebenarnya, mesin Retina lebih pintar dari itu dan hanya berlipat ganda $1.)

Neil
sumber
3

C # (.NET Core) , 231 , 203 , 200 , 196 , 192 byte

EDIT: Fungsi sekarang pada 185 byte plus 18 untuk using System.Linq;

Terima kasih kepada BMO (untuk 1> 0 sama dengan penghapusan true plus newline) dan Mr. XCoder (untuk pernyataan f =! F)!

EDIT2: Turun ke 182 byte plus 18 untuk using System.Linqterima kasih atas dana karena berbagi beberapa tips golf!

EDIT3: Terima kasih kepada Perwujudan Ketidaktahuan untuk int [] -> var, penghapusan korsleting && -> &, dan mengubah ToArray -> ToList! (178 byte + 18 menggunakan)

EDIT4: Perwujudan Ketidaktahuan turun 4 byte dengan mengubah tugas. Dummy saya harus dihitung! Terima kasih lagi: 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;};

Cobalah online!

Destroigo
sumber
2
174 sebelum menggunakan
Perwujudan Ketidaktahuan
2

Japt v2.0a0 -h, 15 14 byte

Mengembalikan nthistilah urutan.

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

Cobalah

Ini harus bekerja selama 10 byte tetapi tampaknya ada bug dalam metode penggantian rekursif Japt.

e/(.)\1/ÏÑ
Shaggy
sumber
2

05AB1E , 11 byte

Δγε2ôSO}˜J

Cobalah online atau verifikasi semua kasus uji .

Penjelasan:

Δ             # 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
Kevin Cruijssen
sumber
2

Bahasa Wolfram 108 byte

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

Penjelasan

IntegerDigits mengubah nomor input menjadi daftar digitnya.

Split kelompok digit berulang berurutan.

Partition[#, UpTo@2]&/@ memecah run dari digit seperti ke dalam daftar, paling banyak, panjang 2.

Flatten[...,1] menghilangkan kawat gigi yang terlalu sering tersarang - misalnya, {{2,2}} menjadi {2,2}

Total/@menjumlahkan total angka pasangan. Digit yang terisolasi tidak perlu dijumlahkan.

ToString mengubah total (dan angka yang terisolasi) menjadi string.

""<> bergabung dengan semua string dalam daftar.

ToExpression mengubah hasilnya menjadi bilangan bulat.

...~FixedPoint~#& menerapkan fungsi sampai hasilnya berhenti berubah.

DavidC
sumber
2

C # (Visual C # Interactive Compiler) dengan flag /u:System.Text.RegularExpressions.Regex, 70 byte

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

Keluaran dengan memodifikasi input. Mengambil dalam daftar yang berisi satu string untuk input.

Terima kasih kepada @dana untuk bermain golf sepanjang 23 byte!

Cobalah online!

Perwujudan Ketidaktahuan
sumber
95 + 34 - 33 + 1 untuk ruang ekstra yang Anda butuhkan di baris perintah args, iirc
ASCII-only
Fungsi anonim rekursif harus didefinisikan terlebih dahulu, dan definisi tersebut termasuk dalam jumlah byte.
Perwujudan Ketidaktahuan
Oh, ini bersifat rekursif
hanya ASCII
1
Bagus! Saya pikir saya bisa menurunkannya sedikit lagi
Perwujudan Ketidaktahuan
Itu skor yang cukup bagus mengingat itu C # :)
dana
1

Bersih , 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

Cobalah online!

Mengambil nilai berulang pertama ( limit) dari daftar aplikasi ( iterate) tak terbatas dari lambda yang melakukan satu langkah tunggal proses runtuh. Input diambil sebagai a [Char].

Suram
sumber
1

Merah , 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]

Cobalah online!

Mengembalikan nthistilah urutan.

Penjelasan:

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 
]
Galen Ivanov
sumber
1

Scala , 84 byte

s=>{var t=s
while(t!=(t="(\\d)\\1".r.replaceAllIn(t,m=>s"$m"(0)*2-96+""),t)._2){}
t}

Cobalah online!

Khusus ASCII
sumber
1

C # (Visual C # Interactive Compiler) , 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;}

Cobalah online!

Kredit besar untuk @ ASCIIHanya untuk golf ~ 30;) Awalnya kami berdua memposting pembaruan secara bersamaan, tetapi pada beberapa titik ia jelas pergi ke kota!

-2 Terima kasih kepada @EmbodimentOfIgnorance!

Lebih sedikit kode golf ...

// 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;
}
dana
sumber
139
ASCII
134
ASCII
@ASCIIOnly - Langkah bagus :) (s[i++]-48)*2=>s[i++]*2-96
dana
131
ASCII
1
114
ASCII