重要な空白


55

空白は、タブ(0x09)、改行(0x0A)、またはスペース(0x20)の3文字のいずれかに定義します

この課題では、同じプログラミング言語で2つのプログラムまたは関数を作成し、次のタスクを実行します。

  1. 指定された文字列の空白文字を数えます。たとえば、入力

      123 -_-   abc
    def
    

    7を返します(末尾の改行がない場合)。

  2. 空白の連続した実行で特定の文字列を分割します。文字列の先頭または末尾が空白の場合、末尾に空の文字列は返されません。たとえば、同じ入力

      123 -_-   abc
    def
    

    戻り["123", "-_-", "abc", "def"]ます。

どちらの場合でも、STDIN、コマンドライン引数、または関数引数を介して入力を取得し、結果を返すか、STDOUTを出力できます。2番目のプログラムでは、STDOUTに出力することを選択した場合、引用符を囲むことなく、各文字列をそれぞれの行に出力してください。

両方のプログラムについて、入力には印刷可能なASCII(0x20から0x7E)と空白のみが含まれると想定できます。

これが問題です。

  • すべての空白が両方のプログラム/関数から削除される場合、結果の文字列は同一である必要があります。つまり、2つの提出は、空白文字の数と配置のみが異なる場合があります。
  • いずれのプログラム/関数にも文字列または正規表現リテラルを含めることはできません(言語に指定された文字タイプがある場合、文字リテラルは問題ありません)。
  • どちらのプログラム/機能にもコメントを含めることはできません。
  • プログラムのソースコードを直接的または間接的に読み取ってはなりません。

これはコードゴルフです。スコアは、両方のソリューションのサイズの合計(バイト単位)です。最低スコアが勝ちます。

リーダーボード

次のStack Snippetは、通常のリーダーボードと言語別の勝者の概要の両方を生成します。たとえあなたの選択した言語があなたが挑戦全体に勝つことを許さないとしても、なぜ2番目のリストのスポットをひったくってみませんか?人々がさまざまな言語でこの課題にどのように取り組んでいるかを知りたいと思います!

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

# Language Name, N bytes

どこN合計あなたの提出のサイズ。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

# Ruby, <s>104</s> <s>101</s> 96 bytes

合計数の前に個々の数を含めることもできます。たとえば、

# Python 2, 35 + 41 = 76 bytes

取り消されていない最後の番号がスニペットによって使用されます。

<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
そのリーダーボードはクールです!
デジタル外傷14

5
ホワイトスペースの回答はルール1に準拠するように
聞こえ

1
@ nyuszika7h確かにそうなりますが、とにかく特に短いことはありません。
マーティンエンダー

7
重要な空白、そう...恩恵か何かで、空白ではない
corsiKa

回答:


15

Pyth、16 + 15 = 31バイト

ここで試してみてください

カウンタ:

L@,cb)sm!cd)b1 0

スプリッター:

L@,cb)sm!cd)b10

これらはそれぞれy、目的のタスクを解決するために文字列入力を受け取る関数を定義します。

@FryAmTheEggmanに感謝します。Pythの機能を使用してリストにモジュラーインデックスを作成し、キャラクターを剃ります。

テストケース:

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

説明:

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バイト

カウンタ:

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

スプリッター:

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

カウンターには、Pythonが行に式を1つだけ持つことができるという事実を使用します。短絡のために評価されるのを防ぐため、分割して+1、スローされるの0<9or x.split()を停止する必要があります。NameError0<9Truex.split()

スプリッターの場合、空白の数は常に負でsum(y.isspace()for y in x)+10<9はないため、常に負でFalseあり、分割関数が機能します。


代替1、59 + 60 = 119バイト

カウンタ:

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

スプリッター:

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

カウントと分割の両方の結果は、2要素のリストに保存されます。リストは、のいずれかによってインデックスされるmin([1])含む1要素のリストの最小値を返す1、またはm in([1])返す、False(に相当する0ように)mに含まれていません[1]


代替2、67 + 69 = 136バイト

カウンタ:

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

スプリッター:

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

上記のように、カウントと分割の両方の結果は2要素のリストに保存されます。sortedは真理値である組み込み関数であるため、(と同等)をnot sorted返します。の場合、関数であり、また真実であるため、が返されます。False0not s or tedsnot sFalseted = 1


代替3、59 + 60 = 119バイト

カウンタ:

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

スプリッター:

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

これは、スプリッターの結果が変数aに保存され、カウンターの結果が変数に保存される関数ですa1。前と同じように、Pythonは1行に式を1つ持つだけで十分です(この場合)1。分割するとa1、関数から何を返すかが決まります。


