Expandir taquigrafia aumentando seqüências inteiras


18

Dada a entrada de uma lista de números no formato de uma sequência inteira abreviada, produza a sequência na íntegra.

O formato abreviado de sequência de números inteiros funciona ao encontrar todos os números n com menos dígitos que o número anterior, m . Com d como o número de dígitos em n , os últimos d dígitos de m são substituídos por todos os dígitos de n . Aqui está um exemplo de entrada:

123 45 6 7 89 200

Aplicando a regra de substituição, primeiro transformamos 45 em 145 porque 45 <123:

123 145 6 7 89 200

Aplicando repetidamente a mesma regra, isso se torna:

123 145 146 7 89 200
123 145 146 147 89 200
123 145 146 147 189 200

A sequência agora está classificada (não há números aos quais a regra se aplica); portanto, esta é a saída final.

Você pode assumir que

  • notação abreviada é sempre usada quando possível. Por exemplo, a entrada será 12 3, nunca 12 13.

  • os números nunca diminuirão, permanecendo o mesmo número de dígitos. Por exemplo, a entrada nunca será 333 222.

  • a aplicação da regra abreviada nunca resultará em um número ainda menor que o número anterior na sequência. Por exemplo, a entrada nunca será 123 12.

  • os números sempre serão inteiros positivos e nunca contêm 0s iniciais (se estiver usando um formato de string).

  • a sequência completa e expandida nunca conterá números duplicados. (No entanto, a sequência abreviada pode; ex. 10 1 20 1-> 10 11 20 21.)

  • haverá pelo menos um número na entrada.

A entrada e a saída podem ser listas / matrizes de números / cadeias ou uma única cadeia com elementos separados por qualquer dígito.

Como esse é o , o código mais curto em bytes será vencedor.

Casos de teste, com entrada e saída em linhas alternadas:

1 2 3 10 1 2 20 5 100 200 10 3 5 26 9 99 999 9999
1 2 3 10 11 12 20 25 100 200 210 213 215 226 229 299 999 9999
223 1184 334 441 5 927 2073 589 3022 82 390 5 9
223 1184 1334 1441 1445 1927 2073 2589 3022 3082 3390 3395 3399
5 10 5 20 5 30 5 40 5 50 5
5 10 15 20 25 30 35 40 45 50 55
7 8 9 70 80 90 700 800 900 7000 8000 9000
7 8 9 70 80 90 700 800 900 7000 8000 9000
42
42

O desafio é bastante antigo, mas a) a entrada pode estar vazia? b) a entrada pode conter apenas um número?
Erik the Outgolfer

@EriktheOutgolfer Vou seguir em frente e dizer que haverá ≥1 número na entrada.
Maçaneta

Respostas:


7

Geléia, 7 bytes

DUṛ"\UḌ

Experimente online! ou verifique todos os casos de teste .

Como funciona

DUṛ"\UḌ  Main link. Input: A (list of integers)

D        Convert each integer to a list of its base 10 digits.
 U       Reverse each digit list.
    \    Do a cumulative reduce, applying the dyadic link to the left:
   "       For each pair of corresponding digits:
  ṛ          Select the right one.
           Vectorization leaves digits that do not have a counterpart untouched.
     U   Reverse the resulting digit arrays.
      Ḍ  Convert from base 10 to integer.

5

Javascript, 45 42 bytes

3 bytes de desconto, graças à @ Neil .

a=>a.map(x=>z=z.slice(0,-x.length)+x,z='')

A função acima espera uma matriz de seqüências de caracteres.


1
Salve 4 bytes usando z=z.slice(0,-x.length)+x,z=''(ou nome da variável de sua escolha).
Neil

@Neil. Agradável! Eu sabia que deveria haver uma maneira de fazer isso
removido

(Desculpe por contar mal a economia.) Além disso, a versão da cadeia de caracteres é desnecessária, pois s=>s.split` `.map(é de 2 bytes (verifiquei duas vezes desta vez) menor que s=>s.replace(/\d+/g,.
Neil

@Neil. Ponto válido. Acabei de deixar lá porque foi meu primeiro objetivo ao responder ... mas você está certo
removido

1

Retina, 45 bytes

+`(?=(?<1>\d)+)(?<=(\d)(?(1)x)(?<-1>\d)+ )
$1

Usa grupos de balanceamento para contar os dígitos que custam muito. Ainda não encontrei uma abordagem melhor, mas estou interessado nela.

Experimente online aqui.


0

Gema, 35 caracteres

<D>=@set{p;@fill-right{${p;};$0}}$p

Entrada: sequência com números separados por qualquer coisa, sequência de saída.

Exemplo de execução:

bash-4.3$ gema '<D>=@set{p;@fill-right{${p;};$0}}$p' <<< '123 45 6 7 89 200'
123 145 146 147 189 200

0

Ruby, 39 caracteres

->a{l='';a.map{|c|l=l[0..-c.size-1]+c}}

Entrada: matriz de cadeias, saída: matriz de cadeias.

Exemplo de execução:

2.1.5 :001 > ->a{l='';a.map{|c|l=l[0..-c.size-1]+c}}[%w{123 45 6 7 89 200}]
 => ["123", "145", "146", "147", "189", "200"] 

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.