Jeden 1, Dwa 1, Jeden 2 Jeden 1

16

Wyzwanie:

Utwórz program, który pobiera dodatnią niezerową liczbę całkowitą i wysyła 4 kolejne liczby w kolejności opisanej poniżej.

Uwaga: Sprawdzanie, czy wejście jest w rzeczywistości dodatnią liczbą całkowitą niezerową, nie jest konieczne

Sekwencja:

Każda liczba w tej sekwencji (oprócz pierwszej, która jest wartością wejściową) składa się z n cyfr, gdzie n jest liczbą parzystą. Jeśli podzielimy liczbę na pary n / 2, dla każdej pary pierwsza cyfra powinna oznaczać, ile razy druga cyfra pojawiła się w poprzednim numerze

Objaśnienie wizualne :
Rozważ ten przykład „sekwencer startowy” lub wejście 6577
Kolejna liczba w sekwencji powinna wyglądać tak: 161527
Ponieważ wejście ma 1 „6”, 1 „5” i 2 „7”.

Jeśli wejście ma zbyt wiele cyfr (więcej niż 9 pojedynczej cyfry), nie można uzyskać prawidłowego wyniku.
Przykład: 111111111111(12 1)
Kolejna liczba w kolejności musi opisywać 12 1. W ten sposób podzieliliśmy go na 9 1 i 3 1 (suma 9 + 3 = 12)
Następna liczba:9131

Powinieneś iterować 4 razy dla danych wejściowych i wyprowadzać je (albo zwróć listę / tablicę 4 liczb całkowitych, albo wyślij je oddzielając je spacją, dopuszczalne są również znaki nowej linii)

„Numer można zapisać na wiele sposobów, jak go zapisać?” :
Jeśli się nad tym zastanowić, przykładowe dane wejściowe6577 można również zapisać jako 271516 (dwa 7, jeden 5, jeden sześć). Jest to jednak niepoprawny wynik. Powtórz liczbę od lewej do prawej. Tak więc 161527. Gdyby to było 7657, iterowałbyś liczbę 7, a następnie liczbę 6, a następnie liczbę 5, w ten sposób poprawne wyjście byłoby271615

Przykład I / O:

Wejście:75
Wyjście:1715 211715 12311715 4112131715

Wejście:1
Wyjście:11 21 1211 3112

Wejście: 111111111111(12 1-tych)
Wyjście:9131 192113 31191213 23411912


Jest to odmienne od pytania „Powiedz, co widzisz”, ponieważ sekwencje są różne: https://oeis.org/A005150 <- Ten zwraca liczby takie jak to:
Wejście: 1211 Wyjście: 111221
Podczas sekwencji, o którą proszę zrobiłby
Wejście: 1211 Wyjście: 3112

Dwie sekwencje są różne i wymagają różnych algorytmów.
Moja pytana sekwencja: https://oeis.org/A063850 Sekwencja
„Możliwy duplikat”: https://oeis.org/A005150


Ważna specyfikacja:

Ponieważ nie było wystarczająco jasne dla niektórych osób, które próbowały odpowiedzieć na to pytanie, poprawna wartość wyjściowa dla k znaków, w których k> 9 nie jest „kc” (gdzie c jest char), ale 9c (k-9) c itd. Zatem poprawna wydajność dla 12 1 nie jest 121(12 1), ale 9131(9 1, (12-9) 1 i tak dalej)

W razie wątpliwości kod jest niepoprawny, jeśli kiedykolwiek wypisuje liczbę z nieparzystą liczbą cyfr (np. 121), powinien mieć wynik liczb parzystych ze względu na charakter sekwencji.


To jest więc kod z najmniejszą liczbą bajtów wygrywa.

P. Ktinos
źródło
Proponowany 1111111111111111111
przypadek testowy
Bardziej blisko spokrewnione (choć wciąż nie do oszukania).
ETHprodukcje
Czy możemy wyprowadzać jako listę liczb całkowitych oddzieloną przecinkami? Czy wyjście może zaczynać się od wejściowej liczby całkowitej (a zatem mieć długość 5)?
Greg Martin
W ostatnim przypadku testowego, nie powinien być ostatni numer 23411912zamiast 23411219?
Greg Martin
@GregMartin Rzeczywiście. Dzięki za wskazanie. Ale nie, nie możesz zwrócić listy liczb całkowitych lub liczb całkowitych wyjściowych oddzielonych czymkolwiek oprócz znaków nowej linii lub spacji. I nie, nie powinieneś wyprowadzać danych wejściowych
P. Ktinos

Odpowiedzi:

6

PowerShell , 111 104 bajtów

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

Wypróbuj online!

briantist
źródło
Ponieważ nie używasz $iw swojej pętli, dlaczego po prostu nie lubisz bezpośrednio$z=$args;0..3|%{...
AdmBorkBork
@AdmBorkBork Myślałem o tym, ale czułem, że będzie to dłużej po przypisaniu $args(i początkowo myślałem, że skorzystam $i). Zamierzałem to zmierzyć, ale potem pytanie zostało zamknięte.
briantistka
@AdmBorkBork ... aaaand edytowane (dzięki)
briantist
5

Python 2 , 116 bajtów

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

Wypróbuj online!

Pręt
źródło
Dane wyjściowe dla 19 z nich 1111111111111111111są niepoprawne. Powinno być, 919111ale daje919121
CSharpie
Niepoprawne wyjście dla wielu wartości. Przykład: image.prntscr.com/image/ed4c523b105b41169e8aa8c46a95f963.png , W przypadku danych 11wyjściowych powinno być 21 1211 3112 132112, nie rozumiem, dlaczego jest 111to pierwsza iteracja, która powoduje, że cały łańcuch idzie źle
P. Ktinos
@ P.Ktinos format wejściowy był niepoprawny, musi to być ciąg znaków (musi to być pozostałość po testach, które przeprowadzałem). Naprawiono link
Rod
4

05AB1E , 30 23 21 bajtów

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

Wypróbuj online!

Wyjaśnienie

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
źródło
@MagicOctopusUrn: To nie zadziała dla liczby z więcej niż 9 powtórzeniami cyfry, jak na przykład w moim łączu TIO.
Emigna
Ohhh ... już to rozumiem.
Magic Octopus Urn
1

Mathematica, 117 bajtów

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

Wygląda na to, że nie powinno to być tak długie.

Greg Martin
źródło
1

C # 246 bajtów

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

Nie golfowany:

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

Wypróbuj tutaj (Wpisz tekst w dolnej ramce po skompilowaniu i naciśnij ENTER)

CSharpie
źródło
0

Galaretka , 27 bajtów

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

Wypróbuj online!

Sukcesywne s nie można zagnieżdżać, ponieważ nie można zagnieżdżać łańcuchów.

Zagnieżdżanie z osobnym linkiem: 27 bajtów.

Drukuj zamiast kumulacji: 27 bajtów.

Wyjaśnienie

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
źródło
0

PHP, 141 bajtów

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:"");

Wypróbuj online!

Jörg Hülsermann
źródło