22
もう一度+1しnot sortedます。
マーティンエンダー14

間の改行がある+10<9or x.split()必要?
isaacg 14

1
@isaacgあなたは例外を気にする場合は、[はい
SP3000

あなたはとの3つのバイトをオフに剃ることができますm=lambda x:sum(y.isspace()for y in x)+00and x.split()し、m=lambda x:sum(y.isspace()for y in x)+0;0and x.split()(そのセミコロンもちろんの改行を作る)
cjfaure

何の空白がありません場合@cjfaureは、私が最初のものはスプリッタとして働くとは思わない
SP3000

16

Java 8、239 + 240 = 479

空白をカウントします(整数を返します)

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);}

空白で分割(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);}

説明:

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);
}

私には、これは素晴らしいように見えます。+1
ロドルフォ・ディアス14

Javaはコードゴルフの最悪の言語でなければならないことを考えると、かなり良いです。
tbodt

13

空白、75 + 153 = 228

スペース、タブ、改行はそれぞれSTLに置き換えられ、読みやすくするために折り返されています。で適切なホワイトスペースファイルに変換しますtr -d \\n | sed 'y/STL/ \t\n/'

カウンタ

SSSLLSSLSSSTSSSSSLSLSSLSTLTSTTTSLSLTSSLTSSTLTTLSSSTLTSSSLSLLLSSSLS
LLSLLTLST

スプリッター

SSSTLSSSLTTSLSSTLSSSLSLSTLTSTTTSLSSLSLTSLSSSTSSSSTLTSSTLTTTTLSSSTL
SLSTTSLSLSLLSSTTLSSSTSTSLSSSTLTTTLTSTSLTLSSSSSTLSSSLTTSLSSTSLLSLTL
LSSSLTLSSLSLTLLSSLLLL

2
私はそれがどれくらいかかるのだろうと思ってい
マーティン・エンダー14

4
ホワイトスペースでは、これは2つの別個のコードゴルフの課題になります。
tbodt 14

13

マーベラス、103 + 92 = 195

カウンタ:

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

スプリッター:

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

ここでこれらのプログラムをテストします。円柱板、ライブラリを含む、空白セル用のスペースはすべてチェックする必要があります。

入力および出力は、STDIN / STDOUTを介して行われます。

説明

カウンタ:

カウンターソース

青いパスは入力を受け取ります。文字が空白文字(0x21未満のASCII値)である場合、紫色のパスと同期する黒いパスが使用されます。

紫のパス&1は、黒のパスが取得されるたびに、シンクロナイザーに保存されている大理石を単純に増やします。

入力がなくなると、赤いパスが使用され、空白文字の数が出力されて終了します。

スプリッター:

スプリッターソース

プログラムは青いパスで始まり、空白以外の文字が見つかるまでループします。

空白以外の文字が取得されると、黒のパスが取得され、この文字が出力され、実行が緑のパスに移動します。緑のパスは、空白文字が受信されるまでループして出力します。実行は、を含む紫色のパス3W、または3ウェイスプリッターに続きます。

左のブランチは実行を青のパスに移動します(そして、空白以外の文字が見つかるまで空白は破棄されます)。

中間ブランチは0への入力のコピー設定?0(の間の乱数生成0とを0)、及び10(追加0x0A=改行)、次に出力されます。

正しいパスは破棄されます。


後続の空白がある場合、スプリッターは終了しないようです。
マーティンエンダー14

12

CJam、26 + 27 = 53 59 61 73 77 バイト

カウンタ

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

スプリッター

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

使い方

アイデアは単純で、空白の数を計算し、空白の連続した実行で文字列を分割します。その後、次の事実に基づいてそれらのいずれかを選択' !を意味しnot of space characterている間、falsyある'!ある!truthyある文字を、。

拡張コード:

'! / ' !                              "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";

入力はSTDINからであり、出力はSTDOUTへです

こちらからオンラインでお試しください


10

Mathematica、44 + 43 = 87 97バイト

別の言語をミックスに追加すると思いました。

カウンタ:

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

スプリッター:

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

これは、空間分離が乗算と同じであるというMathematicaの機能を利用します。そして、何かに0を掛けることは常に0であり、何かに0を加えることは常にdem等です。

カウンターについては、最初に空白をカウントし、を追加し0*1*StringSpli*t@#ます。StringSpliそして、t定義されていないが、Mathematicaは記号計算を使用していますので、それだけで、未知の変数や関数としてそれらを扱います。1*冪等(同じようである0+)、0*ゼロにそれを回します。リストはスカラーとベクトルの乗算として扱われ、結果としてゼロのベクトル(リスト)になるStringSplitため、2つの変数に分ける必要が0あります。

