One 1, Two 1's, One 2 One 1


16

ท้าทาย:

สร้างโปรแกรมที่รับอินพุตของจำนวนเต็มบวกที่ไม่เป็นศูนย์และส่งออกตัวเลข 4 ตัวถัดไปตามลำดับที่อธิบายด้านล่าง

หมายเหตุ: การตรวจสอบว่าอินพุตเป็นจำนวนเต็มบวกที่ไม่เป็นศูนย์จริงหรือไม่ไม่จำเป็น

ลำดับ:

ทุกหมายเลขในลำดับนี้ (นอกเหนือจากตัวแรกซึ่งคืออินพุต) จะประกอบด้วยตัวเลข n โดยที่ n คือจำนวนคู่ หากเราแบ่งตัวเลขเป็น n / 2 คู่สำหรับแต่ละคู่หลักแรกควรเป็นจำนวนครั้งที่ตัวเลขสองปรากฏในหมายเลขก่อนหน้า

คำอธิบายภาพ :
ลองพิจารณาตัวอย่างนี้ "ลำดับเริ่มต้น" หรืออินพุต6577
หมายเลขถัดไปในลำดับควรมีลักษณะเช่นนี้161527
เนื่องจากอินพุตมี 1 "6", 1 "5" และ 2 "7" s

