무한대 단어를 찾아라!


36

(참고 : 이것은 이전 도전 과제의 분사입니다 . 소용돌이 치는 단어를 찾으십시오! )

무한대 단어의 정의 :

  1. 알파벳 (AZ)에서 무한대 단어 의 모든 문자를 곡선으로 연결 하면 아래 다이어그램과 같이 무한대 기호 ∞가 표시됩니다.
  2. 모든 짝수 연결이 작동 중지 되어야 하고 모든 홀수 연결이 작동해야 합니다 .
  3. 대문자 / 소문자를 무시하거나 모두 대문자 또는 모두 소문자로 간주 / 변환 할 수 있습니다.
  4. 입력 단어는 AZ의 알파벳 범위에있는 문자, 공백, 문장 부호 또는 기호가 아닙니다.
  5. 각 단어는 정확히 5 자 여야합니다. > 5 또는 <5 단어는 유효하지 않습니다.
  6. 단어에 연속 된 두 문자가 있으면 "FLOOD"또는 "QUEEN"과 같이 해당 단어가 유효하지 않습니다.
  7. 모든 무한대 단어 는 같은 문자로 시작하고 끝납니다.

몇 가지 예가 있습니다 :

무한대 단어

태스크:

표준 입력에서 단어를 가져 와서 무한대 단어 인지 여부를 출력하는 전체 프로그램 또는 함수를 작성하십시오 . 출력은 true / false, 1/0, 1 / Null 등이 될 수 있습니다.

테스트 사례 :

Infinity Words:
ALPHA, EAGLE, HARSH, NINON, PINUP, RULER, THEFT, WIDOW

NOT Infinity Words:
CUBIC, ERASE, FLUFF, LABEL, MODEM, RADAR, RIVER, SWISS, TRUST, 
KNEES, QUEEN, GROOVE, ONLY, CHARACTER, OFF, IT, ORTHO

규칙 :

  1. 가장 짧은 코드가 승리합니다.

선택적 작업 :

영어 사전에서 가능한 한 많은 무한대 단어 를 목록으로 찾으십시오 . 당신은 참조로 예를 들면 영어 단어의 전체 목록을 취할 수 있습니다 여기에 .


입력 길이가 항상 5라고 가정 할 수 있습니까? 규칙 5를 정의했습니다. " 각 단어는 정확히 5 자 여야합니다. 단어> 5 또는 <5는 유효하지 않습니다. ", NOT NOT 무한대 단어 는 5 자 이하로 포함됩니다.
Kevin Cruijssen

4
ALPHA 가 그 패턴을 만드는 것은 매우 재미있다
13:49에

@KevinCruijssen 당신은 단어가 정의를 존중하는지 확인해야합니다, 나는 잘못된 경우를 업데이트했습니다.
Mario

1
@Arnauld 5 "A"는 하나의 점을 만들어 자신과 연결되거나 전혀 움직이지 않습니다. 무한대 기호를 그리지 않으므로 긍정적 인 사례라고 생각하지 않습니다.
Mario

3
나는 선택 작업을 해결하기로 결정했습니다 : "당신이 할 수있는 영어 사전에 많은 무한대 단어로, 목록으로 찾기 ..."나는 사용 이 소스케빈 Cruijssen의 답변을 생산, 278 개 무한 단어의 목록을 .
토마스 퀸 켈리

답변:


19

젤리 , 43 41 40 25 24 23 22 21 14 13 바이트

fireflame241 덕분에 -7 바이트 ( 0ị=1ị$-> =ṚḢIIA⁼2,24 회전 테스트에 사용 )

-1 Kevin Cruijssen 덕분에 (이전에 사용할 수 없었던 nilad Ø2를 사용하여 [2,2])

=ṚḢȧOIṠIIA⁼Ø2

TryItOnline
또는 모든 테스트 사례 (및 "RULES")

어떻게?

