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


17

Ця проблема пов'язана з розділенням рядка, що представляє ідентифікатор продукту, на три компоненти.

  • Перша частина складається з верхньої та нижньої літер довільної довжини, що представляє склад.
  • Друга частина - цифри, що представляють номер товару. Ця частина також має довільну довжину.
  • Остання частина - класифікатори за розміром та кольором, і ця частина продовжується до кінця рядка. Класифікатори гарантовано починаються з великої літери та складаються з буквено-цифрових символів.

Кожна частина повинна бути надрукована чітко відокремленою. Гарантується, що кожна частина не порожня.

Виграє той, хто використовує найменше байтів для вирішення цієї проблеми.

Приклад:
Введення: UK7898S14

Вихід:
UK
7898
S14

Тут Великобританія - Великобританія, 7898 - код товару, а S14 - розмір 14.

Приклад 2:
Вхід: cphDK1234CYELLOWS14QGOOD

Вихід:
cphDK
1234
CYELLOWS14QGOOD

Тут cphDK - Копенгаген, Данія, 1234 - код товару, CYELLOWS14QGOOD являє собою жовтий колір, розмір 14 та хорошу якість.


2
Чи кожна частина не порожня?
Карл Напф

@KarlNapf Так. Кожна частина не порожня.
Highace2

@Emigna Додано приклад додатку.
Highace2

«Перша частина складається з верхньої та нижньої літер» - Можливо, один із прикладів міг би містити таку суміш верхніх та малих літер. І, можливо, також код країни, який не має двох символів. Також, чи може класифікатор містити буквено-цифрові символи, наприклад "Якість ★★★ ☆☆"?
манатство

Ласкаво просимо до PPCG!
Ерік Аутгольфер

Відповіді:


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 

Працює шляхом пошуку перших двох пунктів, де відбувається перехід від символу до цифри чи навпаки, та їх використання для розділення рядка.


4

Сітківка , 28 14 10 8 байт

Збережено 4 байти завдяки Дому Гастінгсу .
Збережено 2 байти завдяки Мартіну Ендеру .

S1`(\d+)

Спробуйте в Інтернеті!


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

@DomHastings Ааа, приємна ідея з заміною!
Емінья

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

Приклади


Ви можете зменшити ще два символи, використовуючи $ & у своїй заміні та видаленні дужок. 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

Пітон 2, 40 байт

Я не знаю багато Regex, але, на щастя, ця проблема досить проста :) Розділяє рядок введення в список довжиною 3, який містить кожну частину.

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

2

05AB1E ,39 37 16 байт

Збережено багато байтів завдяки Еміньї.

Він використовує кодування 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 байт, перевіривши цифри замість літер . І це, ймовірно, може бути більше гольфу.
Емінья

Також ласкаво просимо до PPCG :)
Emigna

Спасибі! І ти маєш рацію, насправді я наївся наївно на цьому, буквально зліва направо. Я також спробував копати, .páà¬щоб отримати першу частину, але, здається, це не допоможе решті на перший погляд.
Доступний

Не соромтеся оновити свою відповідь моїм кодом (та ще більше, якщо можете). Я не відчуваю, що це достатньо інакше, щоб гарантувати власну відповідь.
Емінья

Ок, я зроблю це тоді, коли знайшов спосіб укласти його в петлю. Нічого занадто витонченого, але принаймні воно знижується до 16 байт. Ще раз дякую вам! (Тепер мені доведеться оновити пояснення ... але є менше байтів для пояснення)
Доступно


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

Невикористаний і тестовий код:

Спробуйте тут.

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

Гольф:

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

Безумовно:

    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: @ Посилання 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

On-line тест (Введення -rURL-адреси не підтримується - перевірте 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 Дякую Я не використовую достатньо регулярного вираження (мабуть, це добре) і спустився на [0-9] + маршрут, перш ніж згадати про \ d
gabe3886

1
Чому б не замінити [a-z]з \D?
Роман Ґраф

1
Тепер, коли у вас немає [a-z], iпрапор також не потрібен.
манатурка

Мені дійсно потрібно відкласти більше часу, працюючи над регулярними виразами.
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=''.
манатурка

І перемістити завдання з його першим використанням: isNaN(c=p[i++]).
манатура

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

@ RomanGräf, ініціалізація повинна залишатися, ''оскільки o, до якого результат буде об'єднаний. Але, на жаль, ваш код не працює для мене, його потрібно збільшувати умовно.
манатство

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

0

Математика, 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))))

Безумовно:

(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

Здійснює введення від stdin та друкує до stdout:

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

СпробуйтеItOnline!

Як?

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, розділивши на середнє число, потім роздрукуйте компоненти з b посередині

-6 Завдяки @Shebang

Випробування

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

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

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

Very nice hints @Shebang. Thanks
ElPedro

Ah, I forgot empty strings are falsy. You can save another 3 bytes by just making it elif b: ;)
Kade

0

C#, 74 bytes

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

Replace 1st set of digits with carriage return, set of digits, and another carriage return, as Johan Karlsson did for JavaScript.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.