Catálogo de produtos


17

Esse problema é sobre a separação de uma sequência que representa um identificador de produto em três componentes.

  • A primeira parte consiste em letras maiúsculas e minúsculas de comprimento arbitrário que representam o armazém.
  • A segunda parte são dígitos que representam o número do produto. Esta parte também é de comprimento arbitrário.
  • A última parte são qualificadores como tamanho e cores, e essa parte continua até o final da sequência. É garantido que os qualificadores começam com uma letra maiúscula e consistem em caracteres alfanuméricos.

Cada parte deve ser impressa claramente separada. É garantido que cada parte não esteja vazia.

O vencedor é quem usa menos bytes para resolver esse problema.

Exemplo:
Entrada: UK7898S14

Saída:
UK
7898
S14

Aqui UK é Reino Unido, 7898 é o código do produto e S14 é o tamanho 14.

Exemplo 2:
Entrada: cphDK1234CYELLOWS14QGOOD

Saída:
cphDK
1234
CYELLOWS14QGOOD

Aqui cphDK é Copenhague, Dinamarca, 1234 é o código do produto, CYELLOWS14QGOOD representa cor amarela, tamanho 14 e boa qualidade.


2
Cada peça não está vazia?
9136 Karl Napf

@KarlNapf Sim. Cada parte não está vazia.
precisa saber é o seguinte

@ Emigna Um exemplo adicional foi incluído.
precisa saber é o seguinte

“A primeira parte consiste em letras maiúsculas e minúsculas” - Talvez um dos exemplos possa conter essa mistura de letras maiúsculas e minúsculas. E talvez também um código de país que não tenha 2 caracteres. Além disso, o qualificador pode conter caracteres não alfanuméricos, como "Qualidade ★★★ ☆☆"?
manatwork

Bem-vindo ao PPCG!
Erik the Outgolfer

Respostas:


10

Perl, 12 bytes

11 bytes de código + 1 byte para -psinalizador.

s/\d+/
$&
/

Para executá-lo:

perl -pe 's/\d+/
$&
/' <<< "CYELLOWS14QGOOD"

2
Ame a simplicidade! :)
Dom Hastings

4

APL, 18

{⍵⊂⍨3⌊+\1,2≠/⍵∊⎕D}'UK7898S14'
UK  7898  S14 

Funciona pesquisando os 2 primeiros pontos em que há uma mudança de caractere para dígito ou vice-versa e usando-os para dividir a sequência.


4

Retina , 28 14 10 8 bytes

Economizou 4 bytes graças a Dom Hastings .
Economizou 2 bytes graças a Martin Ender .

