EDIT: Jika Anda menggunakan Lisp, saya telah memberikan beberapa panduan di bagian bawah dalam menghitung byte.
Tujuan: Membuat fungsi terpendek yang memisahkan string pada non-digit dan mengembalikan array yang terdiri dari hanya digit di setiap string, tanpa menggunakan ekspresi reguler apa pun. Nol terkemuka harus dimasukkan dalam setiap string.
Peringkat saat ini (dipisahkan dalam kategori):
- C / C ++ / C # / Java: 68 (C) ....
- GolfScript / APL / J: 13 (APL)
- Lainnya: 17 (Bash, penggunaan
tr
), 24 (Ruby)
Aturan:
(Saya minta maaf atas panjangnya)
- Format harus sebagai fungsi dengan argumen string tunggal. Hingga dua argumen tambahan dapat ditambahkan jika perlu untuk pengembalian array yang tepat (mis. Sh / csh / DOS Batch membutuhkan referensi variabel tambahan untuk dikembalikan, dll.).
- Deklarasi fungsi utama tidak masuk hitungan, dan juga tidak mengimpor perpustakaan standar lainnya. `# include`,` import`, dan `using` tidak dihitung. Yang lainnya tidak. Ini termasuk fungsi `# define` dan pembantu. Maaf bila membingungkan. Lihat ini sebagai panduan bermanfaat tentang apa yang tidak / tidak dihitung (ditulis dalam sintaks C-style)
// tidak diperhitungkan total, dapat dihilangkan kecuali // tidak jelas, seperti setengah dari perpustakaan standar Java. #termasuk <stdio.h> impor some.builtin.Class // tidak masuk hitungan, lihat di atas #define printf p // menghitung total / * Arahan preprocessor lain, dll menghitung. * / int i = 0; // diperhitungkan someFunction (); // diperhitungkan char [] [] myMainSplitFunction (char [] [] array) {// tidak masuk hitungan // Semua yang ada di sini penting return returnArray; // Bahkan ini penting. } // tidak masuk hitungan / * Segala sesuatu di sini penting, termasuk deklarasi * / char [] [] someHelperFunction (char [] string) { // barang } // bahkan ini penting
- Output harus berupa array string atau sejenisnya (Daftar array di Java dan yang serupa dapat diterima). Contoh output yang diterima:
String[]
,char[][]
,Array
,List
, danArray
(objek). - Array harus berisi hanya berisi string-panjang primitif variabel atau objek string. Tidak boleh ada string kosong di kembalinya, dengan pengecualian di bawah ini. Catatan: string berisi string pertandingan yang berurutan, seperti contoh input dan output di bawah ini.
- Jika tidak ada kecocokan, maka badan fungsi harus kembali
null
, array / daftar kosong, atau array / daftar yang berisi string kosong. - Tidak ada perpustakaan eksternal yang diizinkan.
- Akhir baris DOS dihitung sebagai satu byte, bukan dua (sudah dibahas dalam meta, tetapi perlu ditekankan)
- Dan aturan terbesar di sini: tidak ada ekspresi reguler yang diizinkan.
Ini adalah pertanyaan kode-golf , sehingga ukuran terkecil menang. Semoga berhasil!
Dan berikut adalah beberapa contoh input dan output (dengan lolos C-style):
Input: "abc123def456" Output: ["123", "456"] Input: "aitew034snk582: 3c" Output: ["034", "582", "3"] Input: "as5493tax54 \\ [email protected]" Output: ["5493", "54", "430", "52", "9"] Input: "sasprs] tore \" re \\ forz " Output: null, [], [""], atau serupa
Harap cantumkan berapa byte yang digunakan oleh jawaban Anda, dan seperti biasa, bermain golf bahagia!
Pedoman untuk Lisp
Inilah yang dihitung dan tidak dihitung dalam dialek Lisp:
;;; Pilihan 1 (mencabut ekstrak-string (ab); Tidak masuk hitungan (barang) ;; Semua yang ada di sini penting ); Tidak masuk hitungan ;;; pilihan 2 (mencabut ekstrak-string (string & aux (mulai 0) (akhir 0)); Tidak dihitung (barang) ;; Semua yang ada di sini penting ); Tidak masuk hitungan.Semua lambda lainnya sepenuhnya dihitung menuju jumlah byte.
Jawaban:
APL, 13 karakter
(atau 28/30 byte, baca di bawah)
Saya melihat Anda telah melarang GolfScript dari pertanyaan Anda. Saya mengerti sentimen Anda, tetapi saya harap komunitas ini tidak akan melarang APL, karena ini adalah bahasa pemrograman yang benar-benar luar biasa dengan sejarah panjang, belum lagi banyak hal yang menyenangkan untuk dikodekan. Mungkin bisa saja diberi skor berbeda, jika orang-orang merasa itu bersaing secara tidak adil. Saya akan memposting pemikiran saya tentang masalah ini ke utas yang telah Anda tautkan.
Pada token yang sama, saya selalu menambahkan catatan kaki ke posting APL saya, mengklaim bahwa APL dapat dinilai sebagai 1 char = 1 byte. Klaim saya bertumpu pada kenyataan bahwa beberapa (sebagian besar komersial) implementasi APL masih mendukung enkode byte tunggal warisan mereka sendiri, dengan simbol APL dipetakan ke nilai 128 byte atas. Tetapi mungkin ini terlalu berlebihan, dalam hal ini Anda mungkin ingin mencetak entri ini sebagai 28 byte di UTF-16 atau 30 byte di UTF-8.
Penjelasan
Contohnya
Format output default untuk array string tidak memperjelas berapa banyak string yang ada dalam array, atau berapa banyak kosong. Tetapi manipulasi cepat untuk menambahkan kutipan harus membuatnya cukup jelas:
sumber
∊⍕¨⍳10
, tidak bisakah Anda menggunakan saja⎕D
? Itu harus konstan'0123456789'
. Dyalog APL paling tidak mendukungnya, dan begitu pula NARS2000.Python 47
Penerapan
Demo
Algoritma
Konversi setiap karakter non-digit ke spasi dan kemudian pisahkan string yang dihasilkan. Pendekatan yang sederhana dan jelas.
Dan solusi yang menyenangkan dengan itertools (71 karakter)
sumber
Ruby, 70
Versi online untuk pengujian
Karena mengonversi karakter non-digit ke int menghasilkan 0 di Ruby (dengan to_i), mengonversi setiap char ke int dan kembali ke char adalah cara non-regex untuk memeriksa ...
sumber
bash, 26 (isi fungsi: 22 + susunan tugas array 4)
Ini tidak akan mengalahkan jawaban yang lain
bash
, tetapi menarik karena mungkin membuat Anda mengambil dua kali lipat:Penggunaannya adalah:
Pada pandangan cepat pertama,
//+([!0-9])/
tampak sangat mirip substitusi regexp, tetapi tidak. Ini adalah ekspansi parameter bash , yang mengikuti aturan pencocokan pola , alih-alih aturan ekspresi reguler.Mengembalikan tipe array bash yang sebenarnya dari fungsi bash adalah hal yang menyebalkan, jadi saya memilih untuk mengembalikan daftar yang dibatasi oleh ruang, kemudian mengonversinya menjadi sebuah array dalam penugasan array di luar pemanggilan fungsi. Jadi untuk kepentingan keadilan, saya merasa
(` `)
bahwa fungsi panggilan harus dimasukkan dalam skor saya.sumber
Mathematica 32
Pemakaian
Yang setara menggunakan regex jauh lebih lama !:
sumber
Bash,
21 byte17/21 byte (ditingkatkan oleh DigitalTrauma )Membangun daftar yang dipisahkan ruang
tr
mengganti non digit dengan spasi
Pemakaian
Edit
seperti yang ditunjukkan oleh komentar di bawah ini, kode dapat dipreteli menjadi 17 byte:
dan karena hasilnya tidak berbicara deret Bash, penggunaannya harus
dan ekstra
(``)
harus dihitungsumber
(blah)
bukan{blah;}
:split()(tr -c 0-9 \ <<<$1)
. Dengan begitu fungsi tubuh Anda hanya 17 karakter.a=($(split "12 3a bc123")); echo ${a[@]}
. Dapat dikatakan bahwa "($ ())" dihitung dalam skor Andatr
pendekatan, saya mencoba melakukan ini dengan ekspansi parameter .tr
jelas merupakan pendekatan yang lebih baik untuk tujuan golf.tr
operator ekspansi? Itu akan keluar untuk sesuatu seperti($(tr...))
, dan di mana deklarasi fungsi tidak dihitung, kurung luar tidak akan dihitung melawan Anda. Itu hanya akan menjadi bagian pengganti perintah.(``)
konstruksinya adalah 1-char lebih baik daripada yang($())
dan akan lebih disukai.Smalltalk (Smalltalk / X), 81
nilai f: 'abc123def456' -> OrderedCollection ('123' '456')
nilai f: 'aitew034snk582: 3c' -> OrderedCollection ('034' '582' '3')
nilai f: 'as5493tax54 \ [email protected]' -> OrderedCollection ('5493' '54' '430' '52' '9')
nilai f: 'sasprs] tore \ "re \ forz' -> OrderedCollection ()
sigh - Smalltalk memiliki kecenderungan untuk menggunakan nama fungsi panjang veeeery ...
sumber
asCollectionOfSubCollectionsSeparatedByAnyForWhich
ಠ_ಠ Nama ini terlalu panjangR, 81
Fungsi menerima string dan mengembalikan daftar string.
Contoh:
-
-
-
Catatan:
$x
adalah nama elemen daftar.sumber
Perl, 53
Edit: tanpa kecocokan, sub sekarang mengembalikan daftar dengan string kosong (bukan daftar kosong) seperti yang diperlukan.
Ini juga menghindari pemisahan pada karakter spasi tunggal, karena memicu perilaku 'pemisahan pada ruang putih' , yang mungkin melanggar aturan. Saya bisa menggunakan
/ /
pembatas, yang akan terpecah pada satu ruang, tetapi secara paradoksal itu akan terlihat seperti menggunakan pola regexp. Saya bisa menggunakanunpack
dengan mengorbankan beberapa karakter tambahan dan menyingkirkansplit
kontroversi sama sekali, tapi saya pikir, apa yang saya selesaikan, membelah karakter literal (selain ruang) tidak apa-apa.Dan, tidak, operator transliterasi Perl tidak melakukan ekspresi reguler. Saya dapat membuka gulungan rentang 0-9
0123456789
jika itu masalahnya.sumber
C, 68 byte (hanya badan fungsi)
Argumen pertama adalah string input, yang kedua adalah array output, yang merupakan array string yang diakhiri NULL. Memori yang memadai harus disediakan untuk
a
sebelum memanggil fungsi (kasus terburuk:)sizeof(char*)*((strlen(s)+1)/2)
.String input dimodifikasi oleh fungsi (setiap karakter non-digit digantikan oleh
'\0'
)Contoh penggunaan
Keluaran
Versi tidak golf:
sumber
VBScript, 190 (164 tanpa deklarasi fungsi)
Meskipun tidak kompetitif sama sekali, saya terkejut bahwa VBScript keluar sesingkat ini mengingat betapa verbose itu (13 byte untuk CR saja). Itu loop melalui string, mengganti karakter non-numerik dengan spasi, kemudian mengurangi semua spasi putih menjadi spasi tunggal, dan kemudian menggunakan pembatas ruang untuk membaginya.
Uji kasus
sumber
Common Lisp (1 sesuai dengan surat; ≈173 sesuai dengan semangat)
Ini versi yang bisa dibaca. Jumlah byte cukup tinggi karena nama-nama panjang dalam hal-hal seperti
digit-char-p
danposition-if
danvector-push-extend
.Konsep "deklarasi fungsi" agak kabur. Berikut adalah versi yang hanya memiliki satu byte (karakter
x
dalam fungsi tubuh); segala sesuatu yang lain dibundel ke variabel tambahan daftar lamba fungsi (bagian dari deklarasi fungsi):Jumlah byte sebenarnya akan tergantung pada berapa banyak deklarasi bantu yang harus dipindahkan ke dalam tubuh agar ini dianggap dapat diterima. Beberapa penamaan fungsi lokal juga akan membantu (mis. Mempersingkat
position-if
karena muncul dua kali, menggunakan variabel huruf tunggal, dll.).Render program ini memiliki 220 karakter:
Jika tidak ada yang lain, ini harus dipromosikan variabel Common Lisp & aux .
Ini dapat ditulis dengan lebih ringkas
loop
, tentu saja:The
loop
bentuk, dengan ruang ekstra dihapus, memiliki 173 karakter:sumber
(result
pada kurung terakhir menjadi tubuh. Bagian yang mendefinisikan nama dan parameter adalah deklarasi.result
yang dinyatakan sebagai parameter di sini; itu hanya memiliki bentuk inisialisasi yang sangat sepele. Ini adalah hal yang sama, pada prinsipnya, sebagai argumen opsional dengan nilai default yang dihitung oleh beberapa ekspresi kompleks. (Dalam kasus yang lebih sederhana, mudah untuk membayangkan sesuatu sepertichar* substring( char *str, int begin, int end(0) )
dalam beberapa bahasa dengan sintaks mirip C untuk menentukan ituend
opsional dan bahwa jika tidak disediakan, maka nilainya0
. Saya hanya menyoroti fakta bahwa beberapa istilah ini(defun fn (string &aux (start 0) (end 0)
tidak akan menghitung, tetapi semua yang tersisa di lambda akan).JavaScript, 240 byte
Dan bagi Anda yang penasaran, inilah mungkin golf besar saya:
Di atas dalam cetakan cantik:
Di atas dalam kode deskriptif normal
sumber
PHP 134
sumber
array_filter
. Ini secara otomatis akan menghapus semua entri yangfalse
ketika mereka dilemparkan ke boolean.C, 158
Karena C tidak memiliki fungsi print array bawaan, saya harus melakukan itu sendiri, jadi saya minta maaf bahwa ada koma terakhir di setiap output. Pada dasarnya apa yang dilakukan kode itu adalah membaca string jika bukan digit yang menggantikannya dengan '\ 0' dan kemudian saya hanya mengulang-ulang kode dan mencetak semua rantai angka. (EOF = 0)
sumber
#define
s, deklarasi variabel, dll akan dihitung, tetapi deklarasi fungsi tidak akan.char[][]
legal. Jika Anda kembali seperti itu (atauchar**
), Anda akan baik-baik saja.C #, 98
Pertama, ini menggunakan
.Select()
metode ekstensi LINQ untuk mengubah semua non-digit menjadi koma.string.Replace()
akan lebih disukai, karena ia mengembalikan astring
daripadaIEnumerable<char>
, tetapistring.Replace()
hanya dapat mengambil satu karakter atau string dan tidak dapat menggunakan predikat sepertichar.IsDigit()
atau47<c&c<58
.Seperti disebutkan,
.Select()
diterapkan ke string mengembalikan sebuahIEnumerable<char>
, jadi kita perlu mengubahnya kembali menjadi string dengan mengubahnya menjadi sebuah array dan meneruskan array ke dalamstring
konstruktor.Akhirnya, kami membagi string menggunakan koma
string.Split()
.(StringSplitOptions)1
adalah cara yang lebih singkat untuk mengatakanStringSplitOptions.RemoveEmptyEntries
, yang akan secara otomatis menangani beberapa koma dan koma berturut-turut pada awal / akhir string.sumber
char.IsDigit(c)
, Anda dapat menggunakan'/'<c&&c<':'
47<c&&c<58
,. (Terus terang, saya terkejut itu bekerja dengan angka, tetapi ternyata itu berhasil).,
, dan kemudian secara manual menghapus item kosongreturn new string(s.Select(c=>47<c&c<58?c:' ').ToArray()).Split().Where(a=>a!="").ToArray();
JS / Simpul:
168162147138 CharsVersi dipercantik:
sumber
console.log(r)
dan beberapa hal lainnyaRuby, 24
Menentukan digit menggunakan ruang negatif dalam rentang ascii yang dapat dicetak.
sumber
php , 204
Kode Deskriptif:
Ini adalah kode yang cukup panjang dan saya yakin akan ada versi php yang jauh lebih pendek untuk kode golf ini. Inilah yang bisa saya temukan di php.
sumber
array()
dengan[]
,array_push($output[$count], $arr[$i]);
dengan$output[$count][]=$arr[$i];
, danord()
memeriksa denganis_numeric()
. dan Anda bahkan tidak perlu membagi string untuk beralih ke karakternya. juga, hanya kode bagian dalam dari fungsi yang diperhitungkan, sehingga Anda menghitung char adalah 204.Python
sumber
Python
10483@Abhijit jawabannya jauh pintar, ini hanya versi "diperkecil" dari apa yang ada dalam pikiran saya.
Ini tidak menghasilkan output, jadi kode berfungsi, jika dijalankan satu per satu, karena beberapa variabel didefinisikan pada deklarasi.
sumber
PHP
9889Seperti dalam jawaban bash DigitalTrauma, ini tidak menggunakan regex.
Kasus uji:
sumber
Haskell 31
Ini membagi string pada semua karakter non-numerik dan menghilangkan string kosong yang dihasilkan oleh pembatas berurutan.
sumber
VBA 210, 181 tanpa deklarasi fungsi
sumber
Rebol (66 karakter)
Tidak disatukan dan dibungkus dengan deklarasi fungsi:
Kode contoh di konsol Rebol:
sumber
JavaScript,
1049789Golf:
Sunting: Ketika loop berjalan dari ujung array,
c
adalahundefined
, yang palsu dan mengakhiri loop.2/27: Menggunakan
?:
menghemat wordiness dariif/else
.Pengembalian carriage di bodi adalah untuk keterbacaan dan bukan bagian dari solusi.
Tidak Terkumpul:
Idenya adalah untuk menambahkan setiap karakter ke entri terakhir dalam array jika itu adalah digit dan untuk memastikan entri array terakhir adalah string sebaliknya.
sumber
Javascript, 72
Tidak disatukan
Contoh input / output
JSFiddle
sumber
if(+a[i]+1)b+=a[i];else if(b)c.push(b),b=""
denganb=+a[i]+1?b+a[i]:b?(c.push(b),""):b
.(c.push(b),"")
tampak pintar, tidak pernah melihatnya.R 52
Fungsi ini membagi string dengan kelas karakter (ini bukan regex! :)) kelas adalah karakter N - numerik dan P {N} berarti negasi dari kelas ini. o = T berarti menghilangkan substring kosong.
sumber
PHP 99
Keluaran
sumber
JavaScript 88
88 karakter saat tidak menghitung fungsi n (x) {}
sumber