무한 단어는 다음과 같습니다.

  1. 첫 글자와 마지막 글자;
  2. 길이 5;
  3. 서로 옆에 같은 글자가 없습니다.
  4. 4 개의 알파벳 델타의 합은 0과 같습니다.
  5. 4 개의 알파벳 델타 부호의 합은 0과 같습니다.
  6. 두 개의 양의 알파벳 델타 또는 두 개의 음의 알파벳 델타가 연속으로 나타납니다.

(1)과 (동등하게) (4)를 제외한 모든 문자는 알파벳 델타 부호가 [1,1,-1,-1](의 부호 00)

fireflame241은 이것이 알파벳 델타 부호의 델타 델타와 [[2,2],[2,-2],[-2,2],[-2,-2]]동일하며 절대 값이 같은 값으로 테스트 될 수 있음을 지적했다 [2,2].

어떻게?

=ṚḢȧOIṠIIA⁼Ø2 - Main link: word
 Ṛ            - reverse word
=             - equals? (vectorises)
  Ḣ           - head (is the first character equal to the last?)
   ȧ          - and
    O         - cast word to ordinals
     I        - increments - the alphabet deltas (or just [] if 1st != last)
      Ṡ       - sign (vectorises)
       I      - increments - deltas of those signs
        I     - increments - deltas of those
         A    - absolute value (vectorises)
           Ø2 - literal [2,2]
          ⁼   - equals? (non-vectorising version)

어떻게 작동합니까?
Oliver Ni

들어오는 설명.
Jonathan Allan

2
@PascalvKooten 그것은 대부분 재미를 위해, 그리고 코드 골프에서 경쟁적입니다. 저는 코드 골프와 젤리 모두에 대해 매우 새롭기 때문에 젤리 프로그램을 구성하는 것은 거의 매번 작은 퍼즐과 같습니다. 만족 스럽습니다. 만약이 게임에서 실체적인 것을 얻고 자한다면 실세계에서 더 일반적으로 사용되는 언어로 자신의 기술을 연마하거나 물론, 자신 만의 골프 언어를 만들어야합니다!
Jonathan Allan

1
@ lois6b :). 당신은 시작 자습서 다음으로 페이지 사용 아톰 정의 , Quicks 정의 하고, 검색 소스 코드를 .
Jonathan Allan

1
14 바이트 여기에서 메인 골프 II는 1,1, -1, -1의 회전과 같은지 점검하는 데 사용 합니다.
fireflame241 '

11

자바 (8) 231 193 185 122 103 78 바이트

s->s.length==5&&(s[1]-s[0])*(s[3]-s[2])<0&(s[2]-s[1])*(s[4]-s[3])<0&s[4]==s[0]

여기에서 시도하십시오.

대신 사용하도록 상기시켜 준 @ dpa97 덕분에 -38 바이트 . @KarlNapf 의 파생 공식 덕분에 -63 바이트 . -7 바이트를 Java 7에서 Java 8로 변환하여 정수 대신 부울을 리턴합니다.char[]String

193 바이트 답변 :

int c(char[]s){if(s.length!=5)return 0;int a=s[0],b=s[1],c=s[2],d=s[3],e=s[4],z=b-a,y=c-b,x=d-c,w=e-d;return e!=a?0:(z>0&y>0&x<0&w<0)|(z<0&y>0&x>0&w<0)|(z>0&y<0&x<0&w>0)|(z<0&y<0&x>0&w>0)?1:0;}

설명:

  • 문자열의 길이가 5가 아닌 경우 false
  • 첫 번째 문자가 마지막 문자와 같지 않으면 false
  • 그런 다음 유효한 4 가지 사례를 하나씩 확인하고 (5 개 문자를 1 ~ 5로 표시), true해당하는 경우 (또는 false그렇지 않은 경우)를 반환합니다.
    1. 다섯 개 문자를 같이 배포하는 경우 : 1<2<3>4>5(예 ALPHA)
    2. 다섯 개 문자를 같이 배포하는 경우 : 1>2<3<4>5(예 : EAGLE, HARSH, NINON, PINUP)
    3. 다섯 개 문자를 같이 배포하는 경우 : 1<2>3>4<5(예 RULER)
    4. 다섯 개 개의 문자가 같은 분산 경우 1>2>3<4<5(즉 THEFT, WIDOW)