หากอินพุตมีตัวเลขมากเกินไป (มากกว่า 9 หลักเดียว) คุณจะไม่สามารถรับเอาต์พุตที่ถูกต้อง
ตัวอย่าง: 111111111111(12 1's)
หมายเลขถัดไปในลำดับจะต้องอธิบาย 12 1 ของ ดังนั้นเราจึงแบ่งเป็น 9 1 และ 3 1 (รวม 9 + 3 = 12)
หมายเลขถัดไป:9131

คุณควรวนซ้ำ 4 ครั้งสำหรับอินพุทและเอาท์พุทมัน (กลับรายการ / อาร์เรย์ของจำนวนเต็ม 4 หรือส่งออกโดยแยกพวกเขาด้วยช่องว่างบรรทัดใหม่ก็ยอมรับได้)

"ตัวเลขสามารถเขียนได้หลายวิธีฉันจะเขียนได้อย่างไร" :
ถ้าคุณคิดเกี่ยวกับมันตัวอย่างอินพุต6577สามารถเขียนเป็น 271516 (สอง 7 ของ, หนึ่ง 5, หนึ่งหก) อย่างไรก็ตามนี่เป็นเอาต์พุตที่ไม่ถูกต้อง คุณควรทำซ้ำหมายเลขจากซ้ายไปขวา ดังนั้น 161527 ถ้าเป็น7657คุณจะย้ำจำนวน 7 ของแล้วจำนวน 6 จากนั้นจำนวน 5 ดังนั้นผลลัพธ์ที่ถูกต้องจะเป็น271615

ตัวอย่าง I / O:

อินพุต: 75
เอาต์พุต:1715 211715 12311715 4112131715

อินพุต: 1
เอาต์พุต:11 21 1211 3112

อินพุต: 111111111111(12 1's)
เอาต์พุต:9131 192113 31191213 23411912


นี่ไม่เหมือนกับคำถาม "พูดในสิ่งที่คุณเห็น" เนื่องจากลำดับต่างกัน: https://oeis.org/A005150 <- อันนี้ส่งกลับตัวเลขดังนี้:
อินพุต: 1211 เอาท์พุท: 111221
ขณะที่ลำดับที่ฉันขอ จะทำ
อินพุต: 1211 ผลลัพธ์: 3112

ลำดับที่สองต่างกันและต้องการอัลกอริธึมที่แตกต่างกัน
ลำดับที่ฉันถาม: https://oeis.org/A063850ลำดับ
"เป็นไปได้ซ้ำกัน": https://oeis.org/A005150


ข้อกำหนดที่สำคัญ:

เนื่องจากมันไม่ชัดเจนพอสำหรับบางคนที่พยายามตอบคำถามนี้ผลลัพธ์ที่ถูกต้องสำหรับ k chars ที่ k> 9 ไม่ใช่ "kc" (โดยที่ c เป็น char) แต่ 9c (k-9) c เป็นต้นดังนั้นผลลัพธ์ที่ถูกต้องสำหรับ 12 1 ไม่ใช่121(12 1) แต่9131(9 1, (12-9) 1 และอื่น ๆ )

หากมีข้อสงสัยรหัสของคุณผิดถ้ามันส่งออกจำนวนที่มีจำนวนคี่ (เช่น 121) ก็ควรจะมีการส่งออกของตัวเลขที่เป็นเลขคู่เนื่องจากลักษณะของลำดับ


นี่คือดังนั้นโค้ดที่มีจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ


ตู้ทดสอบที่เสนอ: 1111111111111111111(19) 1's )
Emigna

มีความเกี่ยวข้องมากขึ้น (ยังไม่ตกเป็นเหยื่อ)
ETHproductions

เราสามารถแสดงผลเป็นรายการจำนวนเต็มที่คั่นด้วยเครื่องหมายจุลภาคได้หรือไม่ เอาท์พุทสามารถเริ่มต้นด้วยจำนวนเต็ม (และมีความยาว 5)
เกร็กมาร์ติน

ในกรณีทดสอบครั้งสุดท้ายของคุณไม่ควรใช้หมายเลขสุดท้าย23411912แทน23411219 ?
เกร็กมาร์ติน

@ GregMartin แน่นอน ขอบคุณสำหรับการชี้ให้เห็น แต่ไม่คุณไม่ได้รับอนุญาตให้ส่งคืนรายการจำนวนเต็มหรือจำนวนเต็มแยกจากสิ่งอื่นนอกเหนือจากการขึ้นบรรทัดใหม่หรือเว้นวรรค และไม่คุณไม่ควรส่งสัญญาณเข้า
P. Ktinos

คำตอบ:


6

PowerShell , 111 104 ไบต์

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

ลองออนไลน์!


เนื่องจากคุณไม่ได้ใช้$iในวงของคุณทำไมไม่เพียงแค่วนซ้ำโดยตรงเช่น$z=$args;0..3|%{...
AdmBorkBork

@AdmBorkBork ฉันคิดเกี่ยวกับมัน แต่รู้สึกว่ามันจะนานขึ้นหลังจากต้องมอบหมาย$args(และฉันคิดว่าฉันจะใช้$i) ฉันจะวัดมัน แต่คำถามก็ปิดลง
ต้มตุ๋น

@AdmBorkBork ... aaaand แก้ไขแล้ว (ขอบคุณ)
briantist

5

Python 2 , 116 ไบต์

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

ลองออนไลน์!


เอาต์พุตสำหรับ 19 รายการ1111111111111111111ไม่ถูกต้อง ควรเป็น919111แต่ให้919121
CSharpie

เอาต์พุตไม่ถูกต้องสำหรับค่าจำนวนมาก ตัวอย่าง: image.prntscr.com/image/ed4c523b105b41169e8aa8c46a95f963.pngด้วยอินพุต11เอาต์พุต21 1211 3112 132112ฉันไม่เข้าใจว่าทำไมมัน111ถึงเป็นการวนซ้ำครั้งแรกซึ่งทำให้ห่วงโซ่ทั้งหมดแย่
P. Ktinos

@ P.Ktinos รูปแบบการป้อนข้อมูลผิดต้องเป็นสตริง (ต้องเป็นส่วนที่เหลือของการทดสอบที่ฉันทำ) แก้ไขลิงก์
Rod

4

05AB1E , 30 23 21 ไบต์

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

ลองออนไลน์!

คำอธิบาย

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

@MagicOctopusUrn: นั่นจะไม่ทำงานสำหรับตัวเลขที่มีการทำซ้ำมากกว่า 9 หลักเช่นตัวอย่างในลิงค์ TIO ของฉัน
Emigna

โอ้ ... ฉันเข้าใจแล้ว
Magic Octopus Urn

1

Mathematica, 117 ไบต์

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

ดูเหมือนว่ามันไม่ควรจะต้องยาวขนาดนี้


1

C # 246 ไบต์

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

Ungolfed:

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

ลองที่นี่ (พิมพ์อินพุตลงในเฟรมด้านล่างเมื่อคอมไพล์แล้วกด ENTER)


0

เยลลี่ , 27 ไบต์

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

ลองออนไลน์!

ไม่สามารถซ้อนต่อเนื่องกันได้เนื่องจากโซ่ไม่สามารถซ้อนกันได้

การซ้อนกับลิงค์แยก: 27 ไบต์

พิมพ์แทนการสะสม: 27 ไบต์

คำอธิบาย

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

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