Satu 1, Dua 1, Satu 2 Satu 1

16

Tantangan:

Buat program yang mengambil input dari bilangan bulat non-nol positif dan menampilkan 4 angka berikutnya dalam urutan yang dijelaskan di bawah ini.

Catatan: Memeriksa apakah input sebenarnya bilangan bulat bukan nol yang positif tidak diperlukan

Urutan:

Setiap angka dalam urutan ini (selain dari yang pertama, yang merupakan input) harus terdiri dari n digit, di mana n adalah bilangan genap. Jika kita membagi angka menjadi n / 2 pasangan, untuk setiap pasangan, angka pertama harus menjadi jumlah kali angka kedua muncul di angka sebelumnya

Penjelasan visual :
Pertimbangkan contoh ini "urutan pemula" atau input 6577
Angka berikutnya dalam urutan harus terlihat seperti ini 161527
Karena input memiliki 1 "6", 1 "5" dan 2 "7" s.

Jika input memiliki terlalu banyak digit (lebih dari 9 dari satu digit) Anda tidak akan bisa mendapatkan output yang benar.
Contoh: 111111111111(12 1)
Nomor berikutnya secara berurutan harus menggambarkan 12 1. Jadi kita membaginya menjadi 9 1 dan 3 1 (jumlah 9 + 3 = 12)
Nomor berikutnya:9131

Anda harus mengulangi 4 kali untuk input, dan output (baik mengembalikan daftar / array 4 bilangan bulat, atau output dengan memisahkannya dengan spasi, baris baru juga dapat diterima)

"Jumlahnya dapat ditulis dalam banyak cara, bagaimana cara menulisnya?" :
Jika Anda memikirkannya, input contoh 6577juga dapat ditulis sebagai 271516 (dua 7, satu 5, satu enam). Namun ini adalah output yang tidak valid. Anda harus mengulangi angka dari kiri ke kanan. Jadi 161527. Jika itu 7657Anda akan mengulangi jumlah 7, maka jumlah 6 lalu jumlah 5, maka output yang valid akan271615

Contoh I / O:

Input: 75
Output:1715 211715 12311715 4112131715

Input: 1
Output:11 21 1211 3112

Input: 111111111111(12 1)
Output:9131 192113 31191213 23411912


Ini tidak seperti pertanyaan "Katakan apa yang Anda lihat", karena urutannya berbeda: https://oeis.org/A005150 <- Yang ini mengembalikan angka seperti ini:
Input: 1211 Output: 111221
Sementara urutan yang saya minta akan melakukan
Input: 1211 Output: 3112

Dua urutan berbeda dan memerlukan algoritma yang berbeda.
Urutan pertanyaan saya: https://oeis.org/A063850 urutan
"Kemungkinan duplikat": https://oeis.org/A005150


Spesifikasi penting:

Karena tidak cukup jelas untuk beberapa orang yang mencoba menjawab pertanyaan ini, output yang benar untuk k chars di mana k> 9 bukanlah "kc" (di mana c adalah char) tetapi 9c (k-9) c dll. Dengan demikian output yang benar untuk 12 1 bukan 121(12 1) tetapi 9131(9 1, (12-9) 1 dan seterusnya)

Jika ragu, kode Anda salah jika pernah menampilkan angka dengan jumlah digit ganjil (seperti 121), ia harus memiliki keluaran angka digit genap karena sifat urutannya.


Ini adalah sehingga kode dengan kemenangan bytes paling sedikit.

P. Ktinos
sumber
Testcase yang diusulkan: 1111111111111111111(19 1 )
Emigna
Lebih erat kaitannya (masih belum menipu).
ETHproduksi
Bisakah kita mengeluarkan sebagai daftar bilangan bulat yang dipisahkan koma? Bisakah output dimulai dengan integer input (dan dengan demikian memiliki panjang 5)?
Greg Martin
Dalam kasus tes terakhir Anda, tidak harus nomor terakhir menjadi 23411912bukan 23411219?
Greg Martin
@GregMartin Memang. Terima kasih telah menunjukkan. Tetapi tidak, Anda tidak diperbolehkan untuk mengembalikan daftar bilangan bulat atau bilangan bulat keluaran yang dipisahkan dengan apa pun selain baris atau spasi baru. Dan tidak, Anda seharusnya tidak mengeluarkan input
P. Ktinos

Jawaban:

6

PowerShell , 111 104 byte

$z=$args;1..4|%{($z=-join($z-split'\B'|group|%{for($c,$n=$_.Count,$_.Name;$c-gt9;$c-=9){"9$n"}"$c$n"}))}

Cobalah online!

