haiku-wディテクターを書く


41

A 俳句は 5/7/5で、三行詩である音節それぞれカウント。

俳句-wは 5/7/5で、三行詩であるワードをそれぞれカウント。

チャレンジ

返されるプログラム書くの真入力は俳句-W、及びある場合にはfalseではない場合が。

有効なhaiku-w入力は、改行で区切られた3行で構成する必要があります。

  • 行1は5つの単語で構成され、各単語はスペースで区切られている必要があります。
  • 行2は7つの単語で構成され、各単語はスペースで区切られている必要があります。
  • 行3は5つの単語で構成され、各単語はスペースで区切られている必要があります。

The man in the suit
is the same man from the store.
He is a cool guy.

結果:

Whitecaps on the bay:
A broken signboard banging
In the April wind.

結果:


ルール

  • これはであるため、バイト単位の最短回答が優先されます。
  • 標準的なコードとゴルフの抜け穴が適用されます。不正行為は禁止されています。
  • 他のブール戻り値、等1とは0、許容可能です。
  • 入力としての文字列の長さ3のリストも使用できます。
  • 有効なhaiku-w入力には、先頭または末尾のスペース、または単語を区切る複数のスペースを含めることはできません。

1
haiku-wには常に3行が含まれますか?
KritixiのLithos

1
はい。入力に3行より多いまたは少ない行が含まれている場合、プログラムはfalseを返す必要があります
-DomTheDeveloper

5
どの行にも先頭または末尾のスペースがありますか?または単語を区切る複数のスペース?
グレッグマーティン

8
ところで、このような説明は、提案された質問を最初にSandboxに投稿する主な理由です。:)
グレッグマーティン

11
コード自体が俳句である提出に対するボーナスポイント。
グローフィンデル

回答:


25

JavaScript(ES6)、73 72 64 63 54 42 39バイト

13バイトを節約してくれたNeilに感謝

a=>a.map(b=>b.split` `.length)=='5,7,5'

説明

これは、引数として文字列の配列をとる太矢印関数です。各行を単語数で置き換えます。haiku-wの場合a、5、7、5の配列が含まれます。JavaScriptでは2つの配列を同時に比較できないため、配列は最初に文字列に変換されてから比較されます。これにより、ブール値が返されます。


1
%*同じ優先順位を持っているので、()s は必要ありませんが、うまくいく(d*2|5)かもしれません。また、あなたはシングル&で逃げることができますが、私はあなたがそれを使ってそれでも改善できると思いますが(b...).length==3>b.some(...length-...)
ニール

括弧についてのヒントをありがとう。また、アプローチを変更したため、長さを明示的にチェックしなくなりました。
ルーク

1
ああ、その場合、計算に煩わされることなく、単に使用しますa=>a.map(c=>c.split .length)=='5,7,5'
ニール

へへ、あなたは正しい。私はそれを考えるべき
ルーク

まだ必要ありません+''- ==他の引数が文字列かどうかを文字列化します。
ニール

12

AWK(GNU Awk)、 243028、20バイト

ゴルフ

517253==$0=q=q NF NR

Trueの場合は「517253」、Falseの場合は空の文字列が出力されます。

awkでは、ゼロ以外の数値または空でない文字列値はすべてtrueです。その他の値(ゼロまたはヌル文字列 "")はfalseです

GNU Awkユーザーガイド

使い方

各awkステートメント(ルール)は、関連付けられたアクションを持つパターン(または式)で構成されます。

pattern {action}

Awkは入力を行ごと(レコードごと)に読み取り、パターン式を評価して、対応するアクションが呼び出されるかどうかを確認します。

上記のコードは、アクションブロックがないスタンドアロンのAwk式(パターン){print $0}です。

右から左に読む必要があります。

q=q NF NR

追加N個のアンバーのF ields(単語)と、N個ののアンバーRの変数にecords(すなわち、現在の行番号)、Q

このようにして、適切なHaiku-wを処理するとき、qは次のように設定されます。

  • 51-1行目(5ワード)
  • 5172-行番号2(5ワード+ 7ワード)
  • 517253-3行目(5ワード+ 7ワード+ 5ワード)

$0=q

新しく計算されたqの値を$ 0に割り当てます(デフォルトでは現在の行/レコード全体を保持します)。

517253==$0

適切なHaiku-w(517253)の「署名」と比較し、一致する場合、式全体が「true」と評価され、対応するアクション(暗黙的print $0)が実行され、「517253」がstdout(True)に送信されますそうでない場合、出力は空になります(False)。