スプリッターには、Count文字列を調べずに存在するという事実を使用しています。パターンに一致するすべてのサブをカウントしようとしますWhitespaceが、文字列の内容にのみ適用されるパターンです。したがって、Count常にが返され0String消失します。分割された配列の乗算01 = 1は再びagain等です。


10

Ruby、107 91バイト

スプリッター(46バイト)

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

カウンター(45バイト)

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

pは、引数なしで単にを返す定義済みのメソッドですnil。これをいくつかの方法で使用します。スプリッターでは、イニシャルpは何もしません。gets(p)区切り文字がnullであるため、標準入力からすべてを読み取ります。その上で組み込みのsplitメソッドを呼び出し、その結果をpに割り当てます。そのため、引数が与えられていない場合、変数として解析されます。変数のputs p||...各要素をp独自の行に短絡して出力します。

カウンターでは、最初の改行を削除して、pp代わりに分割配列が割り当てられます。に割り当てていないのでp、まだnilを返すメソッドなので、の2番目の部分||が評価され、に渡されputsます。$_はの結果を含むマジック変数getsであるため、空白の合計量は、そのサイズから非空白文字を差し引いたものになりppます。カウントを行うより短い方法があるべきだと感じていますが、それを見つけることができず、カウンターでスプリット配列を使用するのは楽しいです。


7

Python、169

Pythonでこれを行うのはほとんど簡単です!

カウンタ:

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

スプリッター:

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

それらは1つのスペースだけが異なり、数字や変数名を半分に分割するようなトリックはしていません:)


6

C、138 + 136 = 274

いずれの場合も、コードはコマンドライン引数を1つだけ受け入れ、結果をstdoutに出力するプログラムです。\tタブ文字に置き換える必要があります。タブと改行を含む引数を渡したい場合は、;)を見つけるのがあなたの仕事です。

カウント

#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);}

分割

#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バイト

カウンタ:

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

スプリッター:

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

ゴルフをしていない:

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
    }

このRegExp(String.fromCharCode(92,115)行は、/\s/正規表現または文字列リテラルなしで、空白に一致する正規表現を作成します。

各プログラムでは、変数vor を使用しますvv。分割された配列をその変数(vまたはvv)に格納し、値の動作を分岐しますv(一方、vv無視されます)。カウンターにvは、真の値があります。スプリッターでは、偽の値を持っています(vv代わりに値を取得したため)。


代替:JavaScript、250バイト

簡潔にするために賞を獲得していない別のソリューションがありますが、JavaScriptの自動セミコロン挿入動作を悪用することは興味深い挑戦だと思いました。

カウンタ:

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}

スプリッター:

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}

