haiku-w 검출기 작성


41

하이쿠 5/7/5로 세 줄시를 음절 각각 카운트.

하이쿠 w는 5/7/5로 세 줄 시이다 워드 각각 카운트.

도전

반환하는 프로그램 작성 진정한 입력이 하이쿠-W의 경우를, 그리고 거짓 없는 경우.

유효한 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.

결과 : False


규칙

  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다.
  • 표준 코드 골프 허점이 적용됩니다. 부정 행위는 금지되어 있습니다.
  • 다른 부울 리턴과 같은 값 10허용한다.
  • 입력으로 사용되는 3 개의 문자열 목록도 허용됩니다.
  • 유효한 haiku-w 입력에는 앞뒤 공백이나 단어를 구분하는 여러 공백이 없어야합니다.

1
haiku-w에는 항상 3 줄이 포함됩니까?
Kritixi Lithos

1
예. 입력에 3 개 이상의 줄이 포함되어 있으면 프로그램은 false 를 반환해야합니다 .
DomTheDeveloper

5
어떤 줄에 앞뒤 공간이 있습니까? 아니면 단어를 분리하는 여러 공백?
Greg Martin

8
그건 그렇고, 이와 같은 설명은 샌드 박스에 제안 된 질문을 먼저 게시하는 주요 이유 입니다. :)
Greg Martin

11
코드 자체가 haiku-w 인 제출에 대한 보너스 포인트.
Glorfindel

답변:


25

자바 스크립트 (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
%그리고 *당신은 필요가 없습니다, 우선 순위가 동일 ()들 제가 생각하지만, (d*2|5)작품도 있습니다. 또한 당신은 하나를 사용하여 도망 갈 수 &있지만, 당신이 그것을 사용함으로써 그것을 향상시킬 수 있다고 생각합니다 (b...).length==3>b.some(...length-...).
Neil

괄호에 대한 팁을 주셔서 감사합니다. 또한 접근 방식을 변경했기 때문에 더 이상 길이를 명시 적으로 확인하지 않습니다.
Luke

1
아,이 경우 계산에 신경 쓰지 말고을 사용하십시오 a=>a.map(c=>c.split .length)=='5,7,5'.
Neil

Hehe, 네 말이 맞아 내가 생각 했어야했는데 ...
Luke

당신은 여전히 ​​필요하지 않습니다 +''- ==다른 인수가 문자열인지 여부를 나타냅니다.
Neil

12

AWK (GNU Awk), 24, 30, 28, 20 바이트

골프

517253==$0=q=q NF NR

True의 경우 "517253"을 출력 하고 False의 경우 빈 문자열을 출력 합니다.

awk에서 0이 아닌 숫자 값 또는 비어 있지 않은 문자열 값은 true입니다. 다른 값 (0 또는 널 문자열 "")은 false입니다.

GNU Awk 사용자 안내서

작동 원리

각 awk 문 (규칙)은 연관된 조치가있는 패턴 (또는 표현식)으로 구성됩니다.

pattern {action}

Awk는 입력을 한 줄씩 읽고 (레코드 별) 패턴 표현식을 평가하여 해당 조치가 호출되는지 확인합니다.

위의 코드는 동작 블록이없는 독립형 Awk 식 (패턴)이며,이 경우 암시됩니다 {print $0}.

오른쪽에서 왼쪽으로 읽어야합니다.

q=q NF NR

APPEND 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 단어를 포함하는 한 줄 또는 57과 5 단어를 포함하는 두 줄로 구성된 경우 실패합니다.
Lynn

@Lynn, true, 고정 될 때까지 보류합니다.
zeppelin

@ 린, 지금 고쳐야합니다
zeppelin

1
매우 영리한 수정! :)
Lynn

9

파이썬 , 42 바이트

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

온라인으로 사용해보십시오!

단어를 공백으로 구분하여 줄 목록으로 입력을받습니다.

우리는 앞뒤 공백이 없음을 보장하고 단 하나의 공백 만 각 단어를 분리하므로 각 행의 공백을 간단히 계산하여 w-haiku를 확인할 수 있습니다.

우리는 공간 카운트의 목록을 만들기 위해 목록 이해 에서이 작업을 수행합니다. 올바른 하이쿠 인 경우 다음과 같아야 [4, 6, 4]하므로이를 비교하여 결과를 반환합니다.


