숫자 하이쿠인가요?

Oct 19 2020

우리는 13576870234289영어로 자릿수를 읽을 수 있으며 하이쿠를 만듭니다.

하나 셋 다섯 일곱
여섯 여덟 일곱 제로 둘
셋 넷 둘 여덟 아홉

우리는이처럼 읽을 때, 그것은 5 + 7 + 5 음절 길이의, 있기 때문에,에 "자리 하이쿠"말할 와 어떤 단어가 라인을 통해 파괴되지 않는다.

예를 들어, 111171111101111은 17 음절이지만 숫자 하이쿠 가 아닙니다 .

하나 하나 하나 하나 SE-
-ven 하나 하나 하나 하나 하나 ze-
-ro 하나씩 하나씩

2 음절 숫자 ( 0"0"및 7"7")는 5 ~ 6 음절 위치 또는 12 ~ 13 음절 위치를 포함 할 수 없습니다. (그 이외의 17 음절 숫자 문자열은 숫자 하이쿠를 만듭니다.)

0과 7 옆의 다른 모든 숫자는 영어로 한 음절입니다.

직무

비어 있지 않은 숫자의 문자열 (또는 번호 목록)을 감안할 0를 통해를 9,이 숫자 하이쿠를 형성 여부를 결정합니다.

  • 문자열이로 시작하지 않는다고 가정 할 수 0있으므로 숫자로 입력 할 수도 있습니다.

  • 입력 길이는 최대 17 자리라고 가정 할 수 있습니다. 그러나 17 음절 이상일 수 있습니다 .

  • 이것은 code-golf입니다 . 바이트 단위로 측정되는 가장 짧은 답변을 작성하는 것을 목표로합니다.

테스트 케이스

7767677677 -> True
13576870234289 -> True
123456789012345 -> True
11111111111111111 -> True
9 -> False
9876543210 -> False
11171111101111 -> False
111171111101111 -> False
998765432101234 -> False
77777777777777777 -> False

답변

8 Neil Oct 19 2020 at 23:35

Retina 0.8.2 , 25 바이트

0|7
_#
^.{5}\w.{6}\w.{4}$

온라인으로 시도하십시오! 링크에는 테스트 케이스가 포함됩니다. 설명:

0|7
_#

확장 0과 7두 음절로.

^.{5}\w.{6}\w.{4}$

6 음절과 13 음절이 두 번째 음절이 아닌지 확인하십시오.

7 Arnauld Oct 20 2020 at 07:18

JavaScript (ES6),  48  41 바이트

숫자 목록이 필요합니다. 부울 값을 반환합니다.

a=>a.map(d=>i-=d%7?1:i%7-6?2:.1,i=17)&&!i

온라인으로 시도하십시오!

어떻게?

우리는 음절 카운터를 사용 \$i\$\ (으)로 초기화 됨$17\$, \$1\$또는 \$2\$에서 \$i\$각 숫자 다음에 \로 끝나는 지 확인하십시오.$i=0\$. 하이쿠는 다음과 같이 보입니다.

17 16 15 14 13 
12 11 10 09 08 07 06 
05 04 03 02 01

숫자가 \$0\$또는 \$7\$및 \$i\equiv 6\pmod 7\$, 잘못된 하이픈이 있으며 \$1/10\$에서 \$i\$\ 대신$2\$. 이 테스트는 한 번만 실행할 수 있으므로 \$i\$ 다음에 발생하는 모든 일이 정수가 아닌 값으로 유지됩니다.

7 Jonah Oct 20 2020 at 01:24

J , 32 30 바이트

4=5 12 17+/@e.~[:+/\0,~1+0=7|]

-2 xash 덕분에

온라인으로 시도하십시오!

원래 설명

