Bir haiku-w detektörü yazın


41

Bir haiku , sırasıyla 5/7/5 heceli sayıma sahip üç satırlı bir şiirdir .

Bir haiku-w sırasıyla 5/7/5 kelime sayısı olan üç satırlı bir şiirdir .

Meydan okuma

Girdi haiku-w ise true döndürecek bir program yazın , değilse false olacaktır.

Geçerli bir haiku-w girişi, yeni bir satırla ayrılmış 3 satırdan oluşmalıdır.

  • Satır 1, her biri bir boşlukla ayrılmış, 5 kelimeden oluşmalıdır.
  • Satır 2, her bir kelimeyle boşluk bırakılarak 7 kelimeden oluşmalıdır.
  • Satır 3, her bir kelimeyle boşluk bırakarak 5 kelimeden oluşmalıdır.

Örnekler

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

Sonuç: Doğru

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

Sonuç: Yanlış


kurallar

  • Bu , yani bayt cinsinden en kısa cevap kazanır.
  • Standart kod-golf boşlukları uygulanır. Hile yapmak yasaktır.
  • Diğer boole dönüş gibi değerler, 1ve 0kabul edilebilir.
  • Giriş olarak uzunluk-3 karakter dizisi de kabul edilebilir.
  • Geçerli haiku-w girişleri, baştaki veya sondaki boşluklara veya sözcükleri ayıran birden çok boşluk içermemelidir.

1
Haiku-w her zaman 3 satır içerecek mi?
Kritixi Lithos,

1
Evet. Giriş 3'ten fazla veya daha az satır içeriyorsa, program false döndürmelidir .
DomTheDeveloper,

5
Herhangi bir hatta öncü ya da sonda boşluklar olacak mı? Veya kelimeleri ayıran birden fazla boşluk?
Greg Martin

8
Bu arada, bunun gibi açıklamalar ilk önce Sandbox'a önerilen soruları göndermenin temel nedenidir . :)
Greg Martin

11
Kodun kendisinin bir haiku-w olduğu gönderimler için bonus puanları.
Glorfindel,

Yanıtlar:


25

JavaScript (ES6), 73 72 64 63 54 42 39 bayt

13 bayt kaydettiği için Neil teşekkür

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

açıklama

Bu, bir dizge dizisini argüman olarak alan bir şişman ok işlevidir. Her satırın sözcük sayımıyla değiştirilir. Eğer bir haiku-w ise, aşimdi yine beş, yedi ve beş dizisini içeriyor. JavaScript aynı anda 2 diziyi karşılaştırmamıza izin vermediğinden, dizi önce dizgeye dönüştürülür ve sonra karşılaştırılır. Bu, döndürülen bir boole ile sonuçlanır.


1
%ve *aynı önceliğe sahip, bu yüzden işe yarayabileceğini ()düşünüyorum rağmen , s gerek yok (d*2|5). Ayrıca tek bir kişiden de kurtulabilirsiniz &, ancak bunu kullanarak bile geliştirebileceğinizi düşünüyorum (b...).length==3>b.some(...length-...).
Neil

Parantezle ilgili ipucu için teşekkürler. Ayrıca, yaklaşımımı değiştirdim, bu yüzden açıkça uzunluğunu kontrol etmiyorum.
Luke

1
Ah, bu durumda, hesaplama ile uğraşma, sadece kullan a=>a.map(c=>c.split .length)=='5,7,5'.
Neil

Hehe, haklısın. Bunu düşünmeliydim ...
Luke

Diğer argümanın bir dize olup olmadığına hala +''- ==stringify gerekmiyor .
Neil

12

AWK (GNU Awk), 24, 30, 28, 20 bayt

golfed

517253==$0=q=q NF NR

True için "517253" , False için boş dize çıkar .

Awk'de, sıfır olmayan herhangi bir sayısal değer veya boş olmayan bir dize değeri doğrudur. Başka bir değer (sıfır veya boş dize, "") yanlıştır

GNU Awk Kullanıcı Kılavuzu

Nasıl çalışır

Her awk ifadesi (kuralı) ilişkili eylem içeren bir kalıptan (veya ifadeden) oluşur:

