แคตตาล็อกสินค้า


17

ปัญหานี้เกี่ยวกับการแยกสตริงที่แสดงตัวระบุผลิตภัณฑ์ออกเป็นสามองค์ประกอบ

  • ส่วนแรกประกอบด้วยตัวอักษรบนและล่างของความยาวโดยพลการซึ่งหมายถึงคลังสินค้า
  • ส่วนที่สองคือตัวเลขที่แสดงถึงหมายเลขผลิตภัณฑ์ ส่วนนี้ยังมีความยาวตามอำเภอใจ
  • ส่วนสุดท้ายคือตัวระบุขนาดและสีและส่วนนี้จะดำเนินต่อไปจนถึงจุดสิ้นสุดของสตริง ผู้รับรองจะได้รับการประกันให้เริ่มต้นด้วยอักษรตัวใหญ่และประกอบด้วยตัวอักษรและตัวเลข

แต่ละส่วนควรพิมพ์แยกกันอย่างชัดเจน รับประกันได้ว่าแต่ละส่วนจะไม่ว่างเปล่า

ผู้ชนะคือผู้ที่ใช้ไบต์น้อยที่สุดในการแก้ปัญหานี้

ตัวอย่าง:
อินพุต: UK7898S14

เอาต์พุต:
UK
7898
S14

สหราชอาณาจักรคือสหราชอาณาจักร 7898 เป็นรหัสผลิตภัณฑ์และ S14 คือขนาด 14

ตัวอย่างที่ 2:
อินพุต: cphDK1234CYELLOWS14QGOOD

เอาต์พุต:
cphDK
1234
CYELLOWS14QGOOD

ที่นี่ cphDK คือโคเปนเฮเกนเดนมาร์ก 1234 เป็นรหัสผลิตภัณฑ์ CYELLOWS14QGOOD แสดงสีเหลืองขนาด 14 และคุณภาพดี


2
แต่ละส่วนไม่ว่างเปล่าหรือไม่?
Karl Napf

@KarlNapf ใช่ แต่ละส่วนไม่ว่างเปล่า
Highace2

@Emigna มีการเพิ่มตัวอย่างเพิ่มเติมแล้ว
Highace2

“ ส่วนแรกประกอบด้วยตัวอักษรตัวใหญ่และตัวเล็ก” - ตัวอย่างหนึ่งอาจมีส่วนผสมของตัวอักษรตัวใหญ่และตัวเล็ก และอาจเป็นรหัสประเทศที่มีความยาวไม่เกิน 2 ตัวอักษร นอกจากนี้ตัวระบุอาจมีอักขระที่ไม่ใช่ตัวอักษรและตัวเลขเช่น“ คุณภาพ★★★☆☆” หรือไม่
จัดการ

ยินดีต้อนรับสู่ PPCG!
Erik the Outgolfer

คำตอบ:


10

Perl, 12 ไบต์

รหัส 11 ไบต์ + 1 ไบต์สำหรับการ-pตั้งค่าสถานะ

s/\d+/
$&
/

วิธีเรียกใช้:

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

2
รักความเรียบง่าย! :)
Dom Hastings

4

APL, 18

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

ทำงานโดยค้นหา 2 จุดแรกซึ่งมีการเปลี่ยนแปลงจากตัวละครเป็นตัวเลขหรือกลับกันและใช้เพื่อแยกสตริง


4

Retina , 28 14 10 8 ไบต์

ที่บันทึกไว้ 4 ไบต์ขอบคุณที่Dom เฮสติ้งส์
ที่บันทึกไว้ 2 ไบต์ขอบคุณที่มาร์ตินเอนเดอร์