任意の数のゴミ行が続く場合でも、これによりHaiku-wが適切に認識されることに注意してください。

入力としての文字列の長さ3のリストも使用できます。

(つまり、入力は3行の長さであると想定できます)

テスト

>awk '517253==$0=q=q NF NR'<<EOF
The man in the suit
is the same man from the store.
He is a cool guy.
EOF

517253

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


2
入力が575語を含む1行、または57語と5語を含む2行などで構成される場合、これは失敗します
リン

@ Lynn、true、これが修正されるまで保留。
ツェッペリン

@Lynnは、現在では修正されなければならない
ツェッペリン

1
非常に巧妙な修正!:)
リン

9

Python、42バイト

lambda l:[s.count(' ')for s in l]==[4,6,4]

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

単語を単一のスペースで区切った行のリストとして入力を受け取ります。

先頭または末尾のスペースはないことが保証されており、各単語を区切るスペースは1つだけなので、各行のスペースをカウントするだけでw-haikuを検証できます。

リスト内包表記でこれを行い、スペースカウントのリストを作成します。正しい俳句である場合は、のよう[4, 6, 4]に見えるはずなので、これと比較して結果を返します。


Python 2のみをサポートすることに問題がない場合は、2バイトを節約できますmap(str.count,l,' ')
ヴォルター

8

ゼリー10 9バイト

ċ€⁶⁼“¥©¥‘

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

説明

ċ€⁶⁼“¥©¥‘  Input: length-3 list of strings
 €         For each string
ċ ⁶          Count the number of spaces
    “¥©¥‘  Convert string to code page indices, makes [4, 6, 4]
   ⁼       Match

