Danh mục sản phẩm


17

Vấn đề này là về việc tách một chuỗi đại diện cho một định danh sản phẩm thành ba thành phần.

  • Phần đầu tiên bao gồm các chữ cái trên và dưới có độ dài tùy ý đại diện cho kho.
  • Phần thứ hai là các chữ số đại diện cho số sản phẩm. Phần này cũng có độ dài tùy ý.
  • Phần cuối cùng là vòng loại như kích thước và màu sắc, và phần này tiếp tục đến cuối chuỗi. Các vòng loại được đảm bảo bắt đầu bằng chữ in hoa và bao gồm các ký tự chữ và số.

Mỗi phần nên được in rõ ràng tách biệt. Nó được đảm bảo rằng mỗi phần là không trống.

Người chiến thắng là người sử dụng ít byte nhất để giải quyết vấn đề này.

Ví dụ:
Đầu vào: UK7898S14

Đầu ra:
UK
7898
S14

Ở đây Vương quốc Anh là Vương quốc Anh, 7898 là mã sản phẩm và S14 là kích thước 14.

Ví dụ 2:
Đầu vào: cphDK1234CYELLOWS14QGOOD

Đầu ra:
cphDK
1234
CYELLOWS14QGOOD

Ở đây cphDK là Copenhagen, Đan Mạch, 1234 là mã sản phẩm, CYELLOWS14QGOOD đại diện cho màu vàng, kích thước 14 và chất lượng tốt.


2
Là mỗi phần không trống?
Karl Napf

@KarlNapf Vâng. Mỗi phần không trống.
Highace2

@Emigna Một ví dụ bổ sung hiện đã được đưa vào.
Highace2

Phần đầu tiên bao gồm các chữ cái trên và dưới chữ viết - Có thể một trong những ví dụ có thể chứa hỗn hợp các chữ cái viết hoa và viết thường. Và cũng có thể là mã quốc gia không dài 2 ký tự. Ngoài ra, vòng loại có thể chứa các ký tự không phải là chữ và số, như Chất lượng ★★★ ☆ ♥ Lần không?
manatwork

Chào mừng đến với PPCG!
Erik the Outgolfer 8/11/2016

Câu trả lời:


10

Perl, 12 byte

11 byte mã + 1 byte cho -pcờ.

s/\d+/
$&
/

Để chạy nó:

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

2
Yêu sự đơn giản! :)
Dom Hastings

4

APL, 18

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

Hoạt động bằng cách tìm kiếm 2 điểm đầu tiên trong đó có sự thay đổi từ ký tự sang chữ số hoặc ngược lại và sử dụng các điểm đó để phân tách chuỗi.


4

Võng mạc , 28 14 10 8 byte

Đã lưu 4 byte nhờ vào Dom Hastings .
Đã lưu 2 byte nhờ Martin Ender .