非ゴルフカウンター:

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`
}

スプリッターは、以下を除いてまったく同じです:

break x;

今でしょ

break
x;

彼らは改行せずに理解することができる場合はJavaScriptの自動セミコロン挿入は通常、早期の複数行のステートメントを終了しませんが、それはラインが後に壊れる許容しないreturncontinueまたはbreak。したがって、行は単にとして読み取られbreak、外側のループから抜け出すのではなく、内側のループから抜け出します。次にo = a.filter(j=>j)、外側のループに2番目のパスが与えられるため、「2番目のパス」動作が実行されます(カウンターではスキップされます)。


!!x自動Bool変換とは異なりますか?
l4m2

@ l4m2そうではありません!とfilter同じルールでコールバックを自動ブーストするため、削除しました!!。ありがとう!
-apsillers

5

パイソン、228の 198 182 166 146 145バイト

カウンター(72バイト):

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

スプリッター(73バイト):

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

ior1は偽の変数ですが、真実ですi or 1。それが主なトリックです。


iスプリッターの空の文字列である場合、これは壊れませんか?に変更iorbすることで修正ior1できます。これにより1、との間の文字を保存することもできますelse
isaacg 14

@isaacg変数名に数字を使用できることを完全に忘れてしまいました!ありがとうございました<3
地下

5

Befunge 98、61 + 59 = 120

カウンタ:

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

スプリッター:

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

4

Bash、75 + 79 = 154バイト

これは、スクリプトの一部の行または行の一部が(状況によっては)正しくない場合でも、bashが実行を継続できることに依存しています。空白は、いくつかの閉じ括弧のエスケープを無効にし、パイプを改行して改行するために使用されます。

スプリッター:

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

カウンタ:

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

入力はコマンドライン引数経由で、出力は標準出力経由です。

これはbashエラー動作に依存しているため、ユーザーはstderrを無視することが期待されます。

実行例(改行と複数の連続したスペースで入力を表示):

# 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

ルビー、114 + 116 107 + 109 = 216バイト

これは、歴史家によるルビーのソリューションと競合することはできませんが、とにかく我慢する価値があると思いました。

私は使用$zのためにnilnil.to_sのためにString.new

入力の末尾に追加する余分な空白文字は、最後の単語を強制的に配列に追加することです(r)-単語は、空白文字が非空白文字の後に続く場合にのみ配列の最後に追加されます。別の方法はr<<w if weach_byteブロックの後にもう1つ追加することでした。

カウント

->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}

分割

->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}

ああ、その判決については確信が持てなかった。三項演算子の代わりにif-elseを使用するように変更しました-文字列リテラルはもうありません。
アレクサンダーバード14

3

Haskell53 + 55 = 108 36 + 38 = 74バイト

カウンタ

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

スプリッター

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

このソリューションは、Haskellの関数はMonad型クラスのインスタンスであるため、do記法でモナドアクションとして使用できるという事実を利用しています。

最初のケースでは、do-blockの結果の関数はpure(本質的constに関数型用)の最初の引数であり、カウンターを最終結果にし、スプリッターを破棄します。

2番目のケースでpureは、1つの引数にのみ適用され、別の関数(カウンター)を返す関数になります。ただし、結果は使用されないため、破棄されます。最終結果は、doブロックの2行目であるスプリッターです。


素敵なアプローチ![' ','\t','\n']に短縮できます" \t\n"
ライコニ

@Laikoni説明では文字リテラルのみが許可され、文字列または正規表現リテラルは許可されません
シラキュース

2
このチャレンジではほとんどの制御文字を処理する必要がないため、(<'!')空白のテストに使用することでこれを短縮できます。
Ørjanヨハンセン

2

Java 8、187 + 188 = 375

まず第一に、この答えは@Ypnypnに大きく基づいていると言いたいです。基本的に、いくつかの部分をより短い部分に置き換えました(この課題でIMOが最も重要な空白に依存する部分を含む)が、機能コードはほとんど同じです。

空白をカウント 187(戻り値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);}

空白分割 188(戻り値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文字

1つの引数を取り、返す2つの関数。私が考えることができる最もくだらない方法を使用して、同じが空白のルールを破ったので、おそらくより賢いルートを見つけることによって救われるべきキャラクターがいるでしょう。

(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

動詞aが1つの引数で使用されるか2つの引数で使用されるかに応じて、2つの異なるアクションを持つように動詞を定義します。引数が1つの場合、は(e.u:)&9 10 32、各文字が空白かどうかをチェックします。2つの引数がある場合、それはa:-.~(<;._1~1,}.)で、右側にブールベクトルを取り、それらの位置で左側の引数を切り取り、で空の切り取りをすべて破棄しa:-.~ます。

次に、aaの結果でTrue値の数になるように定義しaます。これは、1つの引数でのみ意味があります。最後に、我々は、使用しaaたりa a、我々は、文字列の空白を数えるか、分割したいかによって異なります。aa期待どおりに動作します。

その理由a aは、Jが見る(f g)y(f g)、フックを考慮して評価するからですy f (g y)。この場合、上記fのダイアディックaは切断を行い、gisはa[aaから合計を計算し、aaそれを捨てて、a再び(単項)を計算します。

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バイト

カウンタ

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

スプリッター

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

1

Perl、37 + 38 = 75

カウンター

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

スプリッター

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


0

Python 2、98

分割(49)

リスト内のトークンを返します。

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

カウント(49)

スペース文字の数を含む長さ1のリストを返します。ほとんどの場合、ランタイムエラーが発生しますが、関数fはコードの実行後に使用できます。

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

0

C(gcc)、88 + 89 = 177バイト

スプリッター

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;}

スプリッター

カウンタ

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;}

カウンタ

流れ落ちる

入力を関数の引数として受け取ります。カウント関数は、空白の数を返します。分割関数は、その出力にSTDOUTを使用します(ただし、付随的に空白の数から1を引いた値も返します)。

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バイト

  • どちらのプログラム/関数にも文字列または正規表現リテラルを含めることはできません

[^$IFS]パターンマッチングで使用されるため、資格があるかどうかはわかりません。禁止されている場合の45 + 45ソリューションを以下に示します。


スプリット:

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

カウント:

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

:組み込みはにequivilentですtrue(コメントは許可されないので)私たちはそれに不要な拡張をパイプによるコメントと/ dev / nullの間に何かとしてそれを使用し、。

Zshには、空白で分割するための組み込み機能があり${=var}ます。これにより、単に両方を実行し、不要なものを破棄する以外の、あらゆる種類の論理的な組み合わせを行うことが難しくなります。

オンラインでお試しください!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.