Ruang kosong yang signifikan


55

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:

  1. Hitung karakter spasi putih dalam string yang diberikan. Misalnya input

      123 -_-   abc
    def
    

    akan mengembalikan 7 (asalkan tidak ada baris baru)

  2. 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 Nadalah 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>


26
Papan peringkat itu keren!
Digital Trauma

5
Kedengarannya seperti jawaban Whitespace mana pun akan mematuhi aturan 1.;)
nyuszika7h

1
@ nyuszika7h Memang akan, tapi itu tidak akan terlalu pendek.
Martin Ender

7
Ruang putih yang signifikan, jadi bukan ruang putih dengan manfaat atau apa pun ...
corsiKa

Jawaban:


15

Pyth, 16 + 15 = 31 byte

Coba di sini .

Melawan:

L@,cb)sm!cd)b1 0

Pembagi:

L@,cb)sm!cd)b10

Ini masing-masing mendefinisikan fungsi,, yyang 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:

L@,cb)sm!cd)b1 0y++"abc def"b"gh ij k"
L@,cb)sm!cd)b10y++"abc def"b"gh ij k"

Penjelasan:

L                  define a function, y, which takes one input, b.
 @                 Index into
  ,                2-tuple of
   cb)             b.split()                          (solution to splitter)
   s               sum over                           (solution to counter)
    m              map, with input d, to
     !cd)          logical negation of d.split()      (empty list is falsy)
     b             over b.
                   Index is either:
   10
   1
                   Indexing is modulo the length of the list in Pyth.
 0                 In one case, a 0 with a leading space is outside the function.
                   Leading space suppresses print, so the 0 is invisible.

52

Python, 54 + 56 = 110 byte

Melawan:

m=lambda x:sum(y.isspace()for y in x)
+1
0<9or x.split()

Pembagi:

m=lambda x:sum(y.isspace()for y in x)+10<9or x.split()

Untuk penghitung, kami menggunakan fakta bahwa Python tidak apa-apa dengan hanya memiliki ekspresi pada sebuah garis. Ini diperlukan untuk berpisah +1dan 0<9or x.split()untuk menghentikan NameErrordari yang dilemparkan, seperti 0<9yang Truemencegah x.split()dari yang dievaluasi karena arus pendek.

Untuk splitter, karena jumlah spasi putih selalu tidak negatif, sum(y.isspace()for y in x)+10<9selalu Falsedan fungsi pemisahan ikut bermain.


Alternatif 1, 59 + 60 = 119 byte

Melawan:

m=lambda x:[x.split(),sum(y.isspace()for y in x)][min([1])]

Pembagi:

m=lambda x:[x.split(),sum(y.isspace()for y in x)][m in([1])]

Hasil penghitungan dan pemisahan disimpan dalam daftar dua elemen. Daftar ini diindeks oleh salah satu min([1]), mengembalikan minimum daftar satu elemen yang berisi 1, atau m in([1]), yang mengembalikan False(setara dengan 0) karena mtidak terkandung dalam [1].


Alternatif 2, 67 + 69 = 136 byte

Melawan:

ted=1;s=lambda x:[x.split(),sum(y.isspace()for y in x)][not s or ted]

Pembagi:

ted=1;s=lambda x:[x.split(),sum(y.isspace()for y in x)][not sorted]

Seperti di atas, hasil penghitungan dan pemisahan disimpan dalam daftar dua elemen. sortedadalah fungsi bawaan yang merupakan nilai kebenaran, jadi not sortedmengembalikan False(setara dengan 0). Karena not s or ted, karena sadalah fungsi dan juga kebenaran, not sadalah Falsedan ted = 1dikembalikan.


Alternatif 3, 59 + 60 = 119 byte

Melawan:

def f(s):a=s.split();a1=len(s)-len((s*0).join(a));return a1

Pembagi:

def f(s):a=s.split();a1=len(s)-len((s*0).join(a));return a
1

Ini adalah fungsi di mana hasil splitter disimpan dalam variabel a, dan hasil penghitung disimpan dalam variabel a1. Seperti sebelumnya, Python baik-baik saja dengan hanya memiliki ekspresi pada sebuah garis, dalam hal ini 1. Memisahkan a1menentukan apa yang harus kembali dari fungsi.