Python 2 만 지원해도 괜찮다면 2 바이트를 절약 할 수 있습니다 map(str.count,l,' ').
vaultah

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⁼ċ€⁶$ )

ċ€⁶Ḍ=464
Jonathan Allan

사실, 그렇지 않습니다 . 죄송합니다.
Jonathan Allan

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%

잘못된 단어 수를 가진 행을 읽 자마자 0이 아닌 오류 수준으로 종료합니다.


1
.. 잘 쓰레기
tbodt

7

수학, 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

파이썬, 58 44 바이트

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

tbodt에 의해 -14


입력을 길이가 3 인 문자열 목록으로 가져갈 수 있습니다. 를 사용하여 사용한 바이트를 저장할 수 있습니다 split("\n").
마일

44 바이트 :lambda h:[len(l.split())for l in h]==[5,7,5]
tbodt

누군가가이 거리를 더 짧게 만들었습니다 44
Charlie


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는이를 의미합니다. 줄 바꿈이 문자열에 포함됩니다. 정규 표현식의 두 번째 줄에는 역 참조 뒤에 두 개의 공백이 있습니다.


1
그것은 흥미로운 비법입니다!
Ismael Miguel


3

J, 12 바이트

4 6 4=#@;:@>

입력은 박스 화 된 문자열 목록입니다.

설명

이것은 일정한 왼쪽 타인을 가진 포크입니다. 올바른 타인의 결과가 #@;:@>와 일치 하는지 확인합니다 4 6 4. 올바른 시간은 각 ( >)을 개봉 한 다음 ( @)은 각 문자열을 단어 ( ;:) 로 변환 한 다음 ( )는 각 @길이 ( )를 취합니다 #.


3

R, 48 바이트

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

stdin에서 3 길이의 문자형 벡터를 읽고 공백 수를 계산하여 작동합니다. 공간 수를 계산하기 위해 정규식 패턴을 기반으로 발생 횟수를 계산할 수 str_count있는 stringr패키지 에서 from 을 사용합니다 .

패키지를 사용하지 않는 다른 방법은 다음과 같습니다.

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

루비 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

파이썬 2 , 57 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

나는 당신에게 @Dada를 줄 것이다. 그것은 하나의 심각한 테스트 사례입니다 :)
ElPedro

테스트 케이스로 수정하고 테스트했습니다.
ElPedro

2

MATL, 16 바이트

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

입력 값은 문자열로 구성된 셀형 배열이며 진리 또는 거짓 배열을 반환합니다 .

온라인으로 사용해보십시오

설명

        % 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]구성된 셀형 배열을 입력으로 받아들이고 각 줄의 공백 수를 계산 한 다음 결과를 배열 과 비교하여 진실 (모든 값은 1) 또는 거짓 (모든 값은 0) 배열을 생성합니다.

온라인 데모



2

클로저, 44 바이트

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

입력은 문자열 목록입니다. 함수는 공백 만 찾아서 계산합니다. 이 설명은 하이쿠입니다. :)


2

자바 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 줄 이하의 가능성은 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 바이트

안타깝게도 정규 표현식 aproach가 가장 짧습니다.

{@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

자바 (OpenJDK) , 82 바이트

@ corvus_192 덕분에 -2 바이트!

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

온라인으로 사용해보십시오!

그것은 본다 그래서 golfable 하지만 내장지도 기능이없는, 나는 좋은 방법을 찾을 수 없습니다. 스트림을 사용하여 맵 함수를 작성하는 것처럼 배열을 반복하는 것이 몇 바이트 더 깁니다.

Lambda 표현식은 문자열 배열을 가져 와서 부울을 반환합니다.


입력으로 두 줄만, 또는 네 줄만 있다면?
Kevin Cruijssen

op에 따르면 @KevinCruijssen은 "입력으로 길이 3의 문자열 목록도 허용됩니다." 내 프로그램은 길이가 3 줄입니다.
Pavel

를 호출하면지도 함수를 얻을 수 Arrays.stream있지만 사용하기에 충분하지 않을 정도로 길다 (특히 가져와야하는 경우 Arrays)
Pokechu22

@ Pokechu22 네, 시도했지만 여전히 더 길어졌습니다.
Pavel

&대신 &&2 바이트를 절약 할 수 있습니다
corvus_192

2

스마일, 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.