โปรแกรมที่สั้นที่สุดในการแยกสตริงที่ไม่ใช่ตัวเลขโดยไม่มี RegExps


16

แก้ไข: หากคุณใช้เสียงกระเพื่อมฉันได้ให้แนวทางบางอย่างที่ด้านล่างในการนับไบต์

วัตถุประสงค์:สร้างฟังก์ชันที่สั้นที่สุดที่แยกสตริงที่ไม่ใช่ตัวเลขและส่งกลับอาร์เรย์ที่ประกอบด้วยตัวเลขเท่านั้นในแต่ละสตริงโดยไม่ต้องใช้นิพจน์ทั่วไปใด ๆ เลขศูนย์นำหน้าจะรวมอยู่ในแต่ละสาย

อันดับปัจจุบัน (แยกเป็นหมวดหมู่):

  • C / C ++ / C # / Java: 68 (C) ....
  • GolfScript / APL / J: 13 (APL)
  • อื่น ๆ ทั้งหมด: 17 (Bash, use tr), 24 (Ruby)

กฎ:

(ฉันขอโทษสำหรับความยาว)

  1. รูปแบบต้องเป็นฟังก์ชันที่มีอาร์กิวเมนต์สตริงเดี่ยว อาจมีการเพิ่มอาร์กิวเมนต์เพิ่มเติมได้สองรายการหากจำเป็นสำหรับการส่งคืนอาเรย์ที่เหมาะสม (เช่น sh / csh / DOS Batch ต้องการการอ้างอิงตัวแปรเพิ่มเติมเพื่อกลับมาเป็นต้น)
  2. การประกาศฟังก์ชั่นหลักไม่นับรวมและจะไม่นำเข้าไลบรารีมาตรฐานอื่น ๆ `# include`s` import`s และ `using`s ไม่นับ ทุกอย่างอื่นทำ ซึ่งรวมถึงฟังก์ชั่น `# define` และผู้ช่วย ขอโทษสำหรับความสับสน. อ้างถึงสิ่งนี้เป็นคำแนะนำที่เป็นประโยชน์ว่าอะไร / ไม่นับ (เขียนในรูปแบบ C-style)
    // ไม่นับรวมทั้งหมดอาจถูกละเว้นยกเว้น
    // ไม่ชัดเจนเหมือนครึ่งหนึ่งของไลบรารี่มาตรฐานของ Java
    #include <stdio.h>
    
    นำเข้า some.builtin.Class // ไม่นับดูด้านบน
    
    #define printf p // นับรวมทั้งหมด
    
    / * คำสั่งตัวประมวลผลล่วงหน้าอื่น ๆ นับรวม * /
    
    int i = 0; // นับ
    
    someFunction (); // นับ
    
    ถ่าน [] [] myMainSplitFunction (ถ่าน [] [] อาร์เรย์) {// ไม่นับ
      // ทุกสิ่งในที่นี้นับ
      return returnArray; // แม้แต่สิ่งนี้ก็นับ
    } // ไม่นับ
    
    / * ทุกอย่างในที่นี้นับรวมถึงการประกาศ * /
    ถ่าน [] [] สตริง someHelperFunction (ถ่าน []) {
      // stuff
    } // แม้แต่สิ่งนี้ก็นับ
    
  3. เอาต์พุตจะต้องเป็นอาเรย์สตริงหรือคล้ายกัน (รายการ Array ใน Java และที่คล้ายกันนั้นเป็นที่ยอมรับได้) ตัวอย่างของการส่งออกได้รับการยอมรับ: String[], char[][], Array, ListและArray(วัตถุ)
  4. อาร์เรย์ต้องมีเพียงค่าดั้งเดิมของสตริงที่มีความยาวผันแปรหรือวัตถุสตริง ไม่ควรมีสตริงว่างในการส่งคืนโดยมีข้อยกเว้นด้านล่าง หมายเหตุ:สตริงจะต้องมีสตริงของการจับคู่แบบต่อเนื่องเช่นอินพุตตัวอย่างและเอาต์พุตด้านล่าง
  5. หากไม่มีการจับคู่ดังนั้นฟังก์ชั่นร่างกายควรกลับมาnullอาร์เรย์ / รายการที่ว่างเปล่าหรืออาร์เรย์ / รายการที่มีสตริงที่ว่างเปล่า
  6. ไม่อนุญาตให้ใช้ไลบรารีภายนอก
  7. จุดสิ้นสุดของบรรทัด DOS จะนับเป็นหนึ่งไบต์ไม่ใช่สอง (รวมอยู่ในเมตาดาต้า แต่ต้องการเน้น)
  8. และกฎที่ใหญ่ที่สุดที่นี่: ไม่อนุญาตให้มีการแสดงออกปกติ

นี่เป็นคำถามเกี่ยวกับการดังนั้นขนาดที่เล็กที่สุดชนะ โชคดี!

และนี่คือตัวอย่างอินพุตและเอาต์พุต (ที่มี Escape C-style):

อินพุต: "abc123def456"
ผลลัพธ์: ["123", "456"]

อินพุต: "aitew034snk582: 3c"
เอาต์พุต: ["034", "582", "3"]

อินพุต: "as5493tax54 \\ 430-52@g9.fc"
เอาท์พุท: ["5493", "54", "430", "52", "9"]

อินพุต: "sasprs] tore \" re \\ forz "
เอาต์พุต: null, [], [""] หรือคล้ายกัน

โปรดระบุจำนวนไบต์ที่ใช้โดยคำตอบของคุณและเช่นเคยมีความสุขกับการเล่นกอล์ฟ!


แนวทางสำหรับเสียงกระเพื่อม

นี่คือสิ่งที่ไม่และไม่นับในภาษา Lisp:

;;; ตัวเลือกที่ 1

(defun แยก - สตริง (ab); ไม่นับ
  (เนื้อหา) ;;; ทุกสิ่งในที่นี้นับ
); ไม่นับ

;;; ตัวเลือก 2

(defun แยกสตริง (สตริง & aux (เริ่มต้น 0) (สิ้นสุด 0)) ไม่นับ
  (เนื้อหา) ;;; ทุกสิ่งในที่นี้นับ
); ไม่นับ
ลูกแกะอื่น ๆ ทั้งหมดนับรวมเข้ากับจำนวนไบต์


คำถามนี้ไม่เคยถามมาก่อนหรือ
Ismael Miguel

1
ใช่ แต่ฉันถามอีกครั้งบน Meta และทำการแก้ไขที่สำคัญก่อนที่จะโพสต์อีกครั้งที่นี่ ด้วยเหตุนี้จึงไม่ควรจัดเป็นรายการที่ซ้ำกัน (รายการที่เกี่ยวข้องอื่นควรถูกปิดหากยังไม่ได้ดำเนินการ)
Isiah Meadows