22
Saya akan memberi +1 lagi untuk not sorted.
Martin Ender

Apakah baris baru antara +1dan 0<9or x.split()diperlukan?
isaacg

1
@isaacg Jika Anda peduli tentang pengecualian, maka ya
Sp3000

Anda dapat mencukur 3 byte dengan m=lambda x:sum(y.isspace()for y in x)+00and x.split()dan m=lambda x:sum(y.isspace()for y in x)+0;0and x.split()(menjadikan titik koma itu sebagai baris baru tentu saja)
cjfaure

@cjfaure Saya tidak berpikir yang pertama berfungsi sebagai pembagi jika tidak ada spasi
Sp3000

16

Java 8, 239 + 240 = 479

Hitung spasi putih (mengembalikan Integer)

Object f(String s){String r=new String(new char[]{92,'s'}),e=new String();int intx=0;intx=1;return intx>0?s.chars().filter(c->c==9|c==10|c==32).count():java.util.Arrays.stream(s.split(r)).map(t->t.replaceAll(r,e)).filter(t->t.length()>0);}

Berpisah di whitespace (mengembalikan Stream <String>)

Object f(String s){String r=new String(new char[]{92,'s'}),e=new String();int intx=0;int x=1;return intx>0?s.chars().filter(c->c==9|c==10|c==32).count():java.util.Arrays.stream(s.split(r)).map(t->t.replaceAll(r,e)).filter(t->t.length()>0);}

Penjelasan:

Object f(String s){
    String r=new String(new char[]{92,'s'}),e=new String();  // init regex'es

    int intx=0;     // critical variable

    intx=1;         // change intx to 1
              OR
    int x=1;        // new, unused variable

    return intx>0 ? // test variable to decide what to do
      s.chars().filter(c->c==9|c==10|c==32).count() :
      java.util.Arrays.stream(s.split(r)).map(t->t.replaceAll(r,e)).filter(t->t.length()>0);
}

Bagi saya, ini terlihat cemerlang. +1
Rodolfo Dias

Cukup bagus, mengingat Java harus menjadi bahasa terburuk untuk golf kode.
tbodt

13

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

SSSLLSSLSSSTSSSSSLSLSSLSTLTSTTTSLSLTSSLTSSTLTTLSSSTLTSSSLSLLLSSSLS
LLSLLTLST

Pembagi

SSSTLSSSLTTSLSSTLSSSLSLSTLTSTTTSLSSLSLTSLSSSTSSSSTLTSSTLTTTTLSSSTL
SLSTTSLSLSLLSSTTLSSSTSTSLSSSTLTTTLTSTSLTLSSSSSTLSSSLTTSLSSTSLLSLTL
LSSSLTLSSLSLTLLSSLLLL

2
Saya bertanya-tanya berapa lama ...;)
Martin Ender

4
Dengan spasi putih, ini menjadi dua tantangan golf kode terpisah.
tbodt

13

Marbelous, 103 + 92 = 195

Melawan:

@0      @200@1@3
]]&1]]3W
  \\!!?001
        &0  >W@1
>W    @2/\  /\@3+A
00&0      &1
          Dp
@0//

Pembagi:

@0  @200@1    @3
]]&1]]  3W    \\
  !!    ?001&0
>W@1>W@2
/\  /\@3+A00&0
          &1Dp@0
//

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:

Sumber Penghitung

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 &1sinkronisasi setiap kali jalur hitam diambil.

Setelah tidak ada lagi input, jalur merah diambil, mencetak jumlah karakter spasi putih dan keluar.

Pembagi:

Sumber Splitter

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 antara 0dan 0), dan menambahkan 10 ( 0x0A= baris baru), yang kemudian dikeluarkan.

Jalan yang benar dibuang.


Sepertinya pembagi tidak berhenti jika ada spasi spasi.
Martin Ender

12

CJam, 26 + 27 = 53 59 61 73 77 byte

Melawan

'!q_,\SN9c++SerS%:Qs,-QN*?

Pembagi