[:(5&e.*12&e.*17={:)[:+/\1+0=7|]

온라인으로 시도하십시오!

똑바로:

  • 숫자 목록 가져 오기
  • 7|] 모드 7
  • 0= 0과 같음 (1-0 목록 반환)
  • 1+ 추가 1 (현재 1-2 목록)
  • [:+/\ 스캔 합계
  • [:(5&e.*12&e.*17={:) 5는 느릅 나무이고 12는 느릅 나무이고 17은 마지막입니까?
6 HyperNeutrino Oct 20 2020 at 01:26

젤리 , 11 바이트

7ḍ‘ŒṖ§Ḍ575e

온라인으로 시도하십시오!

설명

7ḍ‘ŒṖ§Ḍ575e  Main Link
// convert to syllables
7ḍ           Divisibility by 7 (1 for 0 and 7, 0 otherwise)
  ‘          Increment (2 for 0 and 7, 1 otherwise; this gives the syllables)
// all ways to divide the digits into lines, and total syllable counts
   ŒṖ        Partitions (all divisions of a list)
     §       Sum each sublist for each partition
// check if any of them are [5, 7, 5]
      Ḍ      Convert the lines' syllable sizes into a decimal integer; this can cause collisions but not if the total number of syllables is maximum 34
       575e  Is 5-7-5 a possible partition?

일부 테스트 케이스에서 시간이 오래 걸리므로 포함하지 않았습니다.

-Jonathan Allan 덕분에 1 바이트

4 xnor Oct 20 2020 at 01:57

Python 2 , 53 바이트

t=17
for d in input():t-=0<d%7or 2+t%7/6*t
print t==0

온라인으로 시도하십시오!

Arnauld의 솔루션을 기반으로 합니다 . True/False어떤 결정 문제 출력이 허용 되는지 확실하지 않기 때문에 여기와 아래 답변에서 출력을 사용 합니다 .

55 바이트

t=4
for d in input():t-=1+~d%7/6+t%47/46*40
print-t==93

온라인으로 시도하십시오!

58 바이트

t=1
for d in input():t=t<<1+~d%7/6|1
print-3967&t>>5==4225

온라인으로 시도하십시오!

58 바이트

s=t=0
for d in input():s+=1+~d%7/6;t+=s%7==5
print s*t==34

온라인으로 시도하십시오!

4 DominicvanEssen Oct 20 2020 at 11:56

R , 72 66 65 63 바이트

편집 : Robin Ryder 덕분에 -6 바이트, Giuseppe 덕분에 -2 바이트

max(s<-cumsum(1+!utf8ToInt(scan(,''))%%7-6))==17&5%in%s&12%in%s

온라인으로 시도하십시오!

4 tsh Oct 20 2020 at 02:35

JavaScript (Node.js) , 46 바이트

s=>/^.{9},.{13},.{9}$/.test(s.map(c=>c%7||.1))

온라인으로 시도하십시오!

숫자 배열로 입력을받습니다. 진실과 거짓을 출력합니다.

  • s.map(c=>c%7||.1)각 숫자를 숫자에 매핑합니다. 2 음절이있는 숫자 0 또는 7은 매핑되고 0.1나머지는 1 자리 숫자로 매핑됩니다.
  • RegExp.prototype.test매개 변수를 string. 매핑 결과는 배열입니다. 배열을 문자열로 변환하려고하면 각 요소가 문자열로 변환되고 쉼표 ( ,) 로 연결됩니다 . 따라서 기본적으로 문자열의 각 숫자는 1 음절입니다. 그리고 테마 사이의 쉼표는 여기서 줄을 끊을 수 있음을 의미하고 점은 여기서 줄을 끊을 수 없음을 의미합니다.
  • 마지막으로 /^.{9},.{13},.{9}$/문자열에 5-7-5 음절 패턴이 있는지 테스트합니다.
4 Noodle9 Oct 20 2020 at 02:29

C (gcc) , 96 \$\cdots\$ 92 91 바이트

HyperNeutrino가 친절하게 지적한 버그를 수정하기 위해 14 바이트를 추가 했습니다 . rtpax
덕분에 2 바이트 절약 !!! Ceilingcat
덕분에 바이트를 절약했습니다 !!!

p;h;s;c;f(long n){for(h=5,p=s=c=0;n;c=c/h?p|=c!=h,h^=2,!++s:c,n/=10)c+=n%10%7?1:2;h=p|s<3;}

온라인으로 시도하십시오!

반환 \$0\$입력 정수가 숫자 하이쿠 또는 \$1\$ 그렇지 않으면.

3 Neil Oct 19 2020 at 23:53

차콜 , 25 바이트

≔⭆S∨﹪Iι⁷χθ›⁼¹⁷Lθ№﹪⌕Aθ0⁷¦⁵

온라인으로 시도하십시오! 링크는 자세한 코드 버전입니다. -하이쿠에 대한 Charcoal 부울을 출력합니다 . 그렇지 않으면 아무것도 출력 하지 않습니다. 내 망막 대답 같은 작품, 그것이 바꾸는를 제외시켰다 0과 7함께 10하고 6도 13 음절도이 검사 0. 설명:

≔⭆S∨﹪Iι⁷χθ

모듈로 7의 모든 자릿수를 줄인 다음 모든 0s를 로 변경 하여 두 번째 음절 10을 0나타냅니다.

›⁼¹⁷Lθ

17 음절이 있는지 확인하세요.

№﹪⌕Aθ0⁷¦⁵

두 번째 음절은 5와 동일한 위치에 있습니다 (모듈로 7).

3 NahuelFouilleul Oct 20 2020 at 09:51

Perl 5 ( -p), 38 , 34 바이트

s/0|7/ /g;$_=/^.{5}\V.{5}\H.{5}$/

온라인으로 시도하십시오!

2 Julian Oct 20 2020 at 04:22

PowerShell Core , 60 바이트

5-in($l=$args|%{($s+=1+($_-in48,55))})-and12-in$l-and$s-eq17

mazzy 덕분에 -42 바이트

온라인으로 시도하십시오!

2 WheatWizard Oct 24 2020 at 22:27

Haskell , 62 58 56 바이트

이것을 줄이는 데 도움을 주신 ovs 에게 감사드립니다.

g q|r<-do x<-q;1:[0|7*x==x*x]=length r==17&&r!!5*r!!12>0

온라인으로 시도하십시오!

가장 먼저 할 일은 입력을 일종의 음절 맵으로 변환하는 것입니다. 이것은 다음과 같은 의미를 가진 각 음절에 대해 하나씩 정수 목록입니다.

  1. 단어의 두 번째 음절
  2. 단어의 첫 음절

그래서 이것으로 우리는 길이가 17인지, 즉 모두 17 음절이 있는지 확인합니다. 그런 다음 두 번째와 세 번째 줄의 시작 부분에서 음절 코드를 색인화합니다. 우리는 이것들을 함께 곱합니다. 둘 중 하나가 단어의 두 번째 음절이면 0 곱하기 모든 숫자가 0이기 때문에이 제품은 0입니다. 그리고 둘 다 1이면 0이 아닙니다. 그래서 우리는 이것이 0이 아닌지 확인합니다. 즉, 단어의 두 번째 음절로 시작하는 줄이 없습니다.

그리고 그게 다야.

1 KevinCruijssen Oct 20 2020 at 07:25

05AB1E , 12 바이트

7Ö>.œO575S.å

숫자 목록으로 입력합니다.

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

7Ö            # Check for each digit of the (implicit) input-list whether it's divisible
              # by 7
  >           # Increase these checks by 1 (2 for 0 and 7; 1 otherwise)
   .œ         # Check all partitions of this list
     O        # Sum each inner-most list
      575S    # Push [5,7,5]
          .å  # Check that this list is in the list of lists
              # (after which the result is output implicitly)
1 Ry- Oct 20 2020 at 07:42

자바 스크립트, 53 바이트

BigInt 입력.

n=>!(f=s=>n?f(s-=n%10n%7n?1:s%7-6?2:18,n/=10n):s)(17)
1 DominicvanEssen Oct 20 2020 at 14:35

Husk , 22 바이트

§&o=17→§&€5€12∫mȯ→¬%7d

온라인으로 시도하십시오!

내 R 대답의 포트는 아마도 Husk 에서 가장 골퍼 접근이 아닐 것입니다 ...

§&o=17→§&€5€12∫mȯ→¬%7d
§&                      # fork &: are both of the following true?
  o=17→                 # last element equals 17?
       §&               # fork &: are both of the following true?
         €5             # contains 5?
           €12          # contains 12?
                        # ...when applied to:
              ∫         # cumulative sum of
               m     d  # this function applied to digits of input:
                ȯ       # combine 3 functions:
                   %7   # MOD 7
                  ¬     # NOT
                 →      # +1
1 ErikF Oct 24 2020 at 03:47

C (gcc) , 70 67 바이트

-3에 대한 ceilingcat 덕분입니다.

0유효한 하이쿠이면 반환 하고 그렇지 않으면 0이 아닙니다.

음절 개수는 1 또는 2만큼만 증가 할 수 있으므로 5, 12 및 16보다 큰 값을 확인하고 해당 값을 볼 때 상태를 증가시킵니다 (이는 17을지나 계속되는 것을 제외하고 유효한 문자열도 고려합니다.) If 상태는 입력이 끝날 때 3에서 끝나고 맞습니다.

c,d;f(char*s){for(c=d=0;*s;d+=c==5|c==12|c>16)c-=~!(~*s++%7);d-=3;}

온라인으로 시도하십시오!

1 coltim Oct 26 2020 at 23:02

K (oK) , 31 바이트

{&/(17=*|o),5 12 in o:+\1+~7!x}

온라인으로 시도하십시오!

@jonah의 J대답을 간단하게 번역했습니다 .