またċ€⁶⁼4,6,4ċ€⁶⁼464D¤…短いものは見つかりません。(ああ、あなたもそれを反転させることができます:464D⁼ċ€⁶$
リン

ċ€⁶Ḍ=4648.ための作品罰金
ジョナサン・アラン

実際には、いや、申し訳ありません。
ジョナサンアラン

7

バッチ、102バイト

@echo off
call:c&&call:c 2||exit/b
:c
set/an=%1+5
set/ps=
for %%W in (%s%)do set/an-=1
exit/b%n%

ワード数が間違っている行を読み取るとすぐに、ゼロ以外のエラーレベルで終了します。


1
......よくがらくた
-tbodt

7

Mathematica、21バイト

{4,6,4}==Count@" "/@#&

入力として文字のリストのリストを取り、Trueまたはを返す名前のない関数False。各文字のリストに含まれるスペースの数を単純にカウントします。チャレンジのルールでは、各スペースの単語数と完全に相関します。

以前の提出:

Mathematica、31バイト

Length/@StringSplit/@#=={5,7,5}&

入力として文字列のリストを取得し、Trueまたはを返す名前のない関数False



6

網膜、12バイト

M%` 
^4¶6¶4$

(最初の行の後に末尾のスペースがあります)

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

  • M%`  -各行のスペースの数を数えます。

    • M -一致モード-一致の数を出力します。
    • % -各行
    • ` -個別の構成と正規表現パターン
    • -ちょうどスペース。
  • ^4¶6¶4$ -4、6、および4つのスペースと、正確に3行が必要です。

    • 改行に一致します。残りは単純な正規表現です。

印刷し1、有効な入力のために0無効のため。


4

Python、58 44バイト

lambda h:[len(l.split())for l in h]==[5,7,5]

-14 by tbodt


入力を文字列の長さ3のリストとして受け取ることができます。を使用して費やしたバイトを保存できますsplit("\n")
マイル

44バイト:lambda h:[len(l.split())for l in h]==[5,7,5]
tbodt

誰かが44消さ到達するために、この短いを作る
チャーリー


4

Pyth、9バイト

qj464T/R;

リストの入力を"quoted strings"受け取って印刷するプログラム、Trueまたは必要Falseに応じて。

テストスイート

使い方

qj464T/R;   Program. Input: Q
qj464T/R;Q  Implicit variable fill
     T      Are the base-10
 j          digits
  464       of 464
q           equal
      /     to the number
        ;   of spaces
       R    in each string
         Q  in the input?
            Implicitly print


4

PowerShell、43バイト

"$args"-replace'\S'-match'^(    )
\1  
\1$'

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

説明

入力を改行で区切られた文字列として受け取ります。

空白以外をすべて削除し、正規表現を使用して「4スペース、改行、6スペース、改行、4スペース改行」と完全に一致することを確認します。

キャプチャグループは4つのスペースと一致し、後方\1参照はそれを参照します。文字列には改行が埋め込まれます。正規表現の2行目には、後方参照の後に2つのスペースが含まれていることに注意してください。


1
それは興味深いアプローチです!
イスマエルミゲル


3

J、12バイト

4 6 4=#@;:@>

入力は、文字列のボックス化されたリストです。

説明

これは、一定の左枝を持つフォークです。これにより、右タインの結果が#@;:@>、と等しいかどうかがチェックされ4 6 4ます。適切なタイミングで各(>)のボックス化が解除され、次に(@)が各文字列を単語(;:)に変換し、次に()がそれぞれ@の長さを取ります(#)。


3

R、48バイト

all(stringr::str_count(scan(,"")," ")==c(4,6,4))

stdinから3長の文字ベクトルを読み取り、スペースの数をカウントすることにより機能します。スペースの数をカウントするには、正規表現パターンに基づいて出現回数をカウントできるstr_countfrom stringrパッケージを使用します。

パッケージを使用しない別の方法は次のとおりです。

all(sapply(scan(,""),function(x)length(el(strsplit(x," "))))==c(5,7,5))

初めて見たel、ありがとう。
BLT

3

C 142バイト

void f(){char *c;l=3;s[3]={0};while(l>0){if(*c==' ')s[l-1]++;if((*c=getchar())=='\n'){l--;}}printf("%d",(s[0]==4 && s[1]==6 && s[2]==4)?1:0);}

ゴルフされていないバージョン:

void f()
{
  char *c;
  c = (char *)malloc(sizeof(char)); 
  int l=3;
  int s[3]= {0};


  while(l>0)
  {  
    if(*c==' ')
    s[l-1]++;

    if( (*c=getchar())=='\n')
    {    
      l--;
    }   
  }
  printf("%d",(s[0]==4 && s[1]==6 && s[2]==4)?1:0);
}

5/7/5シーケンスの場合は1、それ以外の場合は0を返します。

肯定的なテストケース:

ここに画像の説明を入力してください


3

C ++、357バイト

新しい種類のコードゴルフですが、これは私がすぐにできる最高の方法です

#include <iostream>
using namespace std;
int n(std::string s)
{
    int b = 0;
    for(char c: s)
        if(c == ' ') b++;
    cout << "C = " << b;
    return b;
}
int main()
{
    string a, b, c;
    getline(cin, a);
    getline(cin, b);
    getline(cin, c);
    if(n(a)==4 && n(b)==6 && n(c)==4)
        cout<<'1';
    else cout << '0';
    return 0;
}

4
PPCGへようこそ!コードゴルフの目標は、コードをできるだけ短くすることです。良い最初のステップは、不要な空白をすべて削除することです。
ETHproductions

3

Ruby 1.9.3

ゴルフはしていませんが、それ自体が俳句です

def haiku_w(input)
  lines = input.split("\n")
  lengths = lines.map(&:split).map(&:length)
  lengths.eql?([5,7,5])
end

または...

lines equals input split (newlines)
lengths equals lines map split map length
lengths equals five seven five?

残念ながら、どの行の先頭の空白文字でも動作しませんが、末尾の文字列は処理します。


2

パイソン257の、64バイト

編集 @Dadaからのフィードバック後の7つのバイトを追加して修正しました。ありがとう!

i,j=input,''
for x in i():j+=`len(x.split())`+' '
i(j=='5 7 5 ')

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

最短のPythonの答えではありませんがinput()、出力を表示してprintステートメントを保存するために使用することについて最近学んだ新しいトリックを使用したかっただけです。行のリストを入力として受け取ります。端末でプログラムを(例外を除いて)終了するには、Ctrl C(またはその他のキープレス)が必要ですが、TIOがなくても正常に動作します。


4
これは、このような場合に失敗します。
ダダ

@Dadaをあげます。それは1つの深刻なテストケースです:)
ElPedro

テストケースで修正およびテストしました。
エルペドロ

2

MATL、16バイト

"@Y:Ybn&h][ACA]=

入力は文字列のセル配列であり、trueまたはfalsey配列を返します。

オンラインで試す

説明

        % Implicitly grab input
"       % For each element in the cell array
@Y:Yb   % Split it on spaces
n       % Count the number of elements
&h      % Horizontally concatenate everything on the stack
[ACA]   % Create the array [5 7 5]
=       % Perform an element-wise equality
        % Implicitly display the truthy/falsey array

2

MATLAB /オクターブ、38バイト

@(x)cellfun(@(y)sum(y==32),x)==[4 6 4]

このソリューションは、文字列のセル配列を入力として受け入れ、各行のスペースの数をカウントし、結果を配列[4 6 4]と比較して、truey(すべての値が1)またはfalsey(すべての値がゼロ)配列を生成します。

オンラインデモ



2

Clojure、44バイト

#(=(for[l %](count(filter #{\ }l)))'(4 6 4))

入力は文字列のリストです。関数はスペースのみを見つけてカウントします。この説明は俳句です。:)


2

Java 7、154バイト

class M{public static void main(String[]a){System.out.print(a.length==3&&a[0].split(" ").length==5&a[1].split(" ").length==7&a[2].split(" ").length==5);}}

プログラムの要件と、3行未満または3行を超える可能性により、Javaの冗長性自体も言及されていないため、この「ゴルフ」コードはかなり大きくなります。

ゴルフをしていない:

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

class M{
  public static void main(String[] a){
    System.out.print(a.length == 3
        && a[0].split(" ").length == 5
         & a[1].split(" ").length == 7
         & a[2].split(" ").length == 5);
  }
}

2

SimpleTemplate、77バイト

悲しいことに、正規表現のアプローチは最短です。

{@if"@^([^\s]+ ?){5}\s([^\s]+ ?){7}\s([^\s]+ ?){5}+$@"is matchesargv}{@echo1}

* NIXスタイルの改行を使用して、テキストを最初の引数として指定する必要があります。これは、Windowsスタイルの改行では機能しません。

ゴルフをしていない:

{@if "@^([^\s]+ ?){5}\s([^\s]+ ?){7}\s([^\s]+ ?){5}+$@"is matches argv}
    {@echo 1}
{@/}

非正規表現ベース、114バイト

{@setR 1}{@eachargv asL keyK}{@php$DATA[L]=count(explode(' ',$DATA[L]))!=5+2*($DATA[K]&1)}{@set*R R,L}{@/}{@echoR}

これには、各行を関数の引数として指定する必要があります。

ゴルフをしていない:

{@set result 1}
{@each argv as line key k}
    {@php $DATA['line'] = count(explode(' ', $DATA['line'])) != 5+2*( $DATA['k'] & 1 )}
    {@set* result result, line}
{@/}
{@echo result}

2

スタック、22バイト

[' 'eq sum]map(4 6 4)=

以下のように、文字列のリストとしてスタックの最上部から入力を取得します。

($'The man in the suit' $'is the same man from the store.' $'He is a cool guy.')

説明

[' 'eq sum]map(4 6 4)=
[         ]map          map the following function over each item
 ' 'eq                  vectorized equality with ' '
       sum              summed
              (4 6 4)=  is equal to (4 6 4)

2

Java(OpenJDK)、82バイト

@ corvus_192のおかげで-2バイト!

s->s[0].split(" ").length==5&s[2].split(" ").length==5&s[1].split(" ").length==7

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

それはとてもゴルファーに見えますが、組み込みのマップ機能がなければ、良い方法を見つけることができません。ストリームを使用してマップ関数を作成する場合と同様に、配列の反復処理は数バイト長くなります。

ラムダ式は文字列の配列を取り、ブール値を返します。


入力として2行、または4行しかない場合はどうなりますか?
ケビンCruijssen

@KevinCruijssenは、「入力としての文字列の長さ3のリストも受け入れられます」というopに従います。私のプログラムは、長さ3の行のリストを取ります。
パベル

を呼び出すとマップ関数を取得できますが、Arrays.streamそれは使用する価値がないかもしれないほど長いです(特にインポートする必要がある場合Arrays
-Pokechu22

@ Pokechu22ええ、私はそれを試しましたが、それでも長くなりました。
パベル

&代わりに使用&&して2バイトを保存することができます
corvus_192

2

SmileBASIC、96 94バイト

INPUT A$,B$,C$?C(A$,4)*C(B$,6)*C(C$,4)DEF C(S,E)WHILE""<S
INC N,POP(S)<"!
WEND
RETURN N==E
END

1

R、100バイト

f<-function(a){all(sapply(a,function(x){length(grep(" ",as.list(strsplit(x,"")[[1]])))})==c(4,6,4))}

引数として文字列の長さ3のリストを取ります。さらなるゴルフはそれを@Billywobの答えに変えるので、おそらくさらにゴルフはされません。

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