S1`(\d+)

Experimente online!


Usando o mesmo mecanismo como @ resposta de Dada, você pode economizar mais 4 bytes: retina.tryitonline.net/... (TBH, provavelmente, ainda mais, mas isso é tudo que eu poderia salvar :)!)
Dom Hastings

@DomHastings. Aah, boa ideia indo com a substituição!
Emigna

3

Haskell, 36 bytes (sem regex)

d c='/'<c&&c<':'
(span d<$>).break d

Isso fornece o resultado no formato ("UK",("7898","S14")). A idéia é dividir no primeiro dígito e depois dividir o restante no primeiro não dígito. Experimente em Ideone .


Bom uso do fmap em uma tupla.
Xnor

3

JavaScript, 38 36 bytes

s=>/(\D+)(\d+)(.+)/.exec(s).slice(1)

Exemplo


@ Arnauld Boa captura.
Florent

3

JavaScript (ES6), 28 26 bytes

s=>s.replace(/\d+/,`
$&
`)

Guardado 2 bytes graças a @Grax

Exemplos


Você pode reduzir mais 2 caracteres usando $ & em sua substituição e removendo os parênteses. s=>s.replace(/\d+/,` $& `)
Grax32

2

Gema, 17 12 caracteres

(O truque de não lidar com o código do país explicitamente descaradamente emprestado de Dada 's Perl solução . Apreciação deve ser expresso lá.)

<D>*=\n$1\n*

Exemplo de execução:

bash-4.3$ gema '<D>*=\n$1\n*' <<< 'UK7898S14'
UK
7898
S14

bash-4.3$ gema '<D>*=\n$1\n*' <<< 'cphDK1234CYELLOWS14QGOOD'
cphDK
1234
CYELLOWS14QGOOD

2

Python 2, 40 bytes

Eu não sei muito Regex, mas felizmente esse problema é bastante simples :) Separa a string de entrada em uma lista de comprimento 3 que contém cada parte.

import re
lambda k:re.split('(\d+)',k,1)

2

05AB1E ,39. 37. 16 bytes

Economizou muitos bytes graças a Emigna.

Ele usa a codificação CP-1252.

TvDSdykF¬?¦}¶?}?

T                push "10"
 v               for each element (i.e., 1 and 0). Element is stored in 'y'
  DS             split string (input during the first iteration)
    d            for each character, 1 if digit or 0 otherwise
     yk          get index of the first occurrence of 'y'
       F         for 0 <= i < string.firstIndexOf(y)
        ¬?       print the first character of the string
          ¦      remove it from the string
           }     end inner for
            ¶?   display a newline
              }  end outer for
               ? display the remaining string

Experimente online!

(Este é o meu primeiro post aqui!)


Você pode salvar pelo menos 14 bytes verificando dígitos em vez de letras . E isso provavelmente pode ser jogado mais.
Emigna

Além disso, bem-vindo ao PPCG :)
Emigna

Obrigado! E você está certo, na verdade eu fui todo ingênuo neste, literalmente da esquerda para a direita. Também tentei cavar .páà¬para conseguir a primeira parte, mas não parece ajudar no resto à primeira vista.
Osable

Sinta-se à vontade para atualizar sua resposta com meu código (e jogar um pouco mais, se puder). Não acho que seja diferente o suficiente para garantir sua própria resposta.
Emigna

Ok, eu vou fazer isso então, como eu encontrei uma maneira de colocá-lo em um loop. Nada muito sofisticado, mas pelo menos diminui para 16 bytes. Mais uma vez obrigado! (Agora eu tenho que atualizar as explicações ... mas há menos bytes para explicar)
Osable

1

JavaScript (ES6), 36 bytes

s=>/(.+?)(\d+)(.*)/.exec(s).slice(1)

Exemplos


1

Java 7, 200 185 174 167 bytes

import java.util.regex.*;String c(String s){Matcher m=Pattern.compile("(.*?)(\\d+)(.*)").matcher(s);s="";for(int i=0;i<3;)if(m.matches())s+=m.group(++i)+" ";return s;}

Ungolfed & código de teste:

Experimente aqui.

import java.util.regex.*;
class M{
  static String c(String s){
    Matcher m = Pattern.compile("(.*?)(\\d+)(.*)").matcher(s);
    s = "";
    for(int i = 0; i < 3;){
      if(m.matches()){
        s += m.group(++i) + " ";
      }
    }
    return s;
  }

  public static void main(String[] a){
    System.out.println(c("UK7898S14"));
    System.out.println(c("cphDK1234CYELLOWS14QGOOD"));
  }
}

Resultado:

UK 7898 S14 
cphDK 1234 CYELLOWS14QGOOD 

1

C #, 191 177 bytes

Golfe:

void F(string s){var a=s.ToList();int i=a.FindIndex(char.IsDigit);int n=a.FindIndex(i,char.IsUpper);Console.Write($"{s.Substring(0,i)}\n{s.Substring(i,n-i)}\n{s.Substring(n)}");

Ungolfed:

    void F(string s)
    {
        var a = s.ToList();
        int i = a.FindIndex(char.IsDigit);
        int n = a.FindIndex(i, char.IsUpper);

        Console.Write($"{s.Substring(0, i)}\n{s.Substring(i, n - i)}\n{s.Substring(n)}");
    }

EDIT1: @Link Ng salvou 14 bytes.


Você não precisa do ToCharArray (). string já é IEnumerable <char>
Link Ng

Claro, não acredito que não percebi isso.
paldir

1

PHP, 48 bytes

print_r(preg_split('/(\D+|\d+)\K/',$argv[1],3));

Com seu $limitparâmetro, e o fantasticamente útil \K, preg_split()é perfeito para esse desafio.


1

MATLAB, 81 73 bytes

function y=f(x)
[~,~,~,m,~,~,s]=regexp(x,'(?<=^\D+)\d+');y=[s(1) m s(2)];

Função que aceita uma string e retorna uma matriz de células de três strings. Testado na versão R20105b.

Exemplo de uso:

>> f('UK7898S14')
ans = 
    'UK'    '7898'    'S14'

>> f('cphDK1234CYELLOWS14QGOOD')
ans = 
    'cphDK'    '1234'    'CYELLOWS14QGOOD'

Explicação

A expressão regular (?<=^\D+)\d+')corresponde a um grupo de dígitos precedidos por não-dígitos desde o início da string; os últimos não fazem parte da partida.

A quarta saída de regexpé o 'match'; e a sétima saída são as 'split'duas partes da sequência antes e depois da partida.


1

Ruby, 28 bytes

->s{puts s.sub(/\d+/,"\n\\&\n")}

Isso envolve o primeiro cluster de dígitos com novas linhas.


0

jq, 47 caracteres

(Código de 43 caracteres + opções de linha de comando de 4 caracteres.)

match("(\\D+)(\\d+)(.+)").captures[].string

(Novamente a história antiga: razoavelmente elegante no início, torna-se dolorosamente detalhada.)

Exemplo de execução:

bash-4.3$ jq -Rr 'match("(\\D+)(\\d+)(.+)").captures[].string' <<< 'UK7898S14'
UK
7898
S14

bash-4.3$ jq -Rr 'match("(\\D+)(\\d+)(.+)").captures[].string' <<< 'cphDK1234CYELLOWS14QGOOD'
cphDK
1234
CYELLOWS14QGOOD

Teste on-line (a passagem do -rURL não é suportada - verifique você mesmo Raw Output.)


0

PHP, 61 59 56 55 bytes

preg_match('/(\D+)(\d+)(.+)/',$argv[1],$a);print_r($a);

Isso também gera o código inicial:

Array
(
    [0] => cphDK1234CYELLOWS14QGOOD
    [1] => cphDK
    [2] => 1234
    [3] => CYELLOWS14QGOOD
)

Editar

Obrigado a @manatwork por salvar alguns bytes para mim
Obrigado a @ RomanGräf por mais alguns bytes salvos


11
[\d]? : o \dé suficiente.
manatwork

@manatwork Obrigado. Eu não uso o suficiente regex (sem dúvida uma coisa boa) e começou a descer a [0-9] + rota antes de lembrar sobre \ d
gabe3886

11
Por que não substituir [a-z]com \D?
Roman Gräf

11
Agora que você não tem [a-z], a ibandeira também não é necessária.
manatwork

Eu realmente preciso dedicar mais tempo trabalhando em expressões regulares.
precisa saber é o seguinte

0

JavaScript sem regex, 84 81 79 bytes

p=>{for(i=n=o='';i<p.length;){if(n==isNaN(c=p[i++])){o+=' ';n++}o+=c}return o}


2
Você poderia colocar todas as inicializações em um único lugar: o=n=i=''.
Manatwork

E mover a atribuição para c ao seu primeiro uso: isNaN(c=p[i++]).
Manatwork

p=>{for(i=n=o=0;i<p.length;){c=p[i++];if(n++==c<59){o+=' '}o+=c}return o}
Roman Gräf

@ RomanGräf, a inicialização deve permanecer ''porque o, ao qual o resultado será concatenado. Mas, infelizmente, seu código não está funcionando para mim, n precisa ser incrementado condicionalmente.
manatwork

p=>{for(i=n=0,o='';i<p.length;){c=p[i++];if(n==c<59){o+=' ';n++}o+=c}return o}
Roman Gräf

0

Mathematica, 39 bytes

StringSplit[#,a:DigitCharacter..:>a,2]&

Função anônima. Pega uma string como entrada e retorna uma lista de strings como saída.


0

Raquete 274 bytes

(let((g 0)(j'())(k'())(l'())(m list->string)(r reverse)(n char-numeric?)(c cons))(for((i(string->list s)))
(when(and(= g 0)(n i))(set! g 1))(when(and(= g 1)(not(n i)))(set! g 2))(match g[0(set! j(c i j))]
[1(set! k(c i k))][2(set! l(c i l))]))(list(m(r j))(m(r k))(m(r l))))

Ungolfed:

(define (f s)
  (let ((g 0)
        (j '())
        (k '())
        (l '())
        (m list->string)
        (r reverse)
        (n char-numeric?)
        (c cons))
    (for ((i (string->list s)))
      (when (and (= g 0) (n i)) (set! g 1)  )
      (when (and (= g 1) (not (n i))) (set! g 2) )
      (match g
        [0 (set! j (c i j))]
        [1 (set! k (c i k))]
        [2 (set! l (c i l))]))
    (list (m (r j)) (m (r k)) (m (r l)))))

Teste:

(f "UK7898S14")
(f "cphDK1234CYELLOWS14QGOOD")

Resultado:

'("UK" "7898" "S14")
'("cphDK" "1234" "CYELLOWS14QGOOD")

0

R, 63 52 bytes

Edit: salvou um monte de bytes graças a @JDL

Leva a entrada de stdin e imprime em stdout:

gsub("([a-z]+)(\\d+)(.+)","\\1 \\2 \\3",scan(,""),T)

Exemplo de saída:

[1] "UK 7898 S1"
[1] "cphDK 1234 CYELLOWS14QGOOD"

Não gsub (...,"\\1 \\2 \\3")seria mais eficiente?
JDL #

@JDL Não tenho certeza se eu sigo. Gostaria de elaborar ou dar um exemplo?
Billywob #

algo como gsub("([A-Za-z]+)([0-9]+)(.+)","\\1 \\2 \\3",scan()), embora o primeiro argumento provavelmente pode ser expressa como algo menor do que isso ...
JDL

@JDL Muito inteligente, mas não tenho idéia de como a "\\1 \\2 \\3"substituição funciona. Também atualizou um pouco o padrão regex e o utilizou ignore.case = TRUE.
Billywob

Eles só média de saída "tudo foi capturado no primeiro segundo terceiro par de / / ()suportes.
JDL

0

Gelatina , 14 bytes

O<65ITḣ2‘ṬœṗµY

TryItOnline!

Quão?

O<65ITḣ2‘ṬœṗµY - Main link: productIdentifier   e.g. "UK7898S14"
O              - cast to ordinals               e.g. [85,75,55,56,57,56,83,49,52]
 <65           - less than 65?                  e.g. [ 0, 0, 1, 1, 1, 1, 0, 1, 1]
    I          - incremental difference         e.g. [ 0, 1, 0, 0, 0,-1, 1, 0]
     T         - truthy indexes                 e.g. [2, 6, 7]
      ḣ2       - head to 2                      e.g. [2, 6]
        ‘      - increment                      e.g. [3, 7]
         Ṭ     - set truthy indexes             e.g. [0, 0, 1, 0, 0, 0, 1]
          œṗ   - split y at truthy indexes of x e.g. ["UK", "7898", "S14"]
            µ  - monadic chain separation
             Y - join with line feeds

0

C, 107 bytes

#define p(x) printf("%c",x);
f(char*s){for(;*s>64;s++)p(*s)p(10)for(;*s<58;s++)p(*s)p(10)for(;*s;s++)p(*s)}

Ligue para:

int main()
{
   f("UK7898S14");
   return 0;
}

0

Python 2, 103 94 88 bytes

Solução sem usar regex

a,b=input(),""
for f in a:
 if ord(f)<58:b+=f
 elif b"":c,d=a.split(b);print c,b,d;break

Simplesmente extrai os números do meio e corta a entrada usando o número como um índice. Requer aspas ao redor da entrada, mas não vi em nenhum lugar que as aspas não sejam permitidas.

-9 dividindo a no número do meio e imprima os componentes com b no meio

-6 Obrigado a @Shebang

Casos de teste

D:\>python codes.py
"UK7898S14"
UK 7898 S14

D:\>python codes.py
"cphDK1234CYELLOWS14QGOOD"
cphDK 1234 CYELLOWS14QGOOD

b!="" -> b>""e c=a.split(b) -> c,d=a.split(b) ... print c[0],b,c[1] -> print c,b,dsalva 5 bytes.
Kade

Dicas muito boas @Shebang. Obrigado
ElPedro 9/11/16

Ah, esqueci que strings vazias são falsas. Você pode salvar outros 3 bytes apenas fazendo isso elif b:;)
9-16 de Kade

0

C #, 74 bytes

v=>new System.Text.RegularExpressions.Regex("\\d+").Replace(v,"\n$&\n",1);

Substitua o 1º conjunto de dígitos por retorno de carro, conjunto de dígitos e outro retorno de carro, como Johan Karlsson fez pelo JavaScript.

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.