2
ไม่ควรโพสต์คำว่า "กอล์ฟ" ของคุณเป็นคำตอบใช่หรือไม่
MrWhite

4
ขออภัย แต่ -1 สำหรับการไม่อนุญาต GolfScript ควรอนุญาตทุกภาษา
Doorknob

1
@ Doorknob มันเป็นเรื่องจริง แต่ฉันก็เข้าใจความรู้สึกของ OP ด้วย ผู้คนควรมีโอกาสเข้าร่วมการแข่งขันแม้ว่าพวกเขาจะไม่พูด GolfScript, J หรือ APL (และฉันมีความผิดในการอ่านอย่างหลังในการแข่งขันเหล่านี้) คุณช่วยดูข้อเสนอของฉันในหัวข้อที่เขาเชื่อมโยงได้หรือไม่?
เบีย

คำตอบ:


10

APL, 13 ตัวอักษร

(หรือ 28/30 ไบต์อ่านด้านล่าง)

{⍵⊂⍨⍵∊∊⍕¨⍳10}

ฉันเห็นว่าคุณห้าม GolfScript จากคำถามของคุณ ฉันเข้าใจความรู้สึกของคุณ แต่ฉันหวังว่าชุมชนนี้จะไม่แบน APL เพราะมันเป็นภาษาการเขียนโปรแกรมที่น่าทึ่งอย่างแท้จริงที่มีประวัติยาวนานไม่ต้องพูดถึงความสนุกในการเขียนรหัสบางทีอาจจะเป็นคะแนนที่แตกต่างกัน รู้สึกว่าการแข่งขันไม่เป็นธรรม ฉันจะโพสต์ความคิดของฉันในเรื่องนี้ไปยังเธรดที่คุณเชื่อมโยง

ในโทเค็นเดียวกันนั้นฉันได้เพิ่มเชิงอรรถลงในโพสต์ APL ของฉันเสมอโดยอ้างว่าสามารถทำคะแนน APL ได้เป็น 1 ถ่าน = 1 ไบต์ การอ้างสิทธิ์ของฉันขึ้นอยู่กับความจริงที่ว่าการใช้งาน APL (เชิงพาณิชย์ส่วนใหญ่) ไม่กี่ตัวยังคงสนับสนุนการเข้ารหัสไบต์เดียวแบบดั้งเดิมด้วยสัญลักษณ์ APL ที่แมปกับค่า 128 ไบต์บน แต่นี่อาจจะยืดได้มากเกินไปซึ่งในกรณีนี้คุณอาจต้องการให้คะแนนรายการนี้เป็น 28 ไบต์ใน UTF-16 หรือ 30 ไบต์ใน UTF-8

คำอธิบาย

{        ⍳10}  make an array of naturals from 1 to 10
       ⍕¨      convert each number into a string
      ∊        concatenate the strings into one (it doesn't matter that there are two 1s)
    ⍵∊         test which chars from the argument are contained in the digit string
 ⍵⊂⍨           use it to perform a partitioned enclose, which splits the string as needed

ตัวอย่าง

      {⍵⊂⍨⍵∊∊⍕¨⍳10} 'ab5c0x'
 5  0 
      {⍵⊂⍨⍵∊∊⍕¨⍳10}  'z526ks4f.;8]\p'
 526  4  8 

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

      {q,⍵,q←'"'}¨ {⍵⊂⍨⍵∊∊⍕¨⍳10} 'ab5c0x'
 "5"  "0" 
      {q,⍵,q←'"'}¨ {⍵⊂⍨⍵∊∊⍕¨⍳10}  'z526ks4f.;8]\p'
 "526"  "4"  "8" 

เกี่ยวกับความคิดเห็นของคุณฉันคิดว่าสำหรับภาษาอื่น ๆ แข่งขันอย่างเป็นธรรมกับคน "ชวเลข" อย่างใดอย่างหนึ่งควรนับแต่ละสัญลักษณ์ในภาษาอื่น ๆ เป็นหนึ่งอักขระ ตัวอย่างเช่นโซลูชัน Mathematica ของฉันที่โพสต์ที่นี่ควรนับเป็น 7 (มากกว่าหรือน้อยกว่า) ฉันคิดว่าการออกแบบภาษาที่มีโทเค็นที่ถูกบีบอัดไม่ได้เป็นประโยชน์เลย
ดร. เบลิซาเรีย

คุณช่วยให้คุณทิ้งไม้กอล์ฟของคุณได้หรือไม่? ฉันอ่านตัวละครบางตัวไม่ได้
Isiah Meadows

@impinball hexdump ช่วยคุณได้อย่างไร? ไม่ใช่ว่าคุณจะเห็นสิ่งที่กำลังทำอยู่
mniip

@impinball รหัส APL คือ {omega ปิดการเดินทางรูปแบบ omega epsilon epsilon แต่ละ eota 10} หากคุณต้องการค่ายูนิโค้ดคุณสามารถคัดลอกและวางลงในเครื่องมือออนไลน์ใด ๆได้แม้ว่าคุณจะไม่เห็นตัวอักษร (ซึ่งแปลกเพราะตัวอักษร Unicode ที่ทันสมัยส่วนใหญ่มีสัญลักษณ์ APL) ไม่ว่าคุณจะได้รับอะไร {\ u2375 \ u2282 \ u2368 \ u2375 \ u220a \ u220a \ u2355 \ u00a8 \ u237310} (คำนึงถึง "10" สุดท้ายซึ่งไม่ได้เป็นส่วนหนึ่งของลำดับการหลบหนี)
Tobia

1
แทนที่จะ∊⍕¨⍳10ใช้คุณไม่สามารถใช้⎕Dใช่ไหม '0123456789'ที่ควรจะเป็นอย่างต่อเนื่อง Dyalog APL สนับสนุนอย่างน้อยที่สุดและ NARS2000 ก็เช่นกัน
marinus

5

Python 47

การดำเนินงาน

f=lambda s:"".join([' ',e][e.isdigit()]for e in s).split()

การสาธิต

>>> sample=["abc123def456","aitew034snk582:3c","as5493tax54\\430-52@g9.fc","sasprs]tore\"re\\forz"]
>>> [f(data) for data in sample]
[['123', '456'], ['034', '582', '3'], ['5493', '54', '430', '52', '9'], []]

ขั้นตอนวิธี

แปลงอักขระที่ไม่ใช่ตัวเลขแต่ละตัวเป็นช่องว่างแล้วแยกสตริงที่เป็นผลลัพธ์ วิธีการที่ง่ายและชัดเจน

และทางออกที่สนุกกับ itertools (71 ตัวอักษร)

f1=lambda s:[''.join(v)for k,v in __import__("itertools").groupby(s,key=str.isdigit)][::2]

4

ทับทิม, 70

f=->(s){s.chars.chunk{|c|c.to_i.to_s==c}.select{|e|e[0]}.transpose[1]}

เวอร์ชั่นออนไลน์สำหรับการทดสอบ

เนื่องจากการแปลงอักขระที่ไม่ใช่ตัวเลขใด ๆ ให้เป็น int จะส่งกลับค่า 0 ใน Ruby (with to_i) การแปลงถ่านทุกตัวเป็น int และกลับไปที่ char เป็นวิธีที่ไม่ใช่ regex ในการตรวจสอบตัวเลข ...


คุณสามารถทำสมาชิก ('0' .. '9') ได้ด้วย? สำหรับตัว
ละคร

คุณพูดถูก - ฉันควรพูดว่า: "a" way;)
David Herrmann