' !q_,\SN9c++SerS%:Qs,-QN*?

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 ' !berarti not of space characteryang falsy, sedangkan '!adalah !karakter, yang truthy.

Kode yang diperluas:

'! / ' !                              "Get truthy or falsy value";
        q_                            "Read the input, make a copy";
          ,\                          "Take the length of the copy and swap";
            SN9c++                    "Get a string comprised of all Whitespaces";
                  Ser                 "Replace any occurrence of any character of"
                                      "the above string with space";
                     S%               "Split on one or more runs of space";
                       :Qs,           "Store this in Q, flatten to a string and take length";
                           -          "Subtract from total length to get count";
                            QN*       "Put the splitted array on stack and join newline";
                               ?      "Base on the truthy or falsy value, pick one to print";

Input dari STDIN dan output ke STDOUT

Cobalah online di sini


10

Mathematica, 44 + 43 = 87 97 byte

Saya pikir saya akan menambahkan bahasa lain ke dalam campuran.

Melawan:

StringCount[#,Whitespace]+0 1StringSpli t@#&

Pembagi:

String Count[#,Whitespace]+01StringSplit@#&

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@#. StringSplidan ttidak didefinisikan, tetapi Mathematica menggunakan perhitungan simbolik, jadi itu hanya memperlakukan mereka sebagai variabel dan fungsi yang tidak diketahui. Itu 1*idempoten (sama seperti 0+), 0*mengubahnya menjadi nol. Hal ini diperlukan untuk memisahkan StringSplitmenjadi dua variabel, karena 0kali daftar diperlakukan sebagai perkalian vektor-skalar yang menghasilkan vektor (daftar) nol.

Untuk splitter, saya menggunakan fakta yang Countjuga ada tetapi tidak melihat string. Mencoba menghitung semua sub ekspresi yang cocok dengan pola, tetapi Whitespacemerupakan pola yang hanya berlaku untuk konten string. Jadi Countakan selalu kembali 0, yang membuat Stringmenghilang. Perkalian array dengan split 01 = 1lagi idempoten.


10

Ruby, 107 91 byte

Pembagi (46 byte)

p
p=gets(p).split
puts p||$_.size-pp.join.size

Penghitung (45 byte)

pp=gets(p).split
puts p||$_.size-pp.join.size

padalah metode standar yang, tanpa argumen, hanya mengembalikan nil. Kami menggunakan ini dalam beberapa cara. Di splitter, inisial ptidak 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 hasilnya p, jadi sekarang ketika tidak diberikan argumen itu akan diuraikan sebagai variabel. puts p||...korsleting dan mencetak setiap elemen pvariabel ke barisnya sendiri.

Di penghitung, kami menghapus baris baru pertama sehingga array yang dibagi ditugaskan ppsebagai gantinya. Karena kita belum ditugaskan p, itu masih metode nil-kembali sehingga bagian kedua ||dievaluasi dan diteruskan ke puts. $_adalah variabel ajaib yang berisi hasil gets, jadi jumlah total spasi putih adalah ukuran minus karakter karakter non-spasi, yang ppberisi. 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.


7

Python, 169

Ini hampir terlalu mudah untuk dilakukan dengan Python!

Melawan:

def x(s):
 def y(s):
  return sum(map(str.isspace,s))
  return s.split()
 return y(s)

Pembagi:

def x(s):
 def y(s):
  return sum(map(str.isspace,s))
 return s.split()
 return y(s)

Mereka berbeda hanya dalam satu ruang, dan saya tidak melakukan tipu daya seperti memisahkan angka atau nama variabel menjadi dua :)


6

C, 138 + 136 = 274

Dalam setiap kasus, kode adalah program yang menerima tepat satu argumen baris perintah dan mencetak hasilnya ke stdout. \tharus diganti dengan karakter tab. Jika Anda ingin memberikan argumen yang berisi tab dan baris baru, tugas Anda adalah untuk mengetahui caranya;).

Perhitungan

#define strtok strpbrk
h=' \t\n';main(c,v,n)char**v;{for(n=- -c-1;v[n]=strtok(1[v],&h);n[v]++)v[!n]=0,puts(*v),c++;n*='d%';printf(&n,c-2);}