pattern {action}

Awk, giriş satırını satır satır okuyacak (kayıt ile kayıt) ve karşılık gelen bir eylemin başlatılıp başlatılmayacağını görmek için kalıp ifadesini değerlendirecektir.

Yukarıdaki kod {print $0}, bu durumda olduğu belirtilen eylem bloğu olmayan, bağımsız bir Awk ifadesidir (kalıp) .

Sağdan sola okunmalıdır:

q=q NF NR

Ekleme bir N bir toprak rengi F ields (kelime) ve N arasında koyu kahverengi R değişkeni ecords (yani mevcut hat numarası), q .

Bu şekilde, uygun bir Haiku-w'yi işlerken, q şöyle ayarlanacaktır:

  • 51 - satır # 1 (5 kelime)
  • 5172 - 2. satırda (5 kelime + 7 kelime)
  • 517253 - 3. satırda (5 kelime + 7 kelime + 5 kelime)

$0=q

Yeni bilgisayarlı değerini atayın q için $ 0 (varsayılan olarak tüm geçerli satır / kayıt tutan).

517253==$0

Uygun bir Haiku-w (517253) için bir "imza" ile karşılaştırın, bir eşleşme varsa, tüm ifade "true" olarak değerlendirilir ve karşılık gelen bir eylem (örtülü print $0) çalıştırılır, "517253" gönderilir ve stdout (True) Aksi halde çıktı boş olacaktır (Yanlış).

Bunun bir Haiku-w'yi doğru bir şekilde tanıyacağına dikkat edin, bunu rasgele sayıda çöp hattı izlese bile, ancak bunun tamam olduğuna inanıyorum:

Giriş olarak uzunluk-3 karakter dizisi de kabul edilebilir.

(örneğin, girişin 3 satır uzunluğunda olduğunu varsayabiliriz)

Ölçek

>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

Çevrimiçi Deneyin!


2
Bu, giriş 575 kelime içeren bir satır veya 57 ve 5 kelime içeren iki satırdan oluşuyorsa başarısız olur
Lynn

@ Lynn, doğru, bekletilinceye kadar, bu düzeltilinceye kadar.
zeplin

@Lynn, şimdi düzeltilmelidir
zeppelin

1
Çok akıllıca düzeltme! :)
Lynn

9

Python , 42 bayt

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

Çevrimiçi deneyin!

Tek satırlarla ayrılmış sözcüklerle satırların bir listesi olarak girdi alır.

Garantili olduğumuz için baştaki ya da sondaki boşluklar olmayacak ve her bir kelimeyi yalnızca tek boşluklar ayıracak, her satırdaki boşlukları sayarak w-haiku'yu doğrulayabiliyoruz.

Bunu, boşluk sayımlarının bir listesini oluşturmak için bir liste halinde yaparız. Eğer doğru bir haiku ise, benzemeli, bu [4, 6, 4]yüzden bunu bununla karşılaştırıp sonucu döndürelim.


Yalnızca Python 2 destekleme yapmayı kabul ediyorsanız, iki bayt kaydedebilirsiniz: map(str.count,l,' ').
vaultah

8

Jöle , 10 9 bayt

ċ€⁶⁼“¥©¥‘

Çevrimiçi deneyin!

açıklama

ċ€⁶⁼“¥©¥‘  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

Ayrıca ċ€⁶⁼4,6,4ve ċ€⁶⁼464D¤… Yine de daha kısa bir şey bulamıyorum. (Oh, sen de bunu çevirebilirsiniz: 464D⁼ċ€⁶$)
Lynn

ċ€⁶Ḍ=4648 için iyi çalışıyor
Jonathan Allan

Aslında hayır , hayır , üzgünüm.
Jonathan Allan,

7

Toplu iş, 102 bayt

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

Yanlış sayıda sözcük içeren bir satır okur girmez, sıfır olmayan hata seviyesinden çıkar.


1
...... iyi bok
tbodt

7

Mathematica, 21 bayt

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

