Каталог товаров


17

Эта проблема заключается в разделении строки, представляющей идентификатор продукта, на три компонента.

  • Первая часть состоит из прописных и строчных букв произвольной длины, представляющих склад.
  • Вторая часть - это цифры, которые представляют номер продукта. Эта часть также имеет произвольную длину.
  • Последняя часть является определителями размера и цвета, и эта часть продолжается до конца строки. Квалификаторы гарантированно начинаются с заглавной буквы и состоят из буквенно-цифровых символов.

Каждая часть должна быть напечатана четко отделены. Гарантируется, что каждая часть не пуста.

Победителем становится тот, кто использует наименьшее количество байтов для решения этой проблемы.

Пример:
вход: UK7898S14

выход:
UK
7898
S14

Здесь Великобритания - Великобритания, 7898 - код продукта, а S14 - размер 14.

Пример 2:
Вход: cphDK1234CYELLOWS14QGOOD

Выход:
cphDK
1234
CYELLOWS14QGOOD

Здесь cphDK - Копенгаген, Дания, 1234 - код продукта, CYELLOWS14QGOOD - желтый цвет, размер 14 и хорошее качество.


2
Каждая часть не пуста?
Карл Напф

@KarlNapf Да. Каждая часть не пуста.
Highace2

@Emigna Добавлен пример добавления.
Highace2

«Первая часть состоит из заглавных и строчных букв» - возможно, один из примеров может содержать такое сочетание прописных и строчных букв. И, возможно, также код страны длиной не более 2 символов. Кроме того, может ли классификатор содержать не буквенно-цифровые символы, такие как «Качество ★★★ ☆☆»?
manatwork

Добро пожаловать в PPCG!
Эрик Outgolfer

Ответы:


10

Perl, 12 байт

11 байт кода + 1 байт для -pфлага.

s/\d+/
$&
/

Чтобы запустить это:

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

2
Люблю простоту! :)
Дом Гастингс

4

APL, 18

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

Работает, ища первые 2 точки, где есть изменение от символа к цифре или наоборот, и используя их для разделения строки.


4

Сетчатка , 28 14 10 8 байт

Сохранено 4 байта благодаря Dom Hastings .
Сохранено 2 байта благодаря Мартину Эндеру .