Pemisahan

#define strtokstrpbrk
h=' \t\n';main(c,v,n)char**v;{for(n=--c-1;v[n]=strtok(1[v],&h);n[v]++)v[!n]=0,puts(*v),c++;n*='d%';printf(&n,c-2);}

6

JavaScript, 95 + 96 = 191 byte

Melawan:

c=(a,v)=>{v
v=a=a.split(RegExp(String.fromCharCode(92,115)));return v?a.length-1:a.filter(j=>j)}

Pembagi:

s=(a,v)=>{vv=a=a.split(RegExp(String.fromCharCode(92,115)));return v?a.length-1:a.filter(j=>!!j)}

Tidak Disatukan:

s=(a,v)=>{

    v  // this `v` is ignored, or combined with the next line to make `vv`

    // split array and store it in `a` and `v` (or alternatively `vv`)
    v = a = a.split(RegExp(String.fromCharCode(92,115)));

    return v?
            a.length-1        // return number of whitespace chars
            :
            a.filter(j=>j)    // return array without empty strings
    }

The RegExp(String.fromCharCode(92,115)garis menciptakan regex spasi-pencocokan /\s/tanpa regex atau string yang literal.

Di setiap program, kami menggunakan variabel vatau vv. Kami menyimpan array split ke variabel itu ( vatau vv), dan kemudian cabang perilaku kami pada nilai v(sementara itu, vvdiabaikan). Di konter, vmemiliki nilai kebenaran; di splitter ia memiliki nilai falsy (karena vvmendapat 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:

c=a=>{a=a.split(RegExp(String.fromCharCode(92,115)));x:for(i=2;i--;)for(o=i?a.length-1:a.filter(j=>j);1;){break x}return o}

Pembagi:

s=a=>{a=a.split(RegExp(String.fromCharCode(92,115)));x:for(i=2;i--;)for(o=i?a.length-1:a.filter(j=>j);1;){break
x}return o}

Penghitung yang tidak digabungkan:

s=a=>{
    a = a.split(
            RegExp(String.fromCharCode(92,115))   // split input on whitespace regex /\s/
        );  
    x:                             // x is a label for the outer loop
    for(i=2;i--;)                  // run this outer loop twice
        for(o=i?                   // if this is the first outer loop pass, 
               a.length-1          //    set `o` to number of whitespaces
               :                   // else, on second outer loop pass,
               a.filter(j=>j);     //    set `o` to split input (w/o empty strings)
            1;                     // 1 is truthy; run inner loop forever
            ) {
                break x;           // break out of outer loop
            }
    return o;                      // return `o`
}

Pembagi persis sama, kecuali untuk baris:

break x;

sekarang

break
x;

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, continueatau break. Oleh karena itu, garis dibaca hanya sebagai break, 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.


Apakah !!xberbeda dengan Boolkonversi otomatis ?
14m2

@ l4m2 Tidak! Saya telah menghapusnya, karena filterauto-bools callbacknya kembali dengan aturan yang sama !!. Terima kasih!
apsillers

5

Python, 228 198 182 166 146 145 byte

Penghitung ( 72 byte ):

ior1=0
w=lambda i:i.split()if ior1 else sum(ord(c)in(9,10,32)for c in i)

Pembagi ( 73 byte ):

ior1=0
w=lambda i:i.split()if i or 1else sum(ord(c)in(9,10,32)for c in i)

ior1adalah variabel falsey, tetapi i or 1benar. Itulah trik utamanya.


Bukankah ini putus jika istring kosong untuk splitter? Bisa diperbaiki dengan mengubah iorbke ior1, yang juga memungkinkan Anda menyimpan karakter antara 1dan else.
isaacg

@isaacg Saya benar-benar lupa bahwa Anda bisa memiliki angka dalam nama variabel! Terima kasih <3
undergroundmonorail

5

Jalan Menengah 98, 61 + 59 = 120

Melawan:

~:'!-0`#v_ >$1+#@ #. #
 @#,#$ #<_v#`0-!':~ # .#
  ,#$ #+55<v

Pembagi:

~:'!-0`#v_ >$1+#@ #.#
 @#, #$#<_v#`0-!':~ #.#
  , #$#+55<v

4

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:

echo $((`echo $1|wc -w`+${#1}-$(\)\)\)
for a in $1;do echo $a;done|wc -c)))

Melawan:

echo $((`echo $1|wc -w`+${#1}-$(\ )\ )\ )
for a in $1;do echo $a;done
|wc -c)))

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

# bash counter.sh "abc def
gh   ij k" 2>/dev/null
6
# bash splitter.sh "abc def
gh   ij k" 2>/dev/null
abc
def
gh
ij
k

4

Ruby, 114 + 116 107 + 109 = 216 byte

Ini tidak dapat bersaing dengan solusi ruby ​​oleh histokrat, tetapi saya pikir akan tetap layak untuk tetap bertahan.

Saya gunakan $zuntuk nildan nil.to_suntukString.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 lain r<<w if wsetelah each_byteblok.

Perhitungan

->s{r=[]
n=-1
w=$z
(s+9.chr).each_byte{|b|if b<33
r<<w if w
w=$z
n+=1
else
w=w.to_s+b.chr
end}
$zorr ?r:n}

Pemisahan

->s{r=[]
n=-1
w=$z
(s+9.chr).each_byte{|b|if b<33
r<<w if w
w=$z
n+=1
else
w=w.to_s+b.chr
end}
$z or r ?r:n}

Ah, saya tidak yakin tentang hukum yang satu itu. Saya telah mengubahnya untuk menggunakan if-else bukan operator ternary - tidak ada lagi string literal.
alexanderbird

3

Haskell , 53 + 55 = 108 36 + 38 = 74 byte

Melawan

f=do
 pure(length.filter(<'!'))words

Pembagi

f=do
 pure(length.filter(<'!'))
 words

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 adalah constuntuk tipe fungsi), membuat counter hasil akhir dan splitter yang dibuang.

Dalam kasus kedua purehanya 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.


Pendekatan yang bagus! [' ','\t','\n']dapat disingkat menjadi " \t\n".
Laikoni

@Laikoni Deskripsi hanya memungkinkan literal karakter, tanpa string atau regex literal
siracusa

2
Karena tantangannya tidak mengharuskan Anda menangani sebagian besar karakter kontrol, Anda dapat mempersingkat ini dengan menggunakan (<'!')untuk menguji spasi.
Ørjan Johansen

2

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

Object f(String s){String r=new String(new char[]{92,115});int a=0;return a--+a>0?s.chars().filter(c->c>8&c<11|c==32).count():java.util.Arrays.stream(s.split(r)).filter(t->t.length()>0);}

Berpisah di spasi putih , 188 (pengembalian Stream<String>):

Object f(String s){String r=new String(new char[]{92,115});int a=0;return a- -+a>0?s.chars().filter(c->c>8&c<11|c==32).count():java.util.Arrays.stream(s.split(r)).filter(t->t.length()>0);}

2

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.

(aa[aa=.+/@a=.a:-.~(e.u:)&9 10 32 :(<;._1~1,}.))      NB. count
(a a[aa=.+/@a=.a:-.~(e.u:)&9 10 32 :(<;._1~1,}.))     NB. split

Kami mendefinisikan kata kerja auntuk 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, itu a:-.~(<;._1~1,}.), yang mengambil vektor boolean di sebelah kanan dan memotong argumen kiri di posisi tersebut, membuang setiap pemotongan kosong dengan a:-.~.

