Catalogo de producto


17

Este problema se trata de separar una cadena que representa un identificador de producto en tres componentes.

  • La primera parte consta de letras superiores e inferiores de longitud arbitraria que representa el almacén.
  • La segunda parte son los dígitos que representan el número del producto. Esta parte también es de longitud arbitraria.
  • La última parte son calificadores como tamaño y colores, y esta parte continúa hasta el final de la cadena. Los calificadores están garantizados para comenzar con una letra mayúscula y consisten en caracteres alfanuméricos.

Cada parte debe imprimirse claramente separada. Se garantiza que cada parte no está vacía.

El ganador es el que usa menos bytes para resolver este problema.

Ejemplo:
Entrada: UK7898S14

Salida:
Reino Unido
7898
S14

Aquí Reino Unido es Reino Unido, 7898 es el código del producto y S14 es talla 14.

Ejemplo 2:
Entrada: cphDK1234CYELLOWS14QGOOD

Salida:
cphDK
1234
CYELLOWS14QGOOD

Aquí cphDK es Copenhague, Dinamarca, 1234 es el código del producto, CYELLOWS14QGOOD representa color amarillo, tamaño 14 y buena calidad.


2
¿Cada parte no está vacía?
Karl Napf

@KarlNapf Sí. Cada parte no está vacía.
Highace2

@Emigna Ahora se ha incluido un ejemplo adicional.
Highace2

"La primera parte consiste en letras mayúsculas y minúsculas" - Tal vez uno de los ejemplos podría contener tal mezcla de letras mayúsculas y minúsculas. Y quizás también un código de país que no tenga 2 caracteres. Además, ¿podría el calificador contener caracteres no alfanuméricos, como “Calidad ★★★ ☆☆”?
trabajo de

Bienvenido a PPCG!
Erik the Outgolfer

Respuestas:


10

Perl, 12 bytes

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

s/\d+/
$&
/

Para ejecutarlo:

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

2
Me encanta la simplicidad! :)
Dom Hastings

4

APL, 18

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

Funciona buscando los primeros 2 puntos donde hay un cambio de carácter a dígito o viceversa, y usándolos para dividir la cadena.



3

Haskell, 36 bytes (sin expresiones regulares)

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

Esto da el resultado en el formato ("UK",("7898","S14")). La idea es dividir en el primer dígito, y luego dividir el resto en el primer no dígito. Pruébalo en Ideone .


Buen uso de fmap en una tupla.
xnor


3

JavaScript (ES6), 28 26 bytes

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

Guardado 2 bytes gracias a @Grax

Ejemplos


Puede reducir 2 caracteres más usando $ & en su reemplazo y eliminando los paréntesis. s=>s.replace(/\d+/,` $& `)
Grax32

2

Gema, 17 12 caracteres

(El truco de no manejar el código de país se tomó prestado descaradamente de la solución Perl de Dada . El agradecimiento debe expresarse allí).

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

Ejecución de muestra:

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

No sé mucho Regex, pero afortunadamente este problema es bastante simple :) Separa la cadena de entrada en una lista de longitud 3 que contiene cada parte.

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

2

05AB1E ,39 37 16 bytes

Ahorré muchos bytes gracias a Emigna.

Utiliza la codificación 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

Pruébalo en línea!

(¡Esta es mi primera publicación acá!)


Puede guardar al menos 14 bytes marcando dígitos en lugar de letras . Y esto probablemente se puede jugar más al golf.
Emigna

Además, bienvenidos a PPCG :)
Emigna

¡Gracias! Y tienes razón, en realidad fui todo ingenuo en este caso, literalmente de izquierda a derecha. También traté de cavar .páà¬para obtener la primera parte, pero no parece ayudar para el resto a primera vista.
Osable el

Siéntase libre de actualizar su respuesta con mi código (y juegue un poco más si puede). No creo que sea lo suficientemente diferente como para garantizar su propia respuesta.
Emigna

Ok, lo haré entonces, ya que encontré una manera de ponerlo en un bucle. Nada demasiado sofisticado, pero al menos se reduce a 16 bytes. ¡Gracias de nuevo! (Ahora tengo que actualizar las explicaciones ... pero hay menos bytes para explicar)
Osable el

1

JavaScript (ES6), 36 bytes

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

Ejemplos


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 y código de prueba:

Pruébalo aquí

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

Salida:

UK 7898 S14 
cphDK 1234 CYELLOWS14QGOOD 

1

C #, 191 177 bytes

Golfizado:

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

Sin golf:

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