S1`(\d+)

Попробуйте онлайн!


Используя тот же механизм, что и в ответе @ Dada, вы можете сохранить еще 4 байта: retina.tryitonline.net/… (tbh, возможно, даже больше, но это все, что я мог сохранить! :))
Дом Гастингс,

@DomHastings. Ааа, хорошая идея с заменой!
Emigna

3

Haskell, 36 байт (без регулярных выражений)

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

Это дает результат в формате ("UK",("7898","S14")). Идея состоит в том, чтобы разделить по первой цифре, а затем разделить остальные по первой нецифровой. Попробуйте это на Ideone .


Хорошее использование fmap на кортеже.
xnor


3

JavaScript (ES6), 28 26 байт

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

Сохранено 2 байта благодаря @Grax

Примеры


Вы можете уменьшить еще 2 символа, используя $ & в вашей замене и удалив скобки. s=>s.replace(/\d+/,` $& `)
Grax32

2

Гема, 17 12 знаков

(Хитрость не обрабатывает код страны явно беззастенчиво заимствованный из Дада «s Perl решения . Оценка должно быть выражена там.)

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

Образец прогона:

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 байт

Я не знаю много регулярных выражений, но, к счастью, эта проблема достаточно проста :) Разделяет входную строку в список длиной 3, который содержит каждую часть.

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

2

05AB1E ,39 37 16 байт

Благодаря Emigna сэкономлено много байтов.

Он использует кодировку 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

Попробуйте онлайн!

(Это мой первый пост здесь!)


Вы можете сохранить не менее 14 байтов, проверяя цифры вместо букв . И это может быть больше в гольфе.
Emigna

Кроме того, добро пожаловать в PPCG :)
Emigna

Благодарность! И вы правы, на самом деле я пошел наивно, буквально слева направо. Я также пытался покопаться, .páà¬чтобы получить первую часть, но, на первый взгляд, она не помогает остальным.
Osable

Не стесняйтесь обновить свой ответ с помощью моего кода (и сыграйте в гольф еще раз, если можете). Я не чувствую, что это достаточно отличается, чтобы оправдать свой собственный ответ.
Emigna

Хорошо, я сделаю это тогда, когда я нашел способ поместить это в цикл. Ничего сложного, но, по крайней мере, до 16 байтов. Еще раз спасибо! (Теперь я должен обновить объяснения ... но есть меньше байтов, чтобы объяснить)
Osable


1

Java 7, 200 185 174 167 байт

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 & тестовый код:

Попробуй это здесь.

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

Выход:

UK 7898 S14 
cphDK 1234 CYELLOWS14QGOOD 

1

C #, 191 177 байт

Golfed:

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 сохранено 14 байтов.


Вам не нужно ToCharArray (). строка уже IEnumerable <char>
ссылка Ng

Конечно, я не могу поверить, что я этого не заметил.
Paldir

1

PHP, 48 байт

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

С его $limitпараметром, и фантастически полезным \K, preg_split()идеально подходит для этой задачи.


1

MATLAB, 81 73 байта

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

Функция, которая принимает строку и возвращает массив из трех строк. Протестировано в версии R20105b.

Пример использования:

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

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

объяснение

Регулярное выражение (?<=^\D+)\d+')соответствует группе цифр, которой предшествуют не цифры из начала строки; последние не являются частью матча.

Четвертый вывод regexp- это 'match'; и седьмой вывод - это 'split'две части строки до и после совпадения.


1

Рубин, 28 байт

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

Это окружает первый кластер цифр с символами новой строки.


0

JQ, 47 символов

(43 символа кода + 4 символа параметров командной строки.)

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

(Опять старая история: вначале довольно элегантно, потом становится мучительно многословным.)

Образец прогона:

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

Он-лайн тест (пропуск -rчерез URL не поддерживается - проверьте Raw Output самостоятельно.)


0

PHP, 61 59 56 55 байт

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

Это также выводит исходный код:

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

редактировать

Спасибо @manatwork за сохранение для меня нескольких байтов.
Спасибо @ RomanGräf за сохранение еще нескольких байтов.


1
[\d]? : o \dдостаточно.
manatwork

@ Manatwork Спасибо. Я не использую регулярные выражения (возможно, это хорошо) и начал идти по маршруту [0-9] +, прежде чем вспоминать о \ d
gabe3886

1
Почему бы не заменить [a-z]на \D?
Роман Греф

1
Теперь, когда у вас нет [a-z], iфлаг также не нужен.
manatwork

Мне действительно нужно больше времени на работу с регулярными выражениями.
gabe3886

0

JavaScript без регулярных выражений, 84 81 79 байт

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


2
Вы можете поместить все инициализацию в одном месте: o=n=i=''.
manatwork

И переместить задание с его первым использованием: 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}
Роман Греф

@ RomanGräf, инициализация должна остаться, ''потому что o, к которому результат будет конкатенирован. Но, к сожалению, ваш код не работает для меня, n нужно увеличивать условно.
manatwork

p=>{for(i=n=0,o='';i<p.length;){c=p[i++];if(n==c<59){o+=' ';n++}o+=c}return o}
Роман Греф

0

Mathematica, 39 байт

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

Анонимная функция. Принимает строку в качестве входных данных и возвращает список строк в качестве выходных данных.


0

Ракетка 274 байта

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

Тестирование:

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

Выход:

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

0

R, 63 52 байта

Редактировать: Сохранено несколько байтов благодаря @JDL

Принимает ввод из стандартного ввода и печатает в стандартный вывод:

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

Пример вывода:

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

Не gsub (...,"\\1 \\2 \\3")будет более эффективным?
JDL

@JDL Не уверен, что я следую. Хотите разработать или привести пример?
Billywob

что-то вроде gsub("([A-Za-z]+)([0-9]+)(.+)","\\1 \\2 \\3",scan()), хотя первый аргумент, вероятно, может быть выражен как нечто меньшее, чем это ...
JDL

@JDL Очень умно, но я понятия не имею, как "\\1 \\2 \\3"работает замена. Также немного обновлен шаблон регулярных выражений и используется ignore.case = TRUE.
Billywob

Они просто означают «выводить то, что было записано в первой / второй / третьей паре ()скобок».
JDL

0

Желе , 14 байт

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

TryItOnline!

Как?

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 байтов

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

Звоните с:

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

0

Python 2, 103 94 88 байт

Решение без использования регулярных выражений

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

Просто извлекает числа из середины, а затем разрезает ввод, используя число в качестве индекса. Требуются кавычки вокруг ввода, но я нигде не видел, чтобы кавычки были запрещены.

-9, разделив a на среднее число, затем напечатайте компоненты с b в середине

-6 Благодаря @Shebang

Тестовые случаи

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

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

b!="" -> b>""и c=a.split(b) -> c,d=a.split(b) ... print c[0],b,c[1] -> print c,b,dсохраняет 5 байтов.
Каде

Очень хорошие советы @Shebang. Благодарность
ElPedro

Ах, я забыл, что пустые строки являются ложными. Вы можете сохранить еще 3 байта, просто сделав это elif b:;)
Kade

0

C #, 74 байта

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

Замените 1-й набор цифр на возврат каретки, набор цифр и другой возврат каретки, как это сделал Йохан Карлссон для JavaScript.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.