Kemudian, kami mendefinisikan aajumlah nilai True dalam hasil a, yang hanya masuk akal dengan satu argumen. Akhirnya, kami menggunakan aaatau a abergantung pada apakah kami ingin menghitung atau membagi spasi putih dari string. aabekerja seperti yang diharapkan.

Alasannya a aadalah karena ketika J melihat (f g)y, ia menganggap (f g)kait dan mengevaluasinya seperti y f (g y). Dalam hal ini, fadalah dyadic adi atas yang melakukan pemotongan, dan gini a[aa, yang menghitung jumlah dari aa, melempar keluar, dan menghitung (monadik) alagi.

Di REPL:

   (aa[aa=.+/@a=.a:-.~e.&(u:9 10 32) :(<;._1~1,}.))   '  123',TAB,'-_-   abc',LF,'def'
7
   (a a[aa=.+/@a=.a:-.~e.&(u:9 10 32) :(<;._1~1,}.))  '  123',TAB,'-_-   abc',LF,'def'
+---+---+---+---+
|123|-_-|abc|def|
+---+---+---+---+

2

Bash, 54 + 50 = 104 byte

Melawan

a=$IFS
IFS=
cat()(tr -cd $a|wc -c)
printf %s \\n$1|cat

Pembagi

a=$IFSIFS=ca
t()(tr-cd$a|wc-c)
printf %s\\n $1|cat

1

Perl, 37 + 38 = 75

Penghitung :

sub f{($_)=@_;(y/   - //,[split])[0.1]}

Pembagi :

sub f{($_)=@_;(y/   - //,[split])[0 .1]}

1

Perl 6, 31 + 32 = 63 byte

Melawan

{?^1??.words!!+grep 33>*,.ords}

Cobalah online!

?^1diuraikan seperti ?^ 1yang menerapkan operator negasi Boolean ke 1, menghasilkan False.

Pembagi

{? ^1??.words!!+grep 33>*,.ords}

Cobalah online!

? ^1mengkonversi kisaran 0..0 ke Bool, menghasilkan True.


0

Python 2, 98

Membelah (49)

Mengembalikan token dalam daftar.

f=lambda s:[sum(map(str.isspace,s))]and s.split()

Menghitung (49)

Mengembalikan daftar panjang yang berisi jumlah karakter spasi. Kemungkinan besar akan menyebabkan kesalahan runtime, tetapi fungsi tersebut fdapat digunakan setelah mengeksekusi kode.

f=lambda s:[sum(map(str.isspace,s))]
ands.split()

0

C (gcc) , 88 + 89 = 177 byte

Pembagi

i,n,x,c;f(char*s){x=n=i=0;for(x+++n;c=*s++;c*x&&putchar(c))i=c<33?n++,c=i*10,0:1;x=n-1;}

Pembagi

Melawan

i,n,x,c;f(char*s){x=n=i=0;for(x+ ++n;c=*s++;c*x&&putchar(c))i=c<33?n++,c=i*10,0:1;x=n-1;}

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

i,                      Flag signalling whether we are inside a word.
n,                      Number of whitespace encountered.
x,                      Flag signalling whether or not we should output the words.
c;                      Current character.
f(char*s){              Take input string as an argument.
x=n=i=0;for(            Initialise everything and start loop.
x+++n;                  SPLITTER ONLY: Interpreted as x++ +n, meaning x is set to 1 and n stays 0.
x+ ++n;                 COUNTER ONLY: Inverse of the above. Sets n to 1, and x stays 0.
c=*s++;                 Sets c to current char and increment string pointer, end loop if end of string.
c*x&&putchar(c))        Only output c if x is 1 and c is non-zero, which only happens if we left a word.
i=c<33?                 Since input contains only printable ASCII or whitespace, anything below 33 is whitespace.
       n++,             ...if that is the case, increment the whitespace counter (n)
           c=i*10,      ...and set c to newline (10), but only if we just left a word (if i is 1)
                  0:    ...and set i to 0.
                    1;  If not a whitespace, set i to 1, signalling we are inside a word.
x=n-1;}                 Implicitly returns n-1, which is the number of whitespaces if we are in the counter function.

0

Zsh , 35 + 35 = 70 byte

  • Program / fungsi tidak boleh mengandung string atau regex literal

Saya tidak yakin apakah [^$IFS]memenuhi syarat, karena digunakan dalam pencocokan pola. Berikut adalah solusi 45 + 45 dalam hal ini dilarang.


Membagi:

:<<<${#1//[^$IFS]} 
:
<<<${(F)${=1}}

Menghitung:

:
<<<${#1//[^$IFS]}
:<<<${(F)${=1}}

The :builtin adalah equivilent untuk true, 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!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.