EDITAR1: @Link Ng guardó 14 bytes.


No necesita ToCharArray (). la cadena ya es IEnumerable <char>
Enlace Ng

Por supuesto, no puedo creer que no me haya dado cuenta de esto.
paldir

1

PHP, 48 bytes

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

Con su $limitparámetro y la fantásticamente útil \K, preg_split()es perfecto para este desafío.


1

MATLAB, 81 73 bytes

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

Función que acepta una cadena y devuelve una matriz de celdas de tres cadenas. Probado en la versión R20105b.

Ejemplo de uso:

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

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

Explicación

La expresión regular (?<=^\D+)\d+') coincide con un grupo de dígitos precedidos por no dígitos desde el comienzo de la cadena; estos últimos no son parte del partido.

La cuarta salida de regexpes el 'match'; y la séptima salida son las 'split'dos partes de la cadena antes y después del partido.


1

Rubí, 28 bytes.

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

Esto rodea el primer grupo de dígitos con nuevas líneas.


0

jq, 47 caracteres

(Código de 43 caracteres + opciones de línea de comando de 4 caracteres).

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

(Nuevamente, la vieja historia: bastante elegante al principio, luego se vuelve dolorosamente detallada).

Ejecución de muestra:

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

Prueba en línea ( -rno se admite el paso por la URL; compruebe usted mismo la salida sin formato).


0

PHP, 61 59 56 55 bytes

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

Esto también genera el código inicial:

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

Editar

Gracias a @manatwork por guardar algunos bytes para mí
Gracias a @ RomanGräf por otros pocos bytes guardados


1
[\d]? : o \des suficiente.
trabajo de

@manatwork Gracias. No uso suficiente expresión regular (posiblemente algo bueno) y comencé a bajar la ruta [0-9] + antes de recordar sobre \ d
gabe3886

1
¿Por qué no reemplazar [a-z]con \D?
Roman Gräf

1
Ahora que no tienes [a-z], la ibandera tampoco es necesaria.
trabajo de

Realmente necesito perder más tiempo trabajando en expresiones regulares.
gabe3886

0

JavaScript sin expresión regular, 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
Se puede poner todas las inicializaciones en un solo lugar: o=n=i=''.
trabajo de

Y mover la asignación de c para su primer uso: isNaN(c=p[i++]).
trabajo de

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, la inicialización debe permanecer ''porque la o, a la que se concatenará el resultado. Pero lamentablemente su código no funciona para mí, n necesita incrementarse condicionalmente.
trabajo de

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]&

Función anónima. Toma una cadena como entrada y devuelve una lista de cadenas como salida.


0

Raqueta 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))))

Sin golf:

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

Pruebas:

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

Salida:

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

0

R, 63 52 bytes

Editar: guardado un montón de bytes gracias a @JDL

Toma datos de stdin e imprime en stdout:

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

Salida de ejemplo:

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

¿No gsub (...,"\\1 \\2 \\3")sería más eficiente?
JDL

@JDL No estoy seguro de seguir. ¿Te importa elaborar o dar un ejemplo?
Billywob

algo así gsub("([A-Za-z]+)([0-9]+)(.+)","\\1 \\2 \\3",scan()), aunque el primer argumento probablemente puede expresarse como algo más pequeño que eso ...
JDL

@JDL Muy inteligente, pero no tengo idea de cómo funciona el "\\1 \\2 \\3"reemplazo. También actualicé un poco el patrón regex y lo usé ignore.case = TRUE.
Billywob

Simplemente significan "generar lo que fue capturado en el primer / segundo / tercer par de ()paréntesis."
JDL

0

Jalea , 14 bytes

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

TryItOnline!

¿Cómo?

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

Llamar con:

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

0

Python 2, 103 94 88 bytes

Solución sin 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

Simplemente extrae los números del medio y luego corta la entrada usando el número como índice. Requiere comillas alrededor de la entrada, pero no vi en ninguna parte que las comillas no estén permitidas.

-9 dividiendo a en el número del medio y luego imprima los componentes con b en el medio

-6 Gracias a @Shebang

Casos de prueba

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

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

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

Muy buenas sugerencias @Shebang. Gracias
ElPedro

Ah, olvidé que las cadenas vacías son falsas. Puede guardar otros 3 bytes con solo hacerlo elif b:;)
Kade

0

C #, 74 bytes

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

Reemplace el primer conjunto de dígitos con retorno de carro, conjunto de dígitos y otro retorno de carro, como hizo Johan Karlsson para JavaScript.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.