Kami mendefinisikan spasi putih menjadi salah satu dari tiga karakter, tab (0x09), baris baru (0x0A) atau spasi (0x20).
Untuk tantangan ini, Anda harus menulis dua program atau fungsi dalam bahasa pemrograman yang sama, yang melakukan tugas-tugas berikut:
Hitung karakter spasi putih dalam string yang diberikan. Misalnya input
123 -_- abc def
akan mengembalikan 7 (asalkan tidak ada baris baru)
Pisahkan string yang diberikan pada menjalankan spasi kosong berturut-turut. Jika string dimulai atau diakhiri dengan spasi putih, tidak ada string kosong harus dikembalikan di ujungnya. Misalnya input yang sama
123 -_- abc def
akan kembali
["123", "-_-", "abc", "def"]
.
Dalam kedua kasus, Anda dapat mengambil input melalui STDIN, argumen baris perintah atau argumen fungsi mengembalikan hasilnya atau mencetaknya STDOUT. Untuk program kedua, jika Anda memilih untuk mencetak ke STDOUT, harap cetak setiap string pada barisnya sendiri, tanpa tanda kutip di sekitarnya.
Untuk kedua program, Anda dapat mengasumsikan bahwa input hanya berisi ASCII yang dapat dicetak (0x20 hingga 0x7E) dan spasi putih.
Sekarang inilah tangkapannya:
- Jika semua spasi putih dihapus dari kedua program / fungsi, string yang dihasilkan harus identik. Artinya, dua kiriman Anda mungkin hanya berbeda dalam jumlah dan penempatan karakter spasi putih.
- Program / fungsi tidak boleh mengandung string atau regex literal (literal karakter baik-baik saja, asalkan bahasa Anda memiliki tipe karakter yang ditunjuk).
- Tidak ada program / fungsi yang dapat berisi komentar.
- Anda tidak boleh membaca kode sumber program, secara langsung atau tidak langsung.
Ini kode golf. Skor Anda adalah jumlah ukuran kedua solusi (dalam byte). Skor terendah menang.
Papan peringkat
Cuplikan Stack berikut menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa. Jadi, bahkan jika bahasa pilihan Anda tidak membiarkan Anda memenangkan seluruh tantangan, mengapa tidak mencoba merebut tempat di daftar kedua? Saya akan sangat tertarik untuk melihat bagaimana orang mengatasi tantangan ini dalam berbagai bahasa!
Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:
# Language Name, N bytes
di mana N
adalah jumlah ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Misalnya:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Anda juga dapat memasukkan jumlah individu sebelum jumlah total, misalnya
# Python 2, 35 + 41 = 76 bytes
Nomor terakhir yang tidak dihantam akan digunakan oleh snippet.
<script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>site = 'meta.codegolf',postID = 5314,isAnswer = true,QUESTION_ID = 42253;jQuery(function(){var u='https://api.stackexchange.com/2.2/';if(isAnswer)u+='answers/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJeRCD';else u+='questions/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJO6t)';jQuery.get(u,function(b){function d(s){return jQuery('<textarea>').html(s).text()};function r(l){return new RegExp('<pre class="snippet-code-'+l+'\\b[^>]*><code>([\\s\\S]*?)<\\/code><\/pre>')};b=b.items[0].body;var j=r('js').exec(b),c=r('css').exec(b),h=r('html').exec(b);if(c!==null)jQuery('head').append(jQuery('<style>').text(d(c[1])));if (h!==null)jQuery('body').append(d(h[1]));if(j!==null)jQuery('body').append(jQuery('<script>').text(d(j[1])))})})</script>
sumber
Jawaban:
Pyth, 16 + 15 = 31 byte
Coba di sini .
Melawan:
Pembagi:
Ini masing-masing mendefinisikan fungsi,,
y
yang mengambil input string untuk menyelesaikan tugas yang diinginkan.Terima kasih kepada @FryAmTheEggman untuk ide menggunakan fitur Pyth tentang pengindeksan modular ke dalam daftar untuk mencukur karakter.
Kasus uji:
Penjelasan:
sumber
Python, 54 + 56 = 110 byte
Melawan:
Pembagi:
Untuk penghitung, kami menggunakan fakta bahwa Python tidak apa-apa dengan hanya memiliki ekspresi pada sebuah garis. Ini diperlukan untuk berpisah
+1
dan0<9or x.split()
untuk menghentikanNameError
dari yang dilemparkan, seperti0<9
yangTrue
mencegahx.split()
dari yang dievaluasi karena arus pendek.Untuk splitter, karena jumlah spasi putih selalu tidak negatif,
sum(y.isspace()for y in x)+10<9
selaluFalse
dan fungsi pemisahan ikut bermain.Alternatif 1, 59 + 60 = 119 byte
Melawan:
Pembagi:
Hasil penghitungan dan pemisahan disimpan dalam daftar dua elemen. Daftar ini diindeks oleh salah satu
min([1])
, mengembalikan minimum daftar satu elemen yang berisi1
, ataum in([1])
, yang mengembalikanFalse
(setara dengan0
) karenam
tidak terkandung dalam[1]
.Alternatif 2, 67 + 69 = 136 byte
Melawan:
Pembagi:
Seperti di atas, hasil penghitungan dan pemisahan disimpan dalam daftar dua elemen.
sorted
adalah fungsi bawaan yang merupakan nilai kebenaran, jadinot sorted
mengembalikanFalse
(setara dengan0
). Karenanot s or ted
, karenas
adalah fungsi dan juga kebenaran,not s
adalahFalse
danted = 1
dikembalikan.Alternatif 3, 59 + 60 = 119 byte
Melawan:
Pembagi:
Ini adalah fungsi di mana hasil splitter disimpan dalam variabel
a
, dan hasil penghitung disimpan dalam variabela1
. Seperti sebelumnya, Python baik-baik saja dengan hanya memiliki ekspresi pada sebuah garis, dalam hal ini1
. Memisahkana1
menentukan apa yang harus kembali dari fungsi.sumber
not sorted
.+1
dan0<9or x.split()
diperlukan?m=lambda x:sum(y.isspace()for y in x)+00and x.split()
danm=lambda x:sum(y.isspace()for y in x)+0;0and x.split()
(menjadikan titik koma itu sebagai baris baru tentu saja)Java 8, 239 + 240 = 479
Hitung spasi putih (mengembalikan Integer)
Berpisah di whitespace (mengembalikan Stream <String>)
Penjelasan:
sumber
Ruang kosong, 75 + 153 = 228
Spasi, tab, dan baris baru diganti dengan STL, masing-masing, dan dilipat untuk keterbacaan. Konversi ke file Whitespace yang tepat dengan
tr -d \\n | sed 'y/STL/ \t\n/'
.Melawan
Pembagi
sumber
Marbelous, 103 + 92 = 195
Melawan:
Pembagi:
Uji program-program ini di sini. Papan Silinder, Sertakan Perpustakaan, dan ruang untuk sel kosong semua harus diperiksa.
Input dan Output adalah melalui STDIN / STDOUT.
Penjelasan
Melawan:
Jalur biru menerima input. Jika karakter adalah karakter spasi (nilai ascii kurang dari 0x21), jalur hitam diambil, yang disinkronkan dengan jalur ungu.
Jalur ungu hanya menambah marmer yang disimpan dalam
&1
sinkronisasi setiap kali jalur hitam diambil.Setelah tidak ada lagi input, jalur merah diambil, mencetak jumlah karakter spasi putih dan keluar.
Pembagi:
Program ini dimulai dengan jalur biru, yang loop sampai karakter non-spasi ditemukan.
Setelah karakter non-spasi diambil, jalur hitam diambil, yang mencetak karakter ini dan memindahkan eksekusi ke jalur hijau, yang memotong dan mencetak sampai karakter spasi-diterima. Eksekusi kemudian berlanjut ke jalur ungu, yang berisi
3W
, atau pembagi tiga arah.Cabang kiri memindahkan eksekusi ke jalur biru (dan spasi putih dibuang sampai karakter non-spasi putih ditemukan).
Cabang tengah menetapkan salinan input ke 0 dengan
?0
(menghasilkan angka acak antara0
dan0
), dan menambahkan 10 (0x0A
= baris baru), yang kemudian dikeluarkan.Jalan yang benar dibuang.
sumber
CJam, 26 + 27 = 53
59 61 73 77byteMelawan
Pembagi
Bagaimana itu bekerja
Idenya sederhana, menghitung jumlah spasi putih dan membagi string pada menjalankan spasi putih berturut-turut. Kemudian pilih salah satu dari mereka didasarkan pada kenyataan berikut yang
' !
berartinot of space character
yang falsy, sedangkan'!
adalah!
karakter, yang truthy.Kode yang diperluas:
Input dari STDIN dan output ke STDOUT
Cobalah online di sini
sumber
Mathematica, 44 + 43 = 87
97byteSaya pikir saya akan menambahkan bahasa lain ke dalam campuran.
Melawan:
Pembagi:
Ini memanfaatkan fitur Mathematica bahwa pemisahan ruang sama dengan perkalian. Dan mengalikan sesuatu dengan 0 selalu 0, dan menambahkan 0 ke sesuatu selalu idempoten.
Untuk penghitung, pertama-tama kita menghitung spasi, dan kita tambahkan
0*1*StringSpli*t@#
.StringSpli
dant
tidak didefinisikan, tetapi Mathematica menggunakan perhitungan simbolik, jadi itu hanya memperlakukan mereka sebagai variabel dan fungsi yang tidak diketahui. Itu1*
idempoten (sama seperti0+
),0*
mengubahnya menjadi nol. Hal ini diperlukan untuk memisahkanStringSplit
menjadi dua variabel, karena0
kali daftar diperlakukan sebagai perkalian vektor-skalar yang menghasilkan vektor (daftar) nol.Untuk splitter, saya menggunakan fakta yang
Count
juga ada tetapi tidak melihat string. Mencoba menghitung semua sub ekspresi yang cocok dengan pola, tetapiWhitespace
merupakan pola yang hanya berlaku untuk konten string. JadiCount
akan selalu kembali0
, yang membuatString
menghilang. Perkalian array dengan split01 = 1
lagi idempoten.sumber
Ruby,
10791 bytePembagi (46 byte)
Penghitung (45 byte)
p
adalah metode standar yang, tanpa argumen, hanya mengembalikannil
. Kami menggunakan ini dalam beberapa cara. Di splitter, inisialp
tidak melakukan apa-apa.gets(p)
membaca dalam segala hal dari input standar, karena pembatas adalah nol. Kami memanggil metode pemisahan bawaan pada itu, dan menetapkan hasilnyap
, jadi sekarang ketika tidak diberikan argumen itu akan diuraikan sebagai variabel.puts p||...
korsleting dan mencetak setiap elemenp
variabel ke barisnya sendiri.Di penghitung, kami menghapus baris baru pertama sehingga array yang dibagi ditugaskan
pp
sebagai gantinya. Karena kita belum ditugaskanp
, itu masih metode nil-kembali sehingga bagian kedua||
dievaluasi dan diteruskan keputs
.$_
adalah variabel ajaib yang berisi hasilgets
, jadi jumlah total spasi putih adalah ukuran minus karakter karakter non-spasi, yangpp
berisi. Saya merasa harus ada cara yang lebih pendek untuk melakukan penghitungan, tetapi saya tidak dapat menemukannya, dan bagaimanapun juga menggunakan split array di konter itu menyenangkan.sumber
Python, 169
Ini hampir terlalu mudah untuk dilakukan dengan Python!
Melawan:
Pembagi:
Mereka berbeda hanya dalam satu ruang, dan saya tidak melakukan tipu daya seperti memisahkan angka atau nama variabel menjadi dua :)
sumber
C, 138 + 136 = 274
Dalam setiap kasus, kode adalah program yang menerima tepat satu argumen baris perintah dan mencetak hasilnya ke stdout.
\t
harus diganti dengan karakter tab. Jika Anda ingin memberikan argumen yang berisi tab dan baris baru, tugas Anda adalah untuk mengetahui caranya;).Perhitungan
Pemisahan
sumber
JavaScript, 95 + 96 = 191 byte
Melawan:
Pembagi:
Tidak Disatukan:
The
RegExp(String.fromCharCode(92,115)
garis menciptakan regex spasi-pencocokan/\s/
tanpa regex atau string yang literal.Di setiap program, kami menggunakan variabel
v
atauvv
. Kami menyimpan array split ke variabel itu (v
atauvv
), dan kemudian cabang perilaku kami pada nilaiv
(sementara itu,vv
diabaikan). Di konter,v
memiliki nilai kebenaran; di splitter ia memiliki nilai falsy (karenavv
mendapat nilai sebagai gantinya).Alternatif: JavaScript, 250 byte
Saya punya solusi lain yang tidak memenangkan hadiah untuk singkatnya, tapi saya pikir itu adalah tantangan yang menarik untuk menyalahgunakan perilaku penyisipan titik koma otomatis JavaScript.
Melawan:
Pembagi:
Penghitung yang tidak digabungkan:
Pembagi persis sama, kecuali untuk baris:
sekarang
Penyisipan titik koma otomatis JavaScript biasanya tidak mengakhiri pernyataan multi-baris lebih awal jika mereka dapat dipahami tanpa jeda baris, tetapi tidak mentolerir jeda baris setelah
return
,continue
ataubreak
. Oleh karena itu, garis dibaca hanya sebagaibreak
, yang keluar hanya dari loop dalam, bukan keluar dari loop luar. Perilaku "second-pass"o = a.filter(j=>j)
kemudian dieksekusi (dibandingkan dilewati di counter), karena loop luar diberi pass kedua.sumber
!!x
berbeda denganBool
konversi otomatis ?filter
auto-bools callbacknya kembali dengan aturan yang sama!!
. Terima kasih!Python,
228198182166146145 bytePenghitung ( 72 byte ):
Pembagi ( 73 byte ):
ior1
adalah variabel falsey, tetapii or 1
benar. Itulah trik utamanya.sumber
i
string kosong untuk splitter? Bisa diperbaiki dengan mengubahiorb
keior1
, yang juga memungkinkan Anda menyimpan karakter antara1
danelse
.Jalan Menengah 98, 61 + 59 = 120
Melawan:
Pembagi:
sumber
Bash, 75 + 79 = 154 byte
Ini bergantung pada bash untuk dapat melanjutkan eksekusi bahkan jika beberapa baris atau bagian dari baris skrip rusak (dalam beberapa keadaan). Spasi digunakan untuk menonaktifkan pelarian untuk beberapa kurung dekat, dan untuk memecahkan pipa dengan meletakkannya di baris baru.
Pembagi:
Melawan:
Input melalui argumen commandline, output melalui stdout.
Karena ini bergantung pada perilaku kesalahan bash, pengguna diharapkan mengabaikan stderr.
Contoh run (menampilkan input dengan baris baru dan beberapa spasi yang berdekatan):
sumber
Ruby,
114 + 116107 + 109 = 216 byteIni tidak dapat bersaing dengan solusi ruby oleh histokrat, tetapi saya pikir akan tetap layak untuk tetap bertahan.
Saya gunakan
$z
untuknil
dannil.to_s
untukString.new
Karakter spasi putih tambahan yang saya tambahkan di akhir input adalah untuk memaksa kata terakhir yang akan ditambahkan ke array (
r
) - kata hanya ditambahkan ke akhir array ketika karakter spasi putih mengikuti karakter non-spasi putih. Alternatifnya adalah menambahkan yang lainr<<w if w
setelaheach_byte
blok.Perhitungan
Pemisahan
sumber
Haskell ,
53 + 55 = 10836 + 38 = 74 byteMelawan
Pembagi
Solusi ini memanfaatkan fakta bahwa dalam fungsi Haskell adalah turunan dari kelas tipe Monad dan dengan demikian dapat digunakan sebagai tindakan monadik dalam notasi.
Dalam kasus pertama fungsi yang dihasilkan dari do-block adalah argumen pertama dari
pure
(yang pada dasarnya adalahconst
untuk tipe fungsi), membuat counter hasil akhir dan splitter yang dibuang.Dalam kasus kedua
pure
hanya diterapkan pada argumen tunggal, menjadikannya fungsi yang mengembalikan fungsi lain (penghitung). Namun, hasilnya tidak pernah digunakan dan karenanya dibuang. Hasil akhir adalah baris kedua dari do-block, splitter.sumber
[' ','\t','\n']
dapat disingkat menjadi" \t\n"
.(<'!')
untuk menguji spasi.Java 8, 187 + 188 = 375
Pertama-tama, saya ingin mengatakan bahwa jawaban ini sangat didasarkan pada @ Ypnypn. Saya pada dasarnya mengganti beberapa bagian dengan yang lebih pendek (termasuk bagian yang bergantung pada spasi, yang IMO adalah yang paling penting dalam tantangan ini), tetapi kode fungsional sebagian besar sama.
Hitung spasi putih , 187 (pengembalian
int
):Berpisah di spasi putih , 188 (pengembalian
Stream<String>
):sumber
J, 48 + 49 = 97 char
Dua fungsi mengambil dan mengembalikan satu argumen. Menggunakan cara terburuk yang bisa saya pikirkan untuk mengalahkan aturan spasi yang sama, tetapi mungkin ada karakter yang harus diselamatkan dengan menemukan rute yang lebih pintar di sekitar itu.
Kami mendefinisikan kata kerja
a
untuk memiliki dua tindakan yang berbeda, tergantung pada apakah itu digunakan dengan satu argumen atau dengan dua. Dengan satu argumen, itu adalah(e.u:)&9 10 32
, yang memeriksa apakah setiap karakter spasi atau tidak. Dengan dua argumen, itua:-.~(<;._1~1,}.)
, yang mengambil vektor boolean di sebelah kanan dan memotong argumen kiri di posisi tersebut, membuang setiap pemotongan kosong dengana:-.~
.Kemudian, kami mendefinisikan
aa
jumlah nilai True dalam hasila
, yang hanya masuk akal dengan satu argumen. Akhirnya, kami menggunakanaa
ataua a
bergantung pada apakah kami ingin menghitung atau membagi spasi putih dari string.aa
bekerja seperti yang diharapkan.Alasannya
a a
adalah karena ketika J melihat(f g)y
, ia menganggap(f g)
kait dan mengevaluasinya sepertiy f (g y)
. Dalam hal ini,f
adalah dyadica
di atas yang melakukan pemotongan, dang
inia[aa
, yang menghitung jumlah dariaa
, melempar keluar, dan menghitung (monadik)a
lagi.Di REPL:
sumber
Bash, 54 + 50 = 104 byte
Melawan
Pembagi
sumber
Perl, 37 + 38 = 75
Penghitung :
Pembagi :
sumber
Perl 6, 31 + 32 = 63 byte
Melawan
Cobalah online!
?^1
diuraikan seperti?^ 1
yang menerapkan operator negasi Boolean ke 1, menghasilkanFalse
.Pembagi
Cobalah online!
? ^1
mengkonversi kisaran 0..0 ke Bool, menghasilkanTrue
.sumber
Python 2, 98
Membelah (49)
Mengembalikan token dalam daftar.
Menghitung (49)
Mengembalikan daftar panjang yang berisi jumlah karakter spasi. Kemungkinan besar akan menyebabkan kesalahan runtime, tetapi fungsi tersebut
f
dapat digunakan setelah mengeksekusi kode.sumber
C (gcc) , 88 + 89 = 177 byte
Pembagi
Pembagi
Melawan
Melawan
Kehabisan
Mengambil input sebagai argumen fungsi. Fungsi penghitungan mengembalikan jumlah spasi. Fungsi pemisahan menggunakan STDOUT untuk outputnya (tetapi juga mengembalikan jumlah spasi minus satu juga).
sumber
Zsh , 35 + 35 = 70 byte
Saya tidak yakin apakah
[^$IFS]
memenuhi syarat, karena digunakan dalam pencocokan pola. Berikut adalah solusi 45 + 45 dalam hal ini dilarang.Membagi:
Menghitung:
The
:
builtin adalah equivilent untuktrue
, kita menggunakannya sebagai sesuatu antara komentar dan / dev / null (karena komentar yang dianulir) oleh pipa ekspansi yang tidak diinginkan untuk itu.Zsh memiliki builtin untuk pemisahan di whitespace, itu
${=var}
. Ini membuatnya sulit untuk melakukan segala jenis kombinasi logis selain hanya mengeksekusi keduanya dan membuang yang tidak kita inginkan.Cobalah online!
sumber