4

bash, 26 (เนื้อหาฟังก์ชั่น: 22 + ค่าใช้จ่ายในการกำหนดอาร์เรย์ 4)

นี่จะไม่เอาชนะคำตอบอื่น ๆbashแต่น่าสนใจเพราะอาจทำให้คุณซ้ำซ้อน:

f()(echo ${1//+([!0-9])/ })

การใช้งานคือ:

$ a=(`f "ab5c0x"`); echo ${a[@]}
5 0
$ a=(`f "z526ks4f.;8]\p"`); echo ${a[@]}
526 4 8
$ 

ในภาพรวมครั้งแรก//+([!0-9])/ดูเหมือนว่าจะมีการทดแทน regexp มากมาย แต่ไม่ใช่ มันเป็นการขยายพารามิเตอร์ bashซึ่งเป็นไปตามกฎการจับคู่รูปแบบแทนที่จะเป็นกฎการแสดงออกปกติ

การคืนค่าประเภทอาเรย์ของ bash ที่แท้จริงจากฟังก์ชั่น bash เป็นความเจ็บปวดดังนั้นฉันเลือกที่จะส่งคืนรายการที่คั่นด้วยช่องว่างแทนจากนั้นแปลงเป็นอาเรย์ในการกำหนดอาเรย์ภายนอกการเรียกใช้ฟังก์ชัน ดังนั้นเพื่อประโยชน์ของความเป็นธรรมฉันรู้สึกว่า(` `)ควรจะรวมฟังก์ชั่นการโทรรอบ ๆ ไว้ในคะแนนของฉัน


3

Mathematica 32

StringCases[#,DigitCharacter..]&

การใช้

inps ={"abc123def456", "aitew034snk582:3c", "as5493tax54\\430-52@g9.fc", 
        "sasprs]tore\"re\\forz"}  
StringCases[#,DigitCharacter..]&/@inps

{{"123", "456"}, 
 {"034", "582", "3"}, 
 {"5493", "54", "430", "52", "9"}, 
 {}
}

การใช้ regexes ที่เทียบเท่านั้นมีความยาวกว่ามาก!:

StringCases[#, RegularExpression["[0-9]+"]] &

Mathematica ดูดที่ regex
CalculatorFeline

3

Bash, 21 ไบต์ 17/21 ไบต์ (ปรับปรุงโดยDigitalTrauma )

สร้างรายการที่คั่นด้วยช่องว่างด้วย tr

function split() {
tr -c 0-9 \ <<E
$1
E
}

แทนที่ที่ไม่ใช่ตัวเลขใด ๆ ด้วยช่องว่าง

การใช้

$ for N in $(split 'abc123def456'); do echo $N; done
123
456

แก้ไข

ตามที่แสดงความคิดเห็นด้านล่างรหัสสามารถปล้นได้ถึง 17 ไบต์:

function split() (tr -c 0-9 \ <<<$1)

และเนื่องจากผลลัพธ์ไม่ได้พูดอาร์เรย์ของ Bash อย่างเข้มงวดการใช้ควรเป็น

a=(`split "abc123def456"`); echo ${a[@]}

และ(``)ควรนับส่วนเกิน


1
Gah คุณเอาชนะฉันมัน! แต่ทำไมไม่ใช้สตริงที่นี่แทนเอกสารนี่? นอกจากนี้คุณสามารถบันทึกบรรทัดใหม่ในตอนท้ายของเนื้อหาฟังก์ชั่นที่คุณใช้(blah)แทน:{blah;} split()(tr -c 0-9 \ <<<$1)ด้วยวิธีนี้ร่างกายของคุณมีเพียง 17 ตัวอักษร
Digital Trauma

1
ฟังก์ชันของคุณส่งคืน "รายการที่คั่นด้วยช่องว่าง" แทนที่จะเป็นอาร์เรย์ แน่นอนกลับอาร์เรย์จริงจากฟังก์ชั่นทุบตีเป็นที่น่าอึดอัดใจ a=($(split "12 3a bc123")); echo ${a[@]}แต่อย่างน้อยคุณสามารถกำหนดผลของการทำงานของคุณไปยังอาร์เรย์ในการใช้งานของคุณ: อาจเป็นที่ถกเถียงกันอยู่ว่า "($ ())" ถูกนับในคะแนนของคุณ
Digital Trauma

ก่อนที่จะสำรวจtrวิธีการที่ผมพยายามทำเช่นนี้กับการขยายตัวพารามิเตอร์ trเป็นวิธีที่ดีกว่าสำหรับการเล่นกอล์ฟ
Digital Trauma

คุณเคยลองtrใช้ตัวดำเนินการขยายหรือไม่? มันจะออกมาคล้าย($(tr...))ๆ กันและในกรณีที่การประกาศฟังก์ชั่นไม่ได้นับวงเล็บนอกจะไม่นับรวมกับคุณ มันจะเป็นส่วนทดแทนคำสั่งเท่านั้น
Isiah Meadows

ฉันไม่เห็นว่าสิ่งนี้จะทำงานได้ดี แต่ฉันไม่คล่องใน Bash arrays อย่างไรก็ตาม(``)โครงสร้างเป็น 1 char ที่ดีกว่า($())และจะเป็นที่ต้องการ
Coaumdio

2

Smalltalk (Smalltalk / X), 81

f := [:s|s asCollectionOfSubCollectionsSeparatedByAnyForWhich:[:ch|ch isDigit not]]

ค่า f: 'abc123def456' -> OrderedCollection ('123' '456')

ค่า f: 'aitew034snk582: 3c' -> OrderedCollection ('034' '582' '3')

ค่า f: 'as5493tax54 \ 430-52@g9.fc' -> OrderedCollection ('5493' '54' '430' '52' '9')

ค่า f: 'sasprs] tore \ "re \ forz' -> OrderedCollection ()

ถอนหายใจ - Smalltalk มีแนวโน้มที่จะใช้ชื่อฟังก์ชันยาว veeeery ...


2
นั่นคือชื่อฟังก์ชั่นหรือไม่? o__O
Tobia

@tobia เห็นได้ชัดว่า ...
Isiah Meadows

asCollectionOfSubCollectionsSeparatedByAnyForWhichಠ_ಠชื่อนี้ยาวเกินไป
TuxCrafting

1

R, 81

f=function(x){
s=strsplit(x,"",T)[[1]]
i=s%in%0:9
split(s,c(0,cumsum(!!diff(i))))[c(i[1],!i[1])]
}

ฟังก์ชั่นยอมรับสตริงและส่งคืนรายการสตริง

ตัวอย่าง:

> f("abc123def456")
$`1`
[1] "1" "2" "3"

$`3`
[1] "4" "5" "6"

-

> f("aitew034snk582:3c")
$`1`
[1] "0" "3" "4"

$`3`
[1] "5" "8" "2"

$`5`
[1] "3"

-

> f("as5493tax54\\430-52@g9.fc")
$`1`
[1] "5" "4" "9" "3"

$`3`
[1] "5" "4"

$`5`
[1] "4" "3" "0"

$`7`
[1] "5" "2"

$`9`
[1] "9"

-

> f("sasprs]tore\"re\\forz")
$<NA>
NULL

หมายเหตุ: $xเป็นชื่อขององค์ประกอบรายการ


1

Perl, 53

แก้ไข:ไม่จับคู่ตอนนี้ส่งคืนรายการที่มีสตริงว่าง (แทนรายการว่าง) ตามต้องการ

นอกจากนี้ยังหลีกเลี่ยงการแยกอักขระช่องว่างเดียวเนื่องจากจะทำให้เกิดการแยก 'กับพื้นที่สีขาว'ซึ่งอาจเป็นการละเมิดกฎ ฉันสามารถใช้/ /ตัวคั่นซึ่งจะแยกในพื้นที่เดียว แต่จะขัดแย้งกันดูเหมือนว่าใช้รูปแบบ regexp ฉันสามารถใช้unpackอักขระพิเศษบางอย่างและกำจัดการsplitโต้เถียงออกไปโดยสิ้นเชิง แต่ฉันคิดว่าสิ่งที่ฉันจบด้วยการแยกอักขระที่เป็นตัวอักษร (นอกเหนือจากช่องว่าง) ก็โอเค

sub f{shift if(@_=split a,pop=~y/0-9/a/csr)[0]eq''and$#_;@_}

และไม่ใช่ตัวดำเนินการทับศัพท์ของ Perl ไม่แสดงผลปกติ ฉันสามารถยกเลิกช่วง 0-9 ถึง0123456789หากเป็นปัญหา


ตราบใดที่มันไม่ได้ใช้นิพจน์ทั่วไปก็จะใช้ได้
Isiah Meadows

Perl ของฉันไม่แข็งแรงนัก หากฉันเข้าใจรหัสคุณกำลังแทนที่ไม่ใช่ตัวเลขด้วยตัวเลขที่ไม่ใช่ตัวเลขเฉพาะจากนั้นแยกเป็นตัวเลขที่ไม่ใช่ตัวเลขที่เลือกจากนั้นกรองสตริงว่าง นี่เป็นการอ่านที่ถูกต้องหรือไม่?
Tim Seguine

1
@ TimSeguine: ไม่แน่นอน ตัวเลขที่ไม่ใช่ตัวเลขจะถูกแทนที่และบีบให้เป็นอักขระตัวเดียวโดยแยกออกซึ่งสร้างสตริงว่างหากตัวคั่นนั้นเกิดขึ้นที่จุดเริ่มต้น มันจะถูกเลื่อนออกไปหากรายการมีรายการอื่น
2846289

รายการเพิ่มเติมไม่เป็นไร
Isiah Meadows

1

C, 68 ไบต์ (เฉพาะเนื้อหาของฟังก์ชัน)

void split (char *s, char **a) {
int c=1;for(;*s;s++)if(isdigit(*s))c?*a++=s:0,c=0;else*s=0,c=1;*a=0;
}

อาร์กิวเมนต์แรกคือสตริงอินพุตส่วนที่สองคืออาร์เรย์เอาต์พุตซึ่งเป็นอาร์เรย์สตริงที่สิ้นสุดด้วยค่า NULL หน่วยความจำเพียงพอจะต้องสงวนไว้สำหรับaก่อนที่จะเรียกฟังก์ชัน (กรณีที่เลวร้ายที่สุด: sizeof(char*)*((strlen(s)+1)/2))

ฟังก์ชั่นสายป้อนข้อมูลจะถูกปรับเปลี่ยนโดยฟังก์ชั่น (ตัวละครที่ไม่ใช่ตัวเลขทุกตัวจะถูกแทนที่ด้วย'\0')

ตัวอย่างการใช้งาน

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

void split (char *s, char **a) {
int c=1;for(;*s;s++)if(isdigit(*s))c?*a++=s:0,c=0;else*s=0,c=1;*a=0;
}   

void dump(char **t) {
    printf("[ ");for(;*t;t++)printf("%s ", *t);printf("]\n");
}   

int main() {
    char **r = malloc(1024);
    char test1[] = "abc123def456";
    char test2[] = "aitew034snk582:3c";
    char test3[] = "as5493tax54\\430-52@g9.fc";
    char test4[] = "sasprs]tore\"re\\forz";
    split(test1,r); 
    dump(r);
    split(test2,r); 
    dump(r);
    split(test3,r); 
    dump(r);
    split(test4,r); 
    dump(r);
    return 0;
}

เอาท์พุต

[ 123 456 ]
[ 034 582 3 ]
[ 5493 54 430 52 9 ]
[ ]

รุ่นที่ไม่ตีกอล์ฟ:

void split (char *s, char **a) {
    int c=1; // boolean: the latest examined character is not a digit
    for(;*s;s++) {
        if(isdigit(*s)) {
            if(c) *a++ = s; // stores the address of the beginning of a digit sequence
            c=0;
        } else {
            *s=0; // NULL-terminate the digit sequence
            c=1;
        }   
    }   
    *a = 0; // NULL-terminate the result array
} 

1

VBScript, 190 (164 โดยไม่มีการประกาศฟังก์ชัน)

Function f(i)
For x=1 To Len(i)
c=Mid(i,x,1)
If Not IsNumeric(c) Then
Mid(i,x,1)=" "
End If
Next
Do
l=Len(i)
i=Replace(i,"  "," ")
l=l-Len(i)
Loop Until l=0
f=Split(Trim(i)," ")
End Function

ในขณะที่ไม่สามารถแข่งขันได้ทั้งหมดฉันประหลาดใจที่ VBScript ออกมาสั้น ๆ เกี่ยวกับเรื่องนี้เนื่องจากความละเอียด (13 ไบต์สำหรับ CRs เพียงอย่างเดียว) มันวนรอบสตริงแทนที่อักขระที่ไม่ใช่ตัวเลขด้วยช่องว่างจากนั้นลดช่องว่างทั้งหมดเป็นช่องว่างเดียวแล้วใช้ตัวคั่นช่องว่างเพื่อแบ่ง

กรณีทดสอบ

Input: "ab5c0x"
Output: 5,0

Input: "z526ks4f.;8]\p"
Output: 526,4,8

จุดสิ้นสุดของบรรทัด DOS จะนับเป็นหนึ่งตัวอักษรเท่าที่ฉันอ่านบนเมตา
Isiah Meadows

ฉันแนะนำการแก้ไขให้คุณ
Isiah Meadows

การนับจะถือว่าสิ้นสุดบรรทัด Linux สไตล์ 1 ไบต์แล้ว ฉันได้รับ 190 ตัวละครด้วยการนับของฉัน (เพิ่งตรวจสอบอีกครั้ง)
Comintern

ตกลง. ฉันจะต้องผิดพลาด
Isiah Meadows

1

Common Lisp (1 ตามตัวอักษร; ≈173ตามวิญญาณ)

นี่คือรุ่นที่อ่านได้ จำนวนไบต์ค่อนข้างสูงเนื่องจากชื่อยาวในสิ่งที่ชอบdigit-char-pและposition-ifและvector-push-extendและ

(defun extract-numeric-substrings (string &aux (start 0) (end 0) (result (make-array 0 :adjustable t :fill-pointer 0)))
  (loop 
     (unless (and end (setq start (position-if #'digit-char-p string :start end)))
       (return result))
     (setq end (position-if (complement #'digit-char-p) string :start (1+ start)))
     (vector-push-extend (subseq string start end) result)))
(extract-numeric-substrings "abc123def456")
#("123" "456")

(extract-numeric-substrings "aitew034snk582:3c")
#("034" "582" "3")

(extract-numeric-substrings "as5493tax54\\430-52@g9.fc")
#("5493" "54" "430" "52" "9")

(extract-numeric-substrings "sasprs]tore\"re\\forz")
#()

แนวคิดของ "การประกาศฟังก์ชั่น" นั้นค่อนข้างคลุมเครือ นี่คือรุ่นที่มีเพียงหนึ่งไบต์ (ตัวละครxในส่วนของฟังก์ชั่น); ทุกอย่างรวมอยู่ในตัวแปรเสริมของรายการ lamba ของฟังก์ชั่น (ส่วนหนึ่งของการประกาศฟังก์ชั่น):

(defun extract-numeric-substrings (string 
                                   &aux (start 0) (end 0) 
                                   (result (make-array 0 :adjustable t :fill-pointer 0))
                                   (x (loop 
                                         (unless (and end (setq start (position-if #'digit-char-p string :start end)))
                                           (return result))
                                         (setq end (position-if (complement #'digit-char-p) string :start (1+ start)))
                                         (vector-push-extend (subseq string start end) result))))
  x)

จำนวนไบต์ที่เกิดขึ้นจริงจะขึ้นอยู่กับจำนวนของการประกาศเสริมจะต้องถูกย้ายเข้าไปในร่างกายเพื่อที่จะถือว่าเป็นที่ยอมรับ การเปลี่ยนชื่อฟังก์ชั่นในตัวเครื่องบางอย่างก็ช่วยได้เช่นกันposition-ifเนื่องจากปรากฏสองครั้งใช้ตัวแปรตัวอักษรเดี่ยว ฯลฯ )

การแสดงผลของโปรแกรมนี้มี 220 ตัวอักษร:

(LOOP(UNLESS(AND END(SETQ START(POSITION-IF #'DIGIT-CHAR-P STRING :START END)))(RETURN RESULT))(SETQ END(POSITION-IF(COMPLEMENT #'DIGIT-CHAR-P)STRING :START(1+ START)))(VECTOR-PUSH-EXTEND(SUBSEQ STRING START END)RESULT))

หากไม่มีสิ่งอื่นใดสิ่งนี้ควรส่งเสริม ตัวแปร & Lisp ของ Common Lispและตัวแปร

สิ่งนี้สามารถเขียนได้กระชับยิ่งขึ้นด้วย loopแน่นอน:

(defun extract-numeric-substrings (s &aux (b 0) (e 0) (r (make-array 0 :fill-pointer 0)))
  (loop 
     with d = #'digit-char-p 
     while (and e (setq b (position-if d s :start e)))
     finally (return r)
     do 
       (setq e (position-if-not d s :start (1+ b)))
       (vector-push-extend (subseq s b e) r)))

loopรูปแบบกับพื้นที่พิเศษลบออกได้ 173 ตัวอักษร:

(LOOP WITH D = #'DIGIT-CHAR-P WHILE(AND E(SETQ B(POSITION-IF D S :START E)))FINALLY(RETURN R)DO(SETQ E(POSITION-IF-NOT D S :START(1+ B)))(VECTOR-PUSH-EXTEND(SUBSEQ S B E)R))

ฉันจะนับตั้งแต่เริ่มต้น(resultจนถึงวงเล็บสุดท้ายเพื่อเป็นร่างกาย ส่วนที่กำหนดชื่อและพารามิเตอร์คือการประกาศ
Isiah Meadows

โปรดดูกฎที่ 2 เกี่ยวกับกฎที่แก้ไขเพิ่มเติมของฉันเพื่อดูสิ่งที่ฉันกำลังพูดถึงในการประกาศฟังก์ชั่น (โดยทั่วไปประกาศชื่อฟังก์ชั่นพารามิเตอร์และถ้าจำเป็นต้องใช้ syntactically ซึ่งไม่ค่อยพบในภาษาที่ตีความชนิดผลตอบแทน)
Isiah Meadows

@impinball ใช่การนับ "1" เป็นเรื่องตลก แต่ส่วนที่สำคัญที่นี่result คือการประกาศเป็นพารามิเตอร์ที่นี่ มันเพิ่งมีรูปแบบการเริ่มต้นที่ไม่สำคัญมาก โดยหลักการแล้วมันเป็นสิ่งเดียวกันในฐานะอาร์กิวเมนต์ที่เป็นทางเลือกพร้อมค่าเริ่มต้นที่คำนวณโดยนิพจน์ที่ซับซ้อนบางอย่าง (ในกรณีที่ง่ายกว่านั้นมันง่ายที่จะจินตนาการถึงบางสิ่งบางอย่างchar* substring( char *str, int begin, int end(0) )ในบางภาษาที่มีไวยากรณ์คล้าย C เพื่อระบุว่าendเป็นตัวเลือกและหากไม่ได้ระบุไว้ค่าของมันคือ0ฉันกำลังเน้นข้อเท็จจริงที่คำเหล่านี้
Joshua Taylor

@impinball ยังไม่เป็นรูปธรรมและมีภาษาที่ไม่เชื่อเรื่องพระเจ้ามากพอที่จะป้องกันจำนวนไบต์ที่หมุนรอบได้ :)
Joshua Taylor

ส่วนแรกที่ไม่ได้ระบุพารามิเตอร์คือที่ฉันจะนับสถิติ (เช่น(defun fn (string &aux (start 0) (end 0)จะไม่นับ แต่ทุกอย่างที่เหลือในแลมบ์ดาจะ)
Isiah Meadows

0

จาวาสคริปต์, 240 ไบต์

และสำหรับคนที่อยากรู้อยากเห็นนี่คือสนามกอล์ฟขนาดใหญ่ของฉัน:

function split(a) { // begin function
function f(c){for(var a=-1,d=9;d--;){var e=c.indexOf(d+"");0
>e||e<a&&(a=e)}return 0<a?a:null}var c=f(a);if(null==c)retur
n null;var d=[];for(i=0;;){a=a.substring(c);d[i]||(d[i]="");
c=f(a);if(null==c)break;d[i]+=a.charAt(c);0<c&&i++}return d;
} // end function

ข้างต้นในการพิมพ์สวย:

function split(a) {
    function f(c) {
        for (var a = -1, d = 9;d--;) {
            var e = c.indexOf(d + "");
            0 > e || e < a && (a = e);
        }
        return 0 < a ? a : null;
    }
    var c = f(a);
    if (null == c) return null;
    var d = [];
    for (i = 0;;) {
        a = a.substring(c);
        d[i] || (d[i] = "");
        c = f(a);
        if (null == c) break;
        d[i] += a.charAt(c);
        0 < c && i++;
    }
    return d;
}

ด้านบนในรหัสอธิบายปกติ

function split(a) {
    function findLoop(string) {
        var lowest = -1;
        var i = 9;
        while (i--) {
            var index = string.indexOf(i + '');
            if (index < 0) continue;
            if (index < lowest) lowest = index;
        }
        return (lowest > 0) ? lowest : null;
    }
    var index = findLoop(a);
    if (index == null) return null;
    var ret = [];
    i = 0;
    for ( ; ; ) {
        a = a.substring(index);
        if (!ret[i]) ret[i] = '';
        index = findLoop(a);
        if (index == null) break;
        ret[i] += a.charAt(index);
        if (index > 0) i++;
    }
    return ret;
}

0

PHP 134

function f($a){
$i=0;while($i<strlen($a)){!is_numeric($a[$i])&&$a[$i]='-';$i++;}return array_filter(explode('-',$a),function($v){return!empty($v);});
}

array_filterคุณสามารถลดได้โดยการออกจากการเรียกกลับที่ การดำเนินการนี้จะลบรายการทั้งหมดโดยอัตโนมัติซึ่งfalseเมื่อพวกเขาถูกส่งไปยังบูลีน
kelunik

@kelunik ที่จะกรอง 0s ด้วย
Einacio

0

C, 158

#define p printf
char s[100],c;int z,i;int main(){while(c=getchar())s[z++]=(c>47&&c<58)*c;p("[");for(;i<z;i++)if(s[i]){p("\"");while(s[i])p("%c",s[i++]);p("\",");}p("]");}

เนื่องจาก C ไม่มีฟังก์ชั่นการพิมพ์อาเรย์ในตัวฉันจึงต้องทำงานด้วยตัวเองดังนั้นฉันจึงขอโทษที่มีเครื่องหมายจุลภาคสุดท้ายในทุกผลลัพธ์ เป็นหลักสิ่งที่รหัสทำมันอ่านสตริงถ้าไม่ใช่ตัวเลขมันแทนที่ด้วย '\ 0' แล้วฉันวนรอบรหัสและพิมพ์โซ่ทั้งหมดของตัวเลข (EOF = 0)

อินพุต: ab5c0x
เอาต์พุต: ["5", "0",]

อินพุต: z526ks4f.; 8] \ p
เอาต์พุต: ["526", "4", "8",]


ตามกฎของคำถาม (กฎ 2) คุณจะต้องนับอักขระในเนื้อหาของฟังก์ชันเท่านั้น ดังนั้นทางออกของคุณจะน้อยกว่า 170 ไบต์ ฉันไม่แน่ใจว่าการนับรวมตัวแปรต้นแบบนอกเนื้อหาของฟังก์ชันหรือไม่
grovesNL

ฉันจะแก้ไขกฎนี้: #defines, ประกาศตัวแปร ฯลฯ จะนับ แต่การประกาศฟังก์ชั่นจะไม่
Isiah Meadows

นอกจากนี้ครั้งล่าสุดที่ฉันตรวจสอบมีประเภทใน C notated char[][]ซึ่งเป็นสิ่งที่ถูกกฎหมาย หากคุณกลับมาเป็น (หรือchar**) คุณจะไม่เป็นไร
Isiah Meadows

มันไม่จำเป็นต้องเป็นเอาท์พุทข้อความ? ฉันแม้ว่าโปรแกรมควรจะส่งออกอาร์เรย์ในรูปแบบสตริง
ASKASK

0

C #, 98

static string[] SplitAtNonDigits(string s)
{
    return new string(s.Select(c=>47<c&c<58?c:',').ToArray()).Split(new[]{','},(StringSplitOptions)1);
}

ก่อนอื่นใช้.Select()วิธีการขยายLINQ เพื่อเปลี่ยนตัวเลขที่ไม่ใช่ตัวเลขทั้งหมดให้เป็นเครื่องหมายจุลภาค string.Replace()จะดีกว่าเพราะมันส่งกลับstringมากกว่าIEnumerable<char>แต่string.Replace()สามารถใช้ถ่านเดียวหรือสตริงและไม่สามารถทำให้การใช้คำกริยาเหมือนหรือchar.IsDigit()47<c&c<58

ดังที่ได้กล่าว.Select()ไปแล้วการประยุกต์ใช้กับสตริงจะส่งคืนค่าIEnumerable<char>ดังนั้นเราต้องเปลี่ยนกลับเป็นสตริงโดยเปลี่ยนเป็นอาร์เรย์และส่งผ่านอาร์เรย์ไปยังตัวstringสร้าง

string.Split()สุดท้ายเราแยกสตริงที่ใช้จุลภาค (StringSplitOptions)1เป็นวิธีที่สั้นกว่าในการพูดStringSplitOptions.RemoveEmptyEntriesซึ่งจะดูแลเครื่องหมายจุลภาคและเครื่องหมายคอมม่าหลายรายการติดต่อกันโดยอัตโนมัติที่จุดเริ่มต้น / สิ้นสุดของสตริง


1
แทนที่จะchar.IsDigit(c)ใช้คุณสามารถใช้'/'<c&&c<':'
grovesNL

1
จุดดี ... หรือดีกว่านั้น47<c&&c<58. (ตรงไปตรงมาฉันประหลาดใจที่ทำงานกับตัวเลข แต่เห็นได้ชัดว่ามันไม่)
BenM

1
และฉันสามารถบันทึกตัวละครที่มีค่าพิเศษได้ด้วยการใช้ '&' เดี่ยวแทนที่จะเป็น '&&' สองเท่า ใน C # นี่ยังคงเป็นตรรกะและเมื่อตัวถูกดำเนินการทั้งสองเป็นบูลีน - มันจะทำเพียงบิตและในขณะที่มันเป็นจำนวนเต็ม
BenM

ทำได้ดีนี่. ฉันไม่รู้ว่ามันสามารถทำเช่นนั้นได้
grovesNL

ตัวแปรที่สั้นกว่าเล็กน้อยคือการแบ่งบนพื้นที่สีขาวแทน,แล้วลบรายการเปล่าด้วยตนเองreturn new string(s.Select(c=>47<c&c<58?c:' ').ToArray()).Split().Where(a=>a!="").ToArray();
VisualMelon

0

JS / โหนด: 168 162 147 138 ตัวอักษร

function n(s){
var r=[];s.split('').reduce(function(p,c){if(!isNaN(parseInt(c))){if(p)r.push([]);r[r.length-1].push(c);return 0;}return 1;},1);return r;
}

รุ่นสวยงาม:

function n(s) {
  var r = [];
  s.split('').reduce(function (p, c) {
    if (!isNaN(parseInt(c))) {
      if (p) {
        r.push([]);
      }
      r[r.length - 1].push(c);
      return 0;
    }
    return 1;
  }, 1);
  return r;
}

คำถามนี้เพียงต้องการอาร์เรย์กลับมาเพื่อให้คุณสามารถลบconsole.log(r)และบางสิ่งอื่น ๆ
ไม่ว่าชาร์ลส์

การประกาศฟังก์ชั่นไม่นับรวมกับคะแนน (เหตุผลคือเพื่อช่วยให้ระดับการเล่น)
อิสยาห์มีโดวส์

ตกลง. ปรับคะแนนตามความคิดเห็นของ @ impinball (ที่จริงแล้วมีสองฟังก์ชั่นประกาศที่นี่นับ Char รวมถึงฟังก์ชั่นที่ไม่ระบุชื่อ)
palanik

มันควรจะ. ฉันอัปเดตกฎเพื่อช่วยอธิบายให้ดีขึ้น
ทุ่งหญ้า Isiah

มาพร้อมกับสิ่งที่ดีกว่า ...
palanik

0

ทับทิม, 24

f=->s{s.tr("
-/:-~",' ').split}

กำหนดตัวเลขโดยใช้ช่องว่างลบภายในช่วง ASCII ที่พิมพ์ได้


ประกาศฟังก์ชั่นจะไม่นับ
Isiah Meadows

0

php , 204

function s($x){$a=str_split($x);$c=-1;$o=array();
for($i= 0;$i<count($a);$i++){if(ord($a[$i])>=48&&ord($a[$i])<=57)
{$c++;$o[$c]=array();}while(ord($a[$i])>=48&&ord($a[$i])<=57)
{array_push($o[$c],$a[$i]);$i++;}}return $o;}

รหัสอธิบาย:

function splitdigits($input){

    $arr = str_split($input);
    $count = -1;
    $output = array();
    for($i = 0; $i < count($arr); $i++){


    if(ord($arr[$i]) >= 48 && ord($arr[$i]) <= 57){
        $count++;
        $output[$count] = array();
    }

    while(ord($arr[$i]) >= 48 && ord($arr[$i]) <= 57){
        array_push($output[$count], $arr[$i]);
        $i++;
    } 

}

return $output;
}

นี่คือรหัสที่ค่อนข้างยาวและฉันแน่ใจว่าจะมี php เวอร์ชันสั้นกว่ามากสำหรับกอล์ฟรหัสนี้ นี่คือสิ่งที่ฉันสามารถเกิดขึ้นใน PHP


มีการปรับปรุงบางส่วน: คุณสามารถแทนที่array()ด้วย[], array_push($output[$count], $arr[$i]);มี$output[$count][]=$arr[$i];และการตรวจสอบด้วยord() is_numeric()และคุณไม่จำเป็นต้องแยกสตริงเพื่อย้ำตัวละคร นอกจากนี้ยังมีเพียงรหัสภายในของการนับฟังก์ชั่นเพื่อให้เป็นที่เป็นคุณ char นับเป็น 204
Einacio

การประกาศฟังก์ชั่นจะไม่นับ อ้างถึงกฎ 2 เป็นแนวทางในสิ่งที่นับและสิ่งที่ไม่
Isiah Meadows


0

Python 104 83

def f(s, o=[], c=""):
    for i in s:
        try:int(i);c+=i
        except:o+=[c];c=""
    return [i for i in o+[c] if i]

@Abhijit คำตอบนั้นฉลาดมากนี่เป็นเพียงรุ่น "ย่อ" ของสิ่งที่ฉันมีอยู่ในใจ

assert f("abc123def456") == ["123", "456"]
assert f("aitew034snk582:3c") == ["034", "582", "3"]
assert f("as5493tax54\\430-52@g9.fc") == ["5493", "54", "430", "52", "9"]
assert f("sasprs]tore\"re\\forz") == []

สิ่งนี้จะไม่มีเอาต์พุตดังนั้นโค้ดจะทำงานหากรันทีละตัวเนื่องจากตัวแปรบางตัวถูกกำหนดที่การประกาศ


คุณไม่จำเป็นต้องนับการประกาศฟังก์ชันถ้าคุณทำ เช่นเดียวกับหัว
Isiah Meadows

0

PHP 98 89

ในคำตอบทุบตีของ DigitalTrauma สิ่งนี้ไม่ได้ใช้ regex

function f($x) {
// Only the following line counts:
for($h=$i=0;sscanf(substr("a$x",$h+=$i),"%[^0-9]%[0-9]%n",$j,$s,$i)>1;)$a[]=$s;return@$a;
}

กรณีทดสอบ:

php > echo json_encode(f("abc123def456")), "\n";
["123","456"]
php > echo json_encode(f("aitew034snk582:3c")), "\n";
["034","582","3"]
php > echo json_encode(f("as5493tax54\\430-52@g9.fc")), "\n";
["5493","54","430","52","9"]
php > echo json_encode(f("sasprs]tore\"re\\forz")), "\n";
null

0

Haskell 31

{-# LANGUAGE OverloadedStrings #-}
import Data.Char (isDigit)
import Data.Text (split)

f=filter(/="").split(not.isDigit)

มันแยกสตริงกับตัวละครที่ไม่ใช่ตัวเลขทั้งหมดและลบสตริงว่างที่สร้างขึ้นโดยตัวคั่นต่อเนื่อง


0

VBA 210, 181 โดยไม่มีการประกาศฟังก์ชัน

Function t(s)
Dim o()
For Each c In Split(StrConv(s,64),Chr(0))
d=IsNumeric(c)
If b And d Then
n=n&c
ElseIf d Then:ReDim Preserve o(l):b=1:n=c
ElseIf b Then:b=0:o(l)=n:l=l+1:End If:Next:t=o
End Function

0

Rebol (66 ตัวอักษร)

remove-each n s: split s complement charset"0123456789"[empty? n]s

Ungolfed และห่อในการประกาศฟังก์ชั่น:

f: func [s] [
    remove-each n s: split s complement charset "0123456789" [empty? n]
    s
]

โค้ดตัวอย่างใน Rebol console:

>> f "abc123def456"
== ["123" "456"]

>> f "aitew035snk582:3c"
== ["035" "582" "3"]

>> f "as5493tax54\\430-52@g9.fc"
== ["5493" "54" "430" "52" "9"]

>> f {sasprs]torer"re\\forz}
== []

0

JavaScript, 104 97 89

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

แก้ไข:เมื่อลูปเดินออกจากจุดสิ้นสุดของอาเรย์cคือundefinedซึ่งเป็นเท็จและยุติการวนซ้ำ

2/27:การใช้?:บันทึก wordiness if/elseของ

function nums(s) {
s+=l='length';r=[''];for(k=i=0;c=s[i];i++)r[k]+=+c+1?c:r[k+=!!r[k][l]]='';
r[l]--;return r
}

การคืนรถในร่างกายมีไว้เพื่อให้อ่านได้และไม่ได้เป็นส่วนหนึ่งของการแก้ปัญหา

Ungolfed:

แนวคิดคือการผนวกอักขระแต่ละตัวในรายการสุดท้ายในอาร์เรย์ถ้าเป็นตัวเลขและเพื่อให้แน่ใจว่ารายการอาร์เรย์สุดท้ายเป็นสตริงมิฉะนั้น

function nums(s) {
    var i, e, r, c, k;
    k = 0;
    s+='x'; // ensure the input does not end with a digit
    r=[''];
    for (i=0;i<s.length;i++) {
        c=s[i];
        if (+c+1) { // if the current character is a digit, append it to the last entry
            r[k] += c;
        }
        else { // otherwise, add a new entry if the last entry is not blank
            k+=!!r[k].length;
            r[k] = '';
        }
    }
    r.length--; // strip the last entry, known to be blank
    return r;
}

0

Javascript, 72

function f(a){
 a+=".",b="",c=[];for(i in a)b=+a[i]+1?b+a[i]:b?(c.push(b),""):b;return c
}

Ungolfed

a+=".",b="",c=[];        //add '.' to input so we dont have to check if it ends in a digit
for(i in a)
    b=+a[i]+1?           //check if digit, add to string if it is
        b+a[i]:         
    b?                   //if it wasnt a digit and b contains digits push it
        (c.push(b),""):  //into the array c and clear b
    b;                   //else give me b back
return c

ตัวอย่างอินพุต / เอาต์พุต

console.log(f("abc123def456"));
console.log(f("aitew034snk582:3c"));
console.log(f("as5493tax54\\430-52@g9.fc"));
console.log(f("sasprs]tore\"re\\forz"));

["123", "456"]
["034", "582", "3"]
["5493", "54", "430", "52", "9"]
[] 

JSFiddle


1
I like it! Much simpler than my own. You can drop another 8 characters by replacing if(+a[i]+1)b+=a[i];else if(b)c.push(b),b="" with b=+a[i]+1?b+a[i]:b?(c.push(b),""):b.
DocMax

@DocMax thx, I edited to include your suggestion :). That (c.push(b),"") seemed clever, never seen that.
Danny

I had forgotten about it until I saw it used extensively earlier today in codegolf.stackexchange.com/questions/22268#22279
DocMax

That's not valid, ' ' is mistaken for 0 and it's a javascript quirk difficult to manage. Try '12 34 56'
edc65

0

R 52

This function splits strings by character class (this is not regex! :)) class is N - numeric characters and P{N} means negation of this class. o=T means omit empty substrings.

x
## [1] "wNEKbS0q7hAXRVCF6I4S" "DpqW50YfaDMURB8micYd" "gwSuYstMGi8H7gDAoHJu"
require(stringi)
stri_split_charclass(x,"\\P{N}",o=T)
## [[1]]
## [1] "0" "7" "6" "4"

## [[2]]
## [1] "50" "8" 

## [[3]]
## [1] "8" "7"

0

PHP 99

<?php

$a = function($s) {
foreach(str_split($s)as$c)$b[]=is_numeric($c)?$c:".";return array_filter(explode('.',implode($b)));
};

var_dump($a("abc123def456"));
var_dump($a("aitew034snk582:3c"));
var_dump($a("as5493tax54\\430-52@g9.fc"));
var_dump($a("sasprs]tore\"re\\forz"));


Output

array(2) {
  [3]=>
  string(3) "123"
  [6]=>
  string(3) "456"
}
array(3) {
  [5]=>
  string(3) "034"
  [8]=>
  string(3) "582"
  [9]=>
  string(1) "3"
}
array(5) {
  [2]=>
  string(4) "5493"
  [5]=>
  string(2) "54"
  [6]=>
  string(3) "430"
  [7]=>
  string(2) "52"
  [9]=>
  string(1) "9"
}
array(0) {
}

0

JavaScript 88

88 chars when not counting function n(x){}

function n(x){
y=[],i=0,z=t=''
while(z=x[i++])t=!isNaN(z)?t+z:t&&y.push(t)?'':t
if(t)y.push(t)
return y
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.