S1`(\d+)

Hãy thử trực tuyến!


Sử dụng cơ chế tương tự như câu trả lời của @ Dada, bạn có thể lưu thêm 4 byte: retina.tryitonline.net/ ((tbh, thậm chí có thể nhiều hơn, nhưng đó là tất cả những gì tôi có thể lưu! :))
Dom Hastings

@DomHastings. Aah, ý tưởng tốt đẹp đi với sự thay thế!
Emigna

3

Haskell, 36 byte (không có biểu thức chính quy)

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

Điều này cho kết quả trong định dạng ("UK",("7898","S14")). Ý tưởng là tách ở chữ số đầu tiên, và sau đó chia phần còn lại ở chữ số đầu tiên. Hãy thử nó trên Ideone .


Sử dụng tốt đẹp của fmap trên một tuple.
xnor


3

JavaScript (ES6), 28 26 byte

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

Đã lưu 2 byte nhờ @Grax

Ví dụ


Bạn có thể giảm thêm 2 ký tự bằng cách sử dụng $ & thay thế và xóa dấu ngoặc đơn. s=>s.replace(/\d+/,` $& `)
Grax32

2

Gema, 17 12 ký tự

(Thủ thuật không xử lý mã quốc gia rõ ràng không biết xấu hổ mượn từ giải pháp Perl của Dada . Đánh giá cao nên được thể hiện ở đó.)

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

Chạy mẫu:

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 byte

Tôi không biết nhiều về Regex, nhưng may mắn là vấn đề này đủ đơn giản :) Phân chia chuỗi đầu vào thành một danh sách có độ dài 3 chứa mỗi phần.

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

2

05AB1E ,39 37 16 byte

Đã lưu rất nhiều byte nhờ Emigna.

Nó sử dụng mã hóa 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

Hãy thử trực tuyến!

(Đây là bài viết đầu tiên của tôi ở đây!)


Bạn có thể lưu ít nhất 14 byte bằng cách kiểm tra các chữ số thay vì chữ cái . Và điều này có thể có thể được chơi golf nhiều hơn.
Emigna

Ngoài ra, chào mừng bạn đến với PPCG :)
Emigna

Cảm ơn! Và bạn đúng, thực sự tôi đã ngây thơ về điều này, theo nghĩa đen từ trái sang phải. Tôi cũng đã cố gắng đào .páà¬để có được phần đầu tiên, nhưng nó dường như không giúp ích cho phần còn lại từ cái nhìn đầu tiên.
Có thể vào

Vui lòng cập nhật câu trả lời của bạn với mã của tôi (và đánh gôn thêm nếu bạn có thể). Tôi không cảm thấy rằng nó đủ khác nhau để đảm bảo câu trả lời của riêng nó.
Emigna

Ok tôi sẽ làm điều đó khi tôi tìm thấy một cách để đặt nó trong một vòng lặp. Không có gì quá phức tạp, nhưng ít nhất nó giảm xuống còn 16 byte. Cám ơn bạn một lần nữa! (Bây giờ tôi phải cập nhật các giải thích ... nhưng có ít byte hơn để giải thích)
Osable


1

Java 7, 200 185 174 167 byte

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

Mã thử nghiệm & mã hóa:

Hãy thử nó ở đây.

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

Đầu ra:

UK 7898 S14 
cphDK 1234 CYELLOWS14QGOOD 

1

C #, 191 177 byte

Chơi gô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)}");

Ung dung:

    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 đã lưu 14 byte.


Bạn không cần ToCharArray (). chuỗi đã có IEn Countable <char>
Liên kết Ng

Tất nhiên, tôi không thể tin rằng tôi đã không nhận thấy điều này.
paldir

1

PHP, 48 byte

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

Với $limitthông số của nó , và rất hữu ích \K, preg_split()là hoàn hảo cho thử thách này.


1

MATLAB, 81 73 byte

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

Hàm chấp nhận một chuỗi và trả về một mảng ô gồm ba chuỗi. Đã thử nghiệm trong phiên bản R20105b.

Ví dụ sử dụng:

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

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

Giải trình

Biểu thức chính quy (?<=^\D+)\d+')khớp với một nhóm các chữ số đứng trước các chữ số không bắt đầu từ đầu chuỗi; cái sau không phải là một phần của trận đấu.

Đầu ra thứ tư của regexp'match'; và đầu ra thứ bảy 'split'là, hai phần của chuỗi trước và sau trận đấu.


1

Ruby, 28 byte

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

Điều này bao quanh cụm chữ số đầu tiên với dòng mới.


0

jq, 47 ký tự

(Mã 43 ký tự + 4 ký tự tùy chọn dòng lệnh.)

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

(Một lần nữa câu chuyện cũ: ban đầu khá thanh lịch, sau đó trở nên dài dòng đau đớn.)

Chạy mẫu:

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

Kiểm tra trực tuyến (Chuyển -rqua URL không được hỗ trợ - hãy tự kiểm tra Đầu ra thô.)


0

PHP, 61 59 56 55 byte

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

Điều này cũng xuất ra mã ban đầu:

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

Biên tập

Cảm ơn @manatwork đã lưu một vài byte cho tôi
Cảm ơn @ RomanGräf vì đã lưu một vài byte


1
[\d]? : o \dlà đủ.
manatwork

@manatwork Cảm ơn. Tôi không sử dụng regex đủ (có thể là một điều tốt) và bắt đầu xuống tuyến đường [0-9] + trước khi nhớ về \ d
gabe3886

1
Tại sao không thay thế [a-z]bằng \D?
Roman Gräf

1
Bây giờ bạn không có [a-z], icờ cũng không cần thiết.
manatwork

Tôi thực sự cần phải dành nhiều thời gian hơn để làm việc trên các biểu thức thông thường.
gabe3886

0

JavaScript không có regex, 84 81 79 byte

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


2
Bạn có thể đặt tất cả các khởi tạo ở một nơi duy nhất : o=n=i=''.
manatwork

Và chuyển nhiệm vụ sang c để sử dụng đầu tiên của nó : 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, việc khởi tạo nên duy trì ''vì o, mà kết quả sẽ được nối. Nhưng thật đáng buồn, mã của bạn không hoạt động với tôi, n cần phải được tăng lên một cách có điều kiện.
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

Toán học, 39 byte

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

Chức năng ẩn danh. Lấy một chuỗi làm đầu vào và trả về một danh sách các chuỗi làm đầu ra.


0

Vợt 274 byte

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

Ung dung:

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

Kiểm tra:

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

Đầu ra:

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

0

R, 63 52 byte

Chỉnh sửa: Đã lưu một loạt byte nhờ @JDL

Đưa đầu vào từ stdin và in ra thiết bị xuất chuẩn:

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

Ví dụ đầu ra:

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

Sẽ không gsub (...,"\\1 \\2 \\3")hiệu quả hơn?
JDL

@JDL Không chắc tôi làm theo. Quan tâm đến việc xây dựng hoặc đưa ra một ví dụ?
Billywob

một cái gì đó giống như gsub("([A-Za-z]+)([0-9]+)(.+)","\\1 \\2 \\3",scan()), mặc dù đối số đầu tiên có thể được thể hiện dưới dạng một cái gì đó nhỏ hơn thế ...
JDL

@JDL Rất thông minh nhưng tôi không biết làm thế nào "\\1 \\2 \\3"thay thế hoạt động mặc dù. Cũng cập nhật mẫu regex một chút và sử dụng ignore.case = TRUE.
Billywob

Chúng chỉ có nghĩa là "đầu ra bất cứ thứ gì được chụp trong cặp ()ngoặc đầu tiên / thứ hai / thứ ba .
JDL

0

Thạch , 14 byte

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

Dùng thử trực tuyến!

Làm sao?

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 byte

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

Gọi với:

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

0

Python 2, 103 94 88 byte

Giải pháp mà không cần sử dụng 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

Đơn giản chỉ cần trích xuất các số từ giữa sau đó cắt đầu vào bằng cách sử dụng số làm chỉ mục. Yêu cầu trích dẫn xung quanh đầu vào nhưng tôi không thấy bất cứ nơi nào báo giá không được phép.

-9 bằng cách tách a trên số ở giữa, sau đó in các thành phần có b ở giữa

-6 Cảm ơn @Shebang

Các trường hợp thử nghiệm

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,dtiết kiệm 5 byte.
Kade

Gợi ý rất hay @Shebang. Cảm ơn
ElPedro

Ah, tôi quên chuỗi trống là giả. Bạn có thể lưu thêm 3 byte chỉ bằng cách tạo nó elif b:;)
Kade

0

C #, 74 byte

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

Thay thế bộ chữ số thứ nhất bằng trả về vận chuyển, bộ chữ số và trả lại số khác, như Johan Karlsson đã làm cho JavaScript.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.