briantis
sumber
Karena Anda tidak menggunakan $idalam loop Anda, mengapa tidak hanya loop langsung suka$z=$args;0..3|%{...
AdmBorkBork
@ AdmBorkBork Saya memikirkannya tetapi merasa akan lebih lama setelah harus menetapkan $args(dan saya awalnya berpikir saya akan menggunakan $i). Saya akan mengukurnya tetapi kemudian pertanyaan itu ditutup.
briantist
@ AdmBorkBork ... aaaand diedit (terima kasih)
briantist
5

Python 2 , 116 byte

x=input()
exec"x=''.join(x.count(n)/9*(`9`+n)+`x.count(n)%9`+n for i,n in enumerate(x)if n not in x[:i]);print x;"*4

Cobalah online!

tongkat
sumber
Output untuk 19 yang 1111111111111111111salah. Seharusnya 919111tetapi memberi919121
CSharpie
Output salah untuk banyak nilai. Contoh: image.prntscr.com/image/ed4c523b105b41169e8aa8c46a95f963.png , Dengan 11output input harus 21 1211 3112 132112, saya tidak mengerti mengapa itu output 111sebagai iterasi pertama yang menyebabkan seluruh rantai menjadi buruk
P. Ktinos
@ P. Ktinos format input salah, perlu string (harus sisa dari tes yang saya lakukan). Memperbaiki tautan
Rod
4

05AB1E , 30 23 21 byte

4F©Ùv9y«®y¢9‰`U×XyJ}=

Cobalah online!

Penjelasan

4F                     # 4 times do:
  ©                    # store a copy of the current number in register
   Ùv                  # for each unique digit y in the number
     9y«               # concatenate 9 with y
        ®y¢            # count occurrences of y in current number
           9‰          # divmod by 9
             `U        # store the result of modulus in X
               ×       # repeat the number "9y" result_of_div times
                X      # push result of modulus
                 y     # push y
                  J    # join everything to one number
                   }   # end inner loop
                    =  # print the current number without popping
Emigna
sumber
@MagicOctopusUrn: Itu tidak akan berfungsi untuk angka dengan lebih dari 9 pengulangan angka, seperti contoh di tautan TIO saya misalnya.
Emigna
Ohhh ... aku mengerti sekarang.
Magic Gurita Guci
1

Mathematica, 117 byte

Grid@{Rest@NestList[FromDigits[Join@@(Reverse/@Tally@IntegerDigits@#//.{a_,b_}/;a>9->{9,b}~Sequence~{a-9,b})]&,#,4]}&

Sepertinya itu tidak perlu selama ini.

Greg Martin
sumber
1

C # 246 byte

namespace System{using Linq;using f=String;class p{static void Main(f[] s){f p=s[0];for(int i=0,n;i++<4;Console.Write(p+" "))p=f.Concat(p.GroupBy(c=>c).SelectMany(g=>new int[(n=g.Count())/9].Select(_ =>"9"+g.Key).Concat(new[]{n%9+""+g.Key})));}}}

Tidak Terkumpul:

namespace System
{
    using Linq;
    using f = String;
    class p
    {
        static void Main(f[] s)
        {
            f p = s[0];
            for (int i = 0, n; i++ < 4; Console.Write(p + " "))

                p = f.Concat(p.GroupBy(c => c).SelectMany(g =>
                    new int[(n = g.Count()) / 9].Select(_ => "9" + g.Key).Concat(new[] { n % 9 + "" + g.Key }
                )));
            Console.ReadKey();
        }
    }
}

Coba di sini (Ketikkan input ke bingkai bawah setelah dikompilasi dan tekan ENTER)

CSharpie
sumber
0

Jelly , 27 byte

L,Ḣ
D©®i$ÞŒgs9$€Ç€€FḌµ4µÐ¡Ḋ

Cobalah online!

Berturut-turut S tidak dapat disarangkan karena rantai tidak dapat disarangkan.

Bersarang dengan tautan terpisah: 27 byte.

Cetak alih-alih penumpukan: 27 byte.

Penjelasan

L,Ḣ                     - helper function, does the look-and-say. Input is a list of digits
 ,                      - return 2-tuple of:
L                       -   length of input
  Ḣ                     -   first element of input

D©®i$ÞŒgs9$€Ç€€FḌµ4µÐ¡Ḋ - main link, takes input as integer
                 µ4µÐ¡  - repeat 4 times, saving the results of each iteration:
D                       -   convert integer to list of digits
 ©                      -   save into register, for later use
  ®i$Þ                  -   sort list's elements by first occurrence in list
      Œg                -   group runs of equal elements
        s9$€            -   split each run into sets which are at most 9 elements long
            Ç€€         -   do the look-and-say with helper function
               FḌ       -   flatten and convert back into integer for next iteration
                      Ḋ - remove the first element from the list since it includes the
                           initial element
fireflame241
sumber
0

PHP, 141 Bytes

for($a=$argn;$i++<4;$a=$o,print$a._,$o="")foreach(array_count_values(str_split($a))as$n=>$c)$o.=str_repeat("9$n",$c/9^0).($c%9?($c%9).$n:"");

Cobalah online!

Jörg Hülsermann
sumber