숫자 하이쿠인가요?
우리는 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
답변
Retina 0.8.2 , 25 바이트
0|7
_#
^.{5}\w.{6}\w.{4}$
온라인으로 시도하십시오! 링크에는 테스트 케이스가 포함됩니다. 설명:
0|7
_#
확장 0과 7두 음절로.
^.{5}\w.{6}\w.{4}$
6 음절과 13 음절이 두 번째 음절이 아닌지 확인하십시오.
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\$ 다음에 발생하는 모든 일이 정수가 아닌 값으로 유지됩니다.
J , 32 30 바이트
4=5 12 17+/@e.~[:+/\0,~1+0=7|]
-2 xash 덕분에
온라인으로 시도하십시오!
원래 설명
[:(5&e.*12&e.*17={:)[:+/\1+0=7|]
온라인으로 시도하십시오!
똑바로:
- 숫자 목록 가져 오기
7|]모드 70=0과 같음 (1-0 목록 반환)1+추가 1 (현재 1-2 목록)[:+/\스캔 합계[:(5&e.*12&e.*17={:)5는 느릅 나무이고 12는 느릅 나무이고 17은 마지막입니까?
젤리 , 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 바이트
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
온라인으로 시도하십시오!
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
온라인으로 시도하십시오!
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 음절 패턴이 있는지 테스트합니다.
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\$ 그렇지 않으면.
차콜 , 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).
Perl 5 ( -p), 38 , 34 바이트
s/0|7/ /g;$_=/^.{5}\V.{5}\H.{5}$/
온라인으로 시도하십시오!
PowerShell Core , 60 바이트
5-in($l=$args|%{($s+=1+($_-in48,55))})-and12-in$l-and$s-eq17
mazzy 덕분에 -42 바이트
온라인으로 시도하십시오!
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
온라인으로 시도하십시오!
가장 먼저 할 일은 입력을 일종의 음절 맵으로 변환하는 것입니다. 이것은 다음과 같은 의미를 가진 각 음절에 대해 하나씩 정수 목록입니다.
- 단어의 두 번째 음절
- 단어의 첫 음절
그래서 이것으로 우리는 길이가 17인지, 즉 모두 17 음절이 있는지 확인합니다. 그런 다음 두 번째와 세 번째 줄의 시작 부분에서 음절 코드를 색인화합니다. 우리는 이것들을 함께 곱합니다. 둘 중 하나가 단어의 두 번째 음절이면 0 곱하기 모든 숫자가 0이기 때문에이 제품은 0입니다. 그리고 둘 다 1이면 0이 아닙니다. 그래서 우리는 이것이 0이 아닌지 확인합니다. 즉, 단어의 두 번째 음절로 시작하는 줄이 없습니다.
그리고 그게 다야.
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)
자바 스크립트, 53 바이트
BigInt 입력.
n=>!(f=s=>n?f(s-=n%10n%7n?1:s%7-6?2:18,n/=10n):s)(17)
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
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;}
온라인으로 시도하십시오!
K (oK) , 31 바이트
{&/(17=*|o),5 12 in o:+\1+~7!x}
온라인으로 시도하십시오!
@jonah의 J대답을 간단하게 번역했습니다 .