S1`(\d+)

ลองออนไลน์!


การใช้กลไกเดียวกับคำตอบของ @ Dada คุณสามารถบันทึกอีก 4 ไบต์: retina.tryitonline.net/ … (tbh อาจจะมากกว่านี้ แต่นั่นคือทั้งหมดที่ฉันสามารถบันทึกได้! :))
Dom Hastings

@DomHastings อ๊ะความคิดที่ดีจะไปแทนที่!
Emigna

3

Haskell, 36 ไบต์ (ไม่มี regex)

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

("UK",("7898","S14"))นี้จะช่วยให้ผลในรูปแบบที่ ความคิดคือการแยกที่หลักแรกแล้วแยกส่วนที่เหลือที่ไม่ใช่หลักแรก ลองบน Ideone


ใช้ fmap กับ tuple ได้ดี
xnor


3

JavaScript (ES6), 28 26 ไบต์

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

บันทึก 2 ไบต์ขอบคุณ @Grax

ตัวอย่าง


คุณสามารถลดอักขระได้อีก 2 ตัวโดยใช้ $ & ในการแทนที่และลบวงเล็บ s=>s.replace(/\d+/,` $& `)
Grax32

2

Gema, 17 12 ตัวอักษร

(กลอุบายของการไม่จัดการรหัสประเทศอย่างไร้ยางอายยืมมาจากสารละลาย PerlของDadaควรแสดงความขอบคุณไว้ที่นั่น)

<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 ไบต์

ฉันไม่รู้จัก Regex มากนัก แต่โชคดีที่ปัญหานี้ง่ายพอ :) แยกสตริงอินพุตเข้าในรายการความยาว 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 ไบต์

แข็งแรงเล่นกอล์ฟ:

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 () สตริงมีจำนวน IE แล้ว <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'นั่นคือสองส่วนของสตริงก่อนและหลังการแข่งขัน



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 - ตรวจสอบข้อมูลดิบด้วยตัวคุณเอง)


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ก็เพียงพอแล้ว
จัดการ

@ การจัดการขอบคุณ ฉันใช้ regex ไม่พอ (เป็นสิ่งที่ดี) และเริ่มต้นเส้นทาง [0-9] + ก่อนที่จะนึกถึง \ d
gabe3886

1
ทำไมไม่เปลี่ยน[a-z]ด้วย\D?
Roman Gräf

1
ตอนนี้คุณไม่มี[a-z]แล้วiไม่จำเป็นต้องติดธง
จัดการ

ฉันต้องใช้เวลามากขึ้นในการแสดงออกปกติ
gabe3886

0

JavaScript ที่ไม่มี regex, 84 81 79 ไบต์

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


2
คุณสามารถใส่ initializations 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}
Roman Gräf

@ RomanGräfการเริ่มต้นควรอยู่''เนื่องจาก o ซึ่งผลลัพธ์จะถูกต่อกัน แต่น่าเสียดายที่รหัสของคุณไม่ทำงานสำหรับฉัน n ต้องเพิ่มตามเงื่อนไข
จัดการ

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 ไบต์

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

รับอินพุตจาก 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"เปลี่ยนใช้งานยังไง นอกจากนี้ยังมีการปรับปรุงรูปแบบการ regex 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 ไบต์

วิธีการแก้ปัญหาโดยไม่ต้องใช้ 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

เพียงแยกตัวเลขจากตรงกลางแล้วแบ่งอินพุตโดยใช้ตัวเลขเป็นดัชนี ต้องใช้เครื่องหมายคำพูดรอบอินพุต แต่ฉันไม่เห็นว่ามีการอ้างอิงคำพูดใด ๆ

-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 ไบต์
Kade

คำแนะนำที่ดีมาก @Shebang ขอบคุณ
ElPedro

อาฉันลืมสายว่างเปล่าเป็นเท็จ คุณสามารถบันทึกอีก 3 ไบต์โดยทำมันelif b:)
Kade

0

C #, 74 ไบต์

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

แทนที่ชุดตัวเลขชุดที่ 1 ด้วยผลตอบแทนการขนส่งชุดตัวเลขและการรับคืนอื่นตามที่ Johan Karlsson ทำเพื่อใช้งาน JavaScript

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.