Uno 1, Due 1, Uno 2 Uno 1


16

Sfida:

Creare un programma che accetta input di un numero intero diverso da zero e genera i 4 numeri successivi nella sequenza descritta di seguito.

Nota: non è necessario verificare se l'ingresso è effettivamente un numero intero diverso da zero

Sequenza:

Ogni numero in questa sequenza (a parte il primo, che è l'input) deve essere composto da n cifre, dove n è un numero pari. Se dividiamo il numero in n / 2 coppie, per ogni coppia, la prima cifra dovrebbe essere la quantità di volte in cui la seconda cifra è apparsa nel numero precedente

Spiegazione visiva :
prendere in considerazione questo esempio "sequenza di avvio" o input 6577
Il numero successivo nella sequenza dovrebbe apparire così 161527
poiché l'ingresso ha 1 "6", 1 "5" e 2 "7" s.

Se l'input ha troppe cifre (più di 9 di una singola cifra) non si sarebbe in grado di ottenere un risultato corretto
Esempio: 111111111111(12 1) Il
prossimo numero in sequenza deve descrivere 12 1. Quindi lo dividiamo in 9 1 e 3 1 (somma 9 + 3 = 12)
Numero successivo:9131

Dovresti iterare 4 volte per l'input ed emetterlo (o restituire un elenco / array di 4 numeri interi o emetterlo separandoli con uno spazio, anche le newline sono accettabili)

"Il numero può essere scritto in molti modi, come lo scrivo?" :
Se ci pensate, l'input di esempio 6577può anche essere scritto come 271516 (due 7, uno 5, uno sei). Tuttavia questo è un output non valido. Dovresti ripetere il numero da sinistra a destra. Quindi 161527. Se fosse 7657, ripeteresti la quantità di 7, quindi la quantità di 6, quindi la quantità di 5, quindi l'output valido sarebbe271615

Esempio I / O:

Ingresso: 75
Uscita:1715 211715 12311715 4112131715

Ingresso: 1
Uscita:11 21 1211 3112

Ingresso: 111111111111(12 1)
Uscita:9131 192113 31191213 23411912


Questo è diverso dalla domanda "Dì quello che vedi", perché le sequenze sono diverse: https://oeis.org/A005150 <- Questo restituisce numeri come questo:
Input: 1211 Output: 111221
Mentre la sequenza che sto chiedendo farebbe
Input: 1211 Output: 3112

Le due sequenze sono diverse e richiedono algoritmi diversi.
Sequenza richiesta: https://oeis.org/A063850 Sequenza
"Possibile duplicato": https://oeis.org/A005150


Specifica importante:

Dal momento che non era abbastanza chiaro per alcune persone che hanno cercato di rispondere a questa domanda, l'output corretto per k chars dove k> 9 non è "kc" (dove c è char) ma 9c (k-9) c ecc. Quindi l'output corretto per 12 1 non è 121(12 1) ma9131 (9 1, (12-9) 1 e così via)

In caso di dubbio, il codice è errato se emette mai un numero con una quantità dispari di cifre (come 121), dovrebbe avere un output di numeri pari a causa della natura della sequenza.


Questo è quindi vince il codice con meno byte.


Testcase proposto: 1111111111111111111(19 1 )
— Emigna,

Più strettamente correlati (comunque non ancora ingannevole).
— ETHproductions

È possibile generare un elenco di numeri interi separati da virgola? L'output può iniziare con il numero intero di input (e quindi avere lunghezza 5)?
— Greg Martin,

Nel tuo ultimo caso di prova, non dovrebbe essere l'ultimo numero 23411912invece di 23411219?
— Greg Martin,

@GregMartin Effettivamente. Grazie per averlo segnalato. Ma no, non ti è permesso di restituire un elenco di numeri interi o numeri interi di output separati da qualcosa di diverso da newline o spazi. E no, non dovresti emettere l'input
— P. Ktinos,

Risposte:


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

Provalo online!


Dal momento che non usi $inel tuo loop, perché non $z=$args;0..3|%{...
— limitarti a

@AdmBorkBork Ci ho pensato, ma ho pensato che sarebbe stato più lungo dopo averlo assegnato $args(e inizialmente pensavo che avrei usato $i). Stavo per misurarlo, ma poi la domanda si è chiusa.
— Briantist,

@AdmBorkBork ... aaaand modificato (grazie)
— 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

Provalo online!


L'output per 19 1111111111111111111è errato. Dovrebbe essere 919111ma dà919121
— CSharpie

Output errato per molti valori. Esempio: image.prntscr.com/image/ed4c523b105b41169e8aa8c46a95f963.png , Con 11output di input dovrebbe essere 21 1211 3112 132112, non capisco perché output 111come la prima iterazione che fa andare male l'intera catena
— P. Ktinos,

@ P.Ktinos il formato di input era sbagliato, deve essere una stringa (deve essere il resto dei test che stavo facendo). Corretto il link
— Rod

4

05AB1E , 30 23 21 byte

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

Provalo online!

Spiegazione

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: non funzionerà per i numeri con più di 9 ripetizioni di una cifra, come ad esempio nell'esempio nel mio link TIO.
— Emigna,

Ohhh ... Ora ho capito.
— Magic Octopus Urn il

1

Mathematica, 117 byte

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

Sembra che non dovrebbe essere così lungo.


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

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

Provalo qui (digita l'input nel frame inferiore una volta compilato e premi INVIO)


0

Gelatina , 27 byte

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

Provalo online!

Il successivo € non possono essere nidificati perché le catene non possono essere nidificate.

Annidamento con collegamento separato: 27 byte.

Stampa invece del cumulo: 27 byte.

Spiegazione

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

0

PHP, 141 byte

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

Provalo online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.