Adsız işlev, giriş ve döndürme olarak karakter listelerinin bir listesini alarak Trueveya False. Basitçe, her bir karakter listesinde kaç tane boşluk bulunduğunu sayar, bu da meydan okuma kuralları uyarınca her bir satırdaki kelimelerin sayısıyla mükemmel şekilde ilişkilidir.

Önceki gönderi:

Mathematica, 31 bayt

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

Adsız işlev, dizelerin listesini giriş olarak alarak ve döndürerek Trueveya False.


6

Haskell, 34 33 bayt

f l=[sum[1|' '<-c]|c<-l]==[4,6,4]

Çevrimiçi deneyin! .

Düzenleme: bir bayt için @xnor sayesinde!


Pointful kısadır: f l=[sum[1|' '<-c]|c<-l]==[4,6,4].
xnor

6

Retina , 12 bayt

M%` 
^4¶6¶4$

(ilk satırdan sonra arkada boşluk var)

Çevrimiçi deneyin!

  • M%`  - Her satırdaki boşluk sayısını sayın.

    • M - Eşleşme modu - eşleşme sayısını yazdırın.
    • % - her satır için
    • ` - ayrı konfigürasyon ve regex deseni
    • - sadece bir boşluk.
  • ^4¶6¶4$ - 4, 6 ve 4 boşluk ve tam olarak üç satır olmalıdır.

    • yeni satırlarla eşleşir. Gerisi basit bir düzenli ifadedir.

Geçersiz 1, geçerli giriş için yazdırır 0.


4

Python, 58 44 bayt

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

-14 tbodt tarafından


Girdiyi 3 dizi dizge listesi olarak almanıza izin verilir. Kullanarak harcadığınız baytları kaydedebilirsiniz split("\n").
miller

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

Birisi bunu geçmek için daha kısa
Charlie


4

Pyth, 9 bayt

qj464T/R;

Bir listenin girişini alan "quoted strings"ve yazdırır Trueveya Falseuygun bir program.

Test odası

Nasıl çalışır

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 bayt

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

Çevrimiçi deneyin!

açıklama

Girdiyi yeni satır ayrılmış bir dize olarak alır.

Tüm beyaz olmayan alanları kaldırır, ardından "4 boşluk, yeni satır, 6 boşluk, yeni satır, 4 satır yeni satır" ile tam olarak eşleşip eşleşmediğini kontrol eder.

Yakalama grubu 4 boşlukla eşleşir, geri \1referans buna karşılık gelir. Yeni satırlar dizeye gömülüdür. Regex'in ikinci satırının geri referanstan sonra iki boşluk içerdiğine dikkat edin.


1
Bu ilginç bir yaklaşım!
Ismael Miguel

4

Pyke, 11 9 bayt

dL/uq

Burada dene!

dL/       -  map(i.count(" "), input)
        q - ^ == V
   u  -  [4, 6, 4]

uBayttan sonra aşağıdaki baytlar vardır:0x03 0x04 0x06 0x04


3

J, 12 bayt

4 6 4=#@;:@>

Giriş, kutulu bir dizeler listesidir.

açıklama

Bu sürekli sol çatallı bir çatal. Bu #@;:@>, eşit diş için doğru dişin sonucunu kontrol eder 4 6 4. Doğru zaman >, her bir ( ), ardından ( @) kutularını her dizeyi kelimeye dönüştürür ( ;:), ardından ( @) her birinin ( #) uzunluğunu alır .


3

R, 48 bayt

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

Stdin'den 3 uzunlukta bir karakter vektörü okur ve boşluk sayısını sayarak çalışır. Boşluk sayısını saymak için kullandığımız str_countgelen stringrregex deseni dayalı olaylar güvenebilirsiniz paketinin.

Paket kullanmadan alternatif bir yaklaşım olabilir:

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

Daha önce ilk gördüğümde el, bunun için teşekkürler.
BLT

3

C 142 bayt

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

Ungolfed versiyonu:

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 dizisi için 0 döndürür 1.

Olumlu bir test çantası:

görüntü tanımını buraya girin


3

C ++, 357 bayt

Golf kodlamak için yeni bir tür, ancak hızlıca yapabileceğim en iyisi

#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'ye Hoşgeldiniz! Kod golfünün amacı, kodunuzu olabildiğince kısa yapmak; Gereksiz tüm boşlukları kaldırmak iyi bir ilk adım olacaktır.
ETHProductions

3

Ruby 1.9.3

Golf değil, ama kendisi bir haiku-w

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

veya...

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

Maalesef, herhangi bir satırda lider boşluk ile çalışmaz, ancak izlerle baş eder.


2

Python 2 , 57 64 bayt

Düzenle @Dada'dan gelen geri bildirimlerden sonra 7 bayt eklenerek düzeltildi. Teşekkürler!

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

Çevrimiçi deneyin!

En kısa Python uzun bir yoldan cevap vermiyor, ancak son zamanlarda input()çıktısını görüntülemek ve bir printifade kaydetmek için kullandığım yeni numarayı kullanmak istedim . Giriş olarak satırların bir listesini alır. Programı (istisna dışında) bir terminalde sonlandırmak için Ctrl C (veya bu konuda herhangi bir tuşa basılması) gerekir, ancak TIO'suz çalışır.


4
Bu gibi durumlarda başarısız olur bu bir .
Dada

Sana bunu @Dada olarak vereceğim. Bu ciddi bir test durumudur :)
ElPedro

Test durumunuzla düzeltildi ve test edildi.
ElPedro,

2

MATL, 16 bayt

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

Giriş bir hücre dizesi dizisidir ve bir truthy veya falsey dizisi döndürür .

Çevrimiçi Deneyin

açıklama

        % 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 / Octave, 38 bayt

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

Bu çözüm bir hücre dizge dizisini girdi olarak kabul eder, her satırdaki boşluk sayısını sayar ve sonucu diziyle karşılaştırır [4 6 4]ve bir truthy (tüm değerler 1'dir) veya falsey (herhangi bir değer sıfırdır) dizisi verir.

Çevrimiçi demo



2

Clojure, 44 bayt

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

Giriş, dizelerin listesidir. İşlev yalnızca boşluk bulur ve bunları sayar. Bu açıklama bir Haiku. :)


2

Java 7, 154 bayt

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

Program gereksinimi ve üç çizgiden daha az veya daha fazla olması, Java'nın ayrıntılarından bahsetmeksizin, bu 'golf' kodunun oldukça büyük olmasına neden olur.

Ungolfed:

Burada dene.

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 bayt

Ne yazık ki, düzenli ifade yaklaşımı en kısa olanıdır.

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

Metnin ilk argüman olarak * NIX stili yeni satırlarla verilmesini gerektirir. Bu Windows tarzı yeni satırlarla çalışmaz.

Ungolfed:

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

Regex olmayan, 114 bayt

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

Bu, her satıra işleve argüman olarak verilmesini gerektirir.

Ungolfed:

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

Yığılmış, 22 bayt

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

Yığını tepesinden, karakter dizelerinin bir listesi olarak alır;

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

açıklama

[' '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 bayt

@ Corvus_192 sayesinde -2 bayt!

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

Çevrimiçi deneyin!

O kadar golf görünüyor ama yerleşik bir harita işlevi olmadan, iyi bir yol bulamıyorum. Diziyi yinelemek, akışları kullanarak bir harita işlevi yazmak gibi, birkaç byte uzundur.

Lambda ifadesi bir dizi dizge alır ve bir Boole döndürür.


Girdi olarak sadece iki satırınız varsa veya dört tane varsa?
Kevin Cruijssen

@KevinCruijssen, "Girdi olarak bir uzunluk-3 dizi listesi de kabul edilebilir" dir. Programım 3 satırlık bir liste alıyor.
Pavel

Eğer Arrays.streamArrays
çağırırsanız

@ Pokechu22 evet bunu denedim, yine de daha uzun sürdü.
Pavel

İki bayt kaydetmek &yerine kullanabilirsiniz&&
corvus_192

2

SmileBASIC, 96 94 bayt

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 bayt

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

Bir argüman olarak uzunluk-3 dizge listesi alır. Muhtemelen daha fazla golf oynamak mümkün değildir, çünkü daha fazla golf oynamak onu @ Billywob'un cevabına çevirir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.