이 네 가지 규칙을 단순화 할 수 있습니다 1*3<0 and 2*4<0( @KarlNapf 의 Python 2 answer 덕분에 ).


2
설명 할 수없는 다운 보트를 보상하기 위해 +1 ... 내가 알 수있는 한, 이것은 완벽하게 기능적인 솔루션입니다.
Arnauld

1
s를 char [] char [] c = s.toCharArray (); int z = c [1] -c [0], y = c [2] -c [1]로 변환하여 215로 줄였습니다. ..
dpa97

@ dpa97 알림 char[]대신에 입력 으로 사용하도록 알림을 보내 주셔서 감사합니다 String. -38 바이트 덕분입니다.
Kevin Cruijssen

1
귀하의 논리 값을 최적화 할 수 있습니다 z,xw,y교류 기호가 있어야합니다, 그래서 그것을 확인하기에 충분 z*x<0하고w*y<0
칼 Napf

@KarlNapf 아, 몇 시간 전에 귀하의 의견을 잘못 해석했습니다. 무려 -63 바이트에 대한 파생 수식을 구현했습니다. :) 감사.
Kevin Cruijssen

4

자바 스크립트 (ES6), 91 89 87 바이트

Ismael Miguel 덕분에 2 바이트 절약

s=>(k=0,[...s].reduce((p,c,i)=>(k+=p>c?1<<i:0/(p<c),c)),k?!(k%3)&&!s[5]&&s[0]==s[4]:!1)

작동 원리

k문자열의 5 개 문자 사이에서 4 개의 전환을 나타내는 4 비트 비트 마스크를 만듭니다 .

k += p > c ? 1<<i : 0 / (p < c)
  • 이전 문자가 다음 문자보다 높으면 비트가 설정됩니다
  • 이전 문자가 다음 문자보다 낮 으면 비트가 설정되지 않습니다
  • 이전 문자가 다음 문자와 동일하면 전체 비트 마스크가 강제로 NaN단어가 거부됩니다 (규칙 # 6 준수).

유효한 비트 마스크는 정확히 두 개의 연속 1전환 이있는 마스크입니다 (첫 번째 및 마지막 비트도 연속적인 것으로 간주 됨 ).

Binary | Decimal
-------+--------
0011   | 3
0110   | 6
1100   | 12
1001   | 9

다시 말해 다음과 같은 조합입니다.

  • k? : 0보다 큼
  • !(k%3): 0 모듈로 3에 합치
  • 15 이하

다른 조건은 다음과 같습니다.

  • !s[5] : 5 자 이하 여야합니다
  • s[0]==s[4] : 첫 번째와 다섯 번째 문자가 동일

주의 : 우리는 k != 15그러한 패턴을 따르는 단어는이 마지막 조건에 의해 거부되기 때문에 명시 적으로 확인하지 않습니다 .

테스트 사례

초기 버전

레코드의 초기 버전은 63 바이트였습니다. 모든 테스트 사례를 성공적으로 통과했지만 연속적인 동일한 문자를 감지하지 못합니다.

([a,b,c,d,e,f])=>!f&&a==e&&!(((a>b)+2*(b>c)+4*(c>d)+8*(d>e))%3)

다음은 의견에서 Neil이 제안한 53 바이트 버전으로, 동일하게 작동하며 실패합니다.

([a,b,c,d,e,f])=>!f&&a==e&&!((a>b)-(b>c)+(c>d)-(d>e))

편집 : 위 코드의 수정 / 완료 버전은 Neil의 답변 을 참조하십시오 .


0000또한 0 modulo 3과 일치하지만 다시 첫 번째와 마지막 문자를 동일하게 가질 수 없으므로 15와 같이 명시 적으로 테스트 할 필요가 없습니다.
Neil

초기 버전의 경우 사용할 수 !((a>b)-(b>c)+(c>d)-(d>e))있습니까?
Neil

p<c?0:NaN로 쓰면 0/(p<c)2 바이트가 절약됩니다.
Ismael Miguel

@Neil 0에 대한 테스트와 관련하여 완벽하게 맞습니다. (그러나 k?가능한 가능성 때문에 테스트 가 필요 합니다 NaN.) 대체 버전과 관련하여 실제로 작동합니다.
Arnauld

@IsmaelMiguel-좋은 전화! 감사.
Arnauld

4

자바 스크립트 (ES6), 78 바이트

([a,b,c,d,e,f])=>a==e&&!(f||/(.)\1/.test(a+b+c+d+e)||(a>b)-(b>c)+(c>d)-(d>e))

@Arnauld의 잘못된 코드를 기반으로하지만 골프를 치고 수정했습니다. 첫 번째 문자가 다섯 번째 문자와 동일하고 (5 자 보장) 문자열 길이가 5자를 넘지 않는지 먼저 확인하여 작동합니다. 연속적인 중복 문자를 확인한 후에는 문자열의 물결 모양을 확인합니다. 여기에는 1 개의 피크와 1 개의 2 개의 문자가 있어야합니다.

  • 피크와 최저점이 중간 및 첫 / 마지막 문자이면 처음 두 비교와 마지막 두 비교가 취소됩니다.
  • 최고점과 최저점이 두 번째와 네 번째 문자이면 중간 두 비교와 외부 두 비교는 취소됩니다.
  • 그렇지 않으면, 무언가가 취소되지 않고 전체 표현식이 false를 리턴합니다.

편집 : @ KarlNapf의 답변을 기반으로 한 대체 78 바이트 솔루션 :

([a,b,c,d,e,f],g=(a,b)=>(a<b)-(a>b))=>a==e&&!f&&g(a,b)*g(c,d)+g(b,c)*g(d,e)<-1

3

Python 2 종료 코드, 56 바이트

s=input()
v,w,x,y,z=map(cmp,s,s[1:]+s[0])
v*x+w*y|z>-2>_

종료 코드를 통한 출력 : False의 오류, True의 성공적인 실행

문자열 s을 문자 abcde로 가져 와서로 회전하고 bcdea해당 문자를 요소별로 비교 한 다음 5 개의 변수에 지정합니다 v,w,x,y,z. 길이가 잘못되면 오류가 발생합니다.

무한 단어는 모두

v*x == -1
w*y == -1
z == 0

로 같이 확인할 수 있습니다 v*x+w*y|z == -2. 이 경우 체인 비교는 v*x+w*y|z>-2>_단락되고 그렇지 않으면 -2>_이름 오류가 발생하는 평가 를 계속합니다.


아, 조건부 골프를 더 잘 했어요!
Karl Napf

3

파이썬 2, 110 87 60 바이트

Neil 덕분에 1 바이트 절약

따옴표로 묶은 입력이 필요합니다. 예 : 'KNEES'

True무한 단어 인 False경우 길이가 5이고 길이가 잘못된 경우 오류 메시지를 인쇄합니다.

s=input()
a,b,c,d,e=map(cmp,s,s[1:]+s[0])
print a*c+b*d|e<-1

xnor 의 답변을 사용하여 영감을 얻었습니다.map(cmp...

s=input()
e=map(cmp,s,s[1:]+s[0])
print e[4]==0and e[0]*e[2]+e[1]*e[3]==-2and 5==len(s)

이전 솔루션 :

s=input()
d=[ord(x)-ord(y)for x,y in zip(s,s[1:])]
print s[0]==s[4]and d[0]*d[2]<0and d[1]*d[3]<0and 4==len(d)

Kevin Cruijssen 의 최적화 된 로직 사용


왜 안돼 a*c+b*d+2==0==e?
Neil

@Neil 예. 왜 그렇지는 않지만 xnor 's a*c+b*d|e는 더 짧습니다.
Karl Napf

내 생각 <-1모두 있기 때문에, 힘의 작업 -2|1-2|-1동일 -1.
Neil

2

PHP, 102 바이트

for(;$i<strlen($w=$argv[1]);)$s.=($w[$i++]<=>$w[$i])+1;echo preg_match("#^(2200|0022|2002|0220)#",$s);

2

파이썬 2, 71 바이트

lambda s:map(cmp,s,s[1:]+s[0])in[[m,n,-m,-n,0]for m in-1,1for n in-1,1]

strings swith characters abcde를 사용하여로 회전하고 bcdea해당 문자를 요소 단위로 비교합니다.

a  b   cmp(a,b)
b  c   cmp(b,c)
c  d   cmp(c,d)
d  e   cmp(d,e)
e  a   cmp(e,a)

결과는의 목록입니다 -1, 0, 1. 그런 다음 결과가 유효한 시퀀스의 위 / 아래 중 하나인지 확인합니다.

[-1, -1, 1, 1, 0]
[-1, 1, 1, -1, 0]
[1, -1, -1, 1, 0]
[1, 1, -1, -1, 0]

같은 템플릿에서 생성 [m,n,-m,-n,0]과 함께 m,n=±1. 마지막 0은 첫 번째와 마지막 문자가 같은지 확인하고 길이는 입력 문자열의 길이가 5인지 확인합니다.


대안 71. 올바른 길이를 유지하면서 비교 조건을 점검합니다.

def f(s):a,b,c,d,e=map(cmp,s,s[1:]+s*9)[:5];print a*c<0==e>b*d>len(s)-7

1

R, 144 바이트

답은 @Jonathan Allan의 논리를 기반으로합니다. 그래도 골프를 쳤다.

s=strsplit(scan(,""),"")[[1]];d=diff(match(s,LETTERS));s[1]==tail(s,1)&length(s)==5&all(!rle(s)$l-1)&!sum(d)&!sum(sign(d))&any(rle(sign(d))$l>1)

R 바이올린 테스트 사례 (벡터화 된 예제이지만 동일한 논리)


이미 수표를 것을 가지고 있기 때문에 length(s)==5, 당신은 대체 할 수 s[1]==tail(s,1)와 함께 s[1]==s[5]. 길이를 확인하는 1 바이트 단축 방법은 is.na(s[6])입니다. 이 두 가지 변화가 반환 TRUE에 대해 s정확히 길이 5 FALSE로, 그렇지 않은 경우 TRUE&NA입니다 NAFALSE&NA입니다 FALSE. 또한 대체하여 몇 바이트를 저장할 수 있습니다 !sum(sign(d))&any(rle(sign(d))$l>1)!sum(a<-sign(d))&any(rle(a)$l>1).
rturnbull

1

GNU 프롤로그, 47 바이트

i([A,B,C,D,A]):-A>B,B>C,C<D,D<A;i([B,C,D,A,B]).

i무한 단어에 대해 (사실적으로 여러 번 성공) 술어 를 정의 하여 인터프리터에서 실행할 때 "예"를 출력합니다 (Prolog와 동일 함). 첫 글자와 마지막 글자가 일치하지 않거나 5 글자가 아닌 후보 단어에 대해 실패하므로 통역사에서 실행할 때 "아니오"가 출력됩니다. 무한 단어가 아니지만 첫 번째와 마지막 두 개의 일치하는 5 자의 후보 단어가 주어지면 스택 오버플로와 충돌합니다. ( 왜 그런지 모르겠다충돌합니다. 재귀 호출은 테일 콜로 취급 할 수 있어야합니다. 분명히 GNU Prolog의 옵티마이 저는 그다지 좋지 않습니다.) 성공은 Prolog의 진실성과 동일하고 거짓에 해당하는 것은 실패입니다. 충돌은 진실보다 확실히 거짓이며, 수정하면 솔루션이 상당히 길어질 수 있으므로 이것이 유효한 솔루션으로 간주되기를 바랍니다.

알고리즘은 매우 간단합니다 (실제로 프로그램은 상당히 읽을 수 있습니다). 글자가 무한 단어를 만드는 4 가지 패턴 중 하나를 형성하는지 확인하고, 그렇지 않은 경우 주기적으로 치환하고 다시 시도하십시오. 명시 적으로 이중 문자를 확인하기 위해 우리는 필요하지 않습니다 <>운영은 우리가 암시 적으로 우리는 델타가 일치하는지 확인하는 것이 동시에 것을 확인 할 수 있습니다.


1

실제로 , 38 27 바이트

이 답변은 Jonathan Allan의 뛰어난 Jelly 답변에서 영감을 얻었습니다 . 골프를 타는 곳이 몇 군데있을 수 있으므로 골프 제안을 환영합니다! 온라인으로 사용해보십시오!

O;\♀-dY@♂s4R`0~;11({k`Míub*

언 골핑

     Implicit input s.
O    Push the ordinals of s. Call this ords.
;    Duplicate ords.
\    Rotate one duplicate of ords left by 1.
♀-   Vectorized subtraction. This effectively gets the first differences of ords.
d    Pop ord_diff[-1] onto the stack. This is ords[0] - ords[-1].
Y    Logical negate ord_diff[-1], which returns 1 if s[0] == s[-1], else 0.
@    Swap (s[0] == s[-1]) with the rest of ord_diff.

♂s       Vectorized sgn() of ord_diff. This gets the signs of the first differences.
4R       Push the range [1..4] onto the stack.
`...`M   Map the following function over the range [1..4]. Variable x.
  0~;      Push -1 onto the stack twice.
  11       Push 1 onto the stack twice.
  (        Rotate x to TOS.
  {        Rotate the stack x times, effectively rotating the list [1, 1, -1, -1].
  k        Wrap it all up in a list.

     Stack: list of rotations of [1, 1, -1, -1], sgn(*ord_diff)
í    Get the 0-based index of sgn(*ord_diff) from the list of rotations. -1 if not found.
ub   This returns 1 only if sgn(*ord_diff) was found, else 0.
     This checks if the word loops like an infinity word.

*    Multiply the result of checking if the word s loops and the result of s[0] == s[-1].
     Implicit return.


1

TI-BASIC, 81 바이트

프로그램에 전달할 문자열은 Ans에 있습니다. 입력 한 단어가 무한대 단어이면 1을 반환하고 암시 적으로 표시합니다. 그렇지 않으면 0을 표시하거나 오류 메시지와 함께 종료합니다.

seq(inString("ABCDEFGHIJKLMNOPQRSTUVWXYZ",sub(Ans,A,1)),A,1,length(Ans
min(Ans(1)=Ans(5) and {2,2}=abs(deltaList(deltaList(deltaList(Ans)/abs(deltaList(Ans

반복되는 문자 또는 5자가 아닌 단어에 오류가 있습니다.


1

05AB1E , 16 바이트

Ç¥DO_s.±¥¥Ä2DиQ*

@JonathanAllan 의 젤리 답변 포트 .

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

설명:

Ç             # Convert the (implicit) input string to a list of unicode values
              #  i.e. "RULES" → [82,85,76,69,82]
 ¥            # Take the deltas
              #  i.e. [82,85,76,69,82] → [3,-9,-7,13]
  DO          # Duplicate and take the sum
              #  i.e. [3,-9,-7,13] → 0
    _         # Check if that sum is exactly 0
              # (which means the first and last characters are equal)
              #  i.e. 0 and 0 → 1 (truthy)
 s            # Swap so the deltas are at the top of the stack again
            # Get the sign of each
              #  i.e. [3,-9,-7,13] → [1,-1,-1,1]
    ¥         # Get the deltas of those signs
              #  i.e. [1,-1,-1,1] → [-2,0,2]
     ¥        # And then get the deltas of those
              #  i.e. [-2,0,2] → [2,2]
      Ä       # Convert them to their absolute values
       2Dи    # Repeat the 2 two times as list: [2,2]
          Q   # Check if they are equal
              #  i.e. [2,2] and [2,2] → 1 (truthy)
 *            # Check if both are truthy (and output implicitly)
              #  i.e. 1 and 1 → 1 (truthy)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.