몰 취미 및 기타 버그


52

표준 Android 계산기 앱의 일부 버전에서는 'sin'과 같은 키를 누른 다음 'del'키를 눌러 'si'로 만들 수 있습니다. 아마도 제거로 귀찮게 할 수없는 버그 일 것입니다.

안드로이드 계산기의 스크린 샷

다음과 같은 문자 / 문자 그룹을 입력 할 수 있습니다.

 

죄
시
에스
코사인
공동
씨
탠 껍질
고마워
티
ln
엘
로그
봐라
이자형

따라서 ta-steless와 'c-log-s'때문에 ​​'clogs'이므로 'tasteless'를 입력 할 수 있습니다. 그러나 'got'은 입력 할 수 없으며 'an'또는 'xyz'도 아닙니다.

한 단어 (또는 일련의 문자, 입력에 z 만 있음)를 입력으로 사용하고 단어를 입력 할 수 있는지 여부를 나타내는 출력을 생성하는 프로그램을 작성하십시오.

출력은 단일 문자 / 문자 / 숫자 등일 수 있습니다. 또는 더 클 수 있습니다. 입력 가능한 모든 단어는 동일한 출력을 생성해야합니다. 입력 할 수없는 모든 단어도 동일한 출력을 생성해야합니다.

추신 : 호기심에서, '몰 취미 한'은 가장 긴 사전 단어입니까?


1
명확하게 말하면 : 단어를 입력 할 수 있음을 나타 내기 위해 선택한 단일의 일관된 숫자 또는 문자를 출력하고 단어를 입력 할 수 없음을 나타 내기 위해 선택한 다른 일관된 숫자 또는 선택한 문자를 출력합니다. 그 맞습니까?
Dennis

3
내가 찾을 수있는 가장 긴 단어는 10 글자, coelostats 입니다.
Conor O'Brien

1
그래서 "πe"는 단어가 아닌가?
Mr Lister

@Dennis Ya, 다소간.
ghosts_in_the_code

1
다른 11 시시
크리스 H

답변:


20

펄, 47 43 41 + 1 = 42 바이트

@Sunny Pun 덕분에 -4 바이트 @Brad Gilbert b2gills 및 @Downgoat 덕분에 -2 바이트

-n플래그로 실행하십시오 .

say!/^(s(in?)?|co?|t(an?)?|ln?|log?|e)+$/

확실히 골프를 더할 수는 있지만 경쟁의 정신으로, 처음에 생각해 낸 원래의 정규식을 떠날 것입니다. 참 1이면 거짓 이면 아무것도 반환하지 않습니다 .

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

사전 파일을 다운로드했는데 가장 긴 단어는 11 글자입니다. tattletales


1
나는 생각 co?하기 때문에 충분해야 sin의주의 걸릴 s로 :) 멋진 연주를 /log?/!
Sunny Pun

1
그것은 대소 문자를 구분 (제거 할 필요가 있다고 말하지 않는다 i), 또는 하나의 결과를 이해하는 것을 (하나를 제거 !)
브래드 길버트는 b2gills

입력이 z 일뿐이므로 맨 끝에 플래그를 지정해야합니까?
Downgoat

-2 : /^(s|sin?|co?|t|tan?|ln?|log?|e)+$/또는 원하는 경우 :/^([celst]|sin?|co|tan?|ln|log?)+$/
Charles Charles

1
현상금을 즐기십시오!
ghosts_in_the_code

16

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

s=>/^((si|ta|l)n?|co?|log?|[ste])+$/.test(s)

나는 이것이 가능한 가장 짧은 정규 표현식 이라고 생각 하지만 물론 틀릴 ​​수도 있습니다.

설명

가장 먼저 시작해야 할 것은 모든 옵션을 개별적으로 포함하는 정규식입니다.

s=>/^(sin|si|s|cos|co|c|tan|ta|t|log|lo|l|ln|e)+$/.test(s)

먼저 and cos로 구성 될 수 있다는 것을 알 수 있습니다 .cos

s=>/^(sin|si|s|co|c|tan|ta|t|log|lo|l|ln|e)+$/.test(s)

마지막 문자를 선택적으로 지정하여 sinand와 같은 이들 중 일부를 si결합 할 수 있습니다.

s=>/^(sin?|s|co?|tan?|t|log?|ln?|e)+$/.test(s)

때문에이 작품 sin?과 일치 si함께 또는없이 n, 따라서 모두 덮고, 마지막에 sinsi.

n?s도 많이있는 것 같습니다 . 우리가 그것들을 모두 합치면 어떨까요?

s=>/^((si|ta|l)n?|s|co?|t|log?|e)+$/.test(s)

골프를 치는 또 다른 방법은 나머지 단일 문자 옵션을 문자 범위로 결합하는 것이지만 길이는 같습니다.

s=>/^((si|ta|l)n?|co?|log?|[ste])+$/.test(s)

그리고 이것이 당신이 간단한 정규식을 골프하는 방법입니다. 나는 이것이 모든 문자열과 정확하게 일치하는 가장 짧은 정규 표현식이라고 생각하지만 아닐 수도 있습니다. 이 정규식을 개선 할 수있는 사람에게 +100 현상금 을 수여합니다 .


내가 대답에 사용한 것은 비슷합니다 :^(s|t|co?|(l|ta|si)n?|log?|e)+$
Mama Fun Roll

먼저 44 바이트를 셉니다. 둘째, 대안이지만 더 긴 해결책은 다음과 같습니다 / /.test.bind(/^((si|ta|l)n?|co?|log?|[ste])+$/).
Conor O'Brien

@ ConorO'Brien Whoops, 내가 어떻게 잘못 계산했는지 모르겠다 ...
ETHproductions

a=/^((si|ta|l)n?|co?|log?|[ste])+$/;a.test42 바이트를 할 수 있습니다 . a.test익명의 기능 이기 때문에 이것이 허용된다고 생각 합니다.
NoOneIsHere 여기

@SeeOneRhino 그것은 f=a.test작동하지만 작동하지 않기 때문에 실제로 허용 되지 않습니다. a.test그래도 대체 이름으로 전화를 걸 수 있는지 궁금합니다 .
ETHproductions

7

Pyth, 37 33 29 28 바이트

이 코드에는 인쇄 할 수없는 문자가 포함되어 있으므로 여기에는 xxd16 진 덤프가 있습니다.

00000000: 737d 5173 4d5e 733c 5252 6336 2e22 6174  s}QsM^s<RRc6."at
00000010: 14d0 69ba 76f1 ac59 6422 346c            ..i.v..Yd"4l

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

매우 천문학적 비효율적. 시간 및 공간 복잡도는 O (16 n ) O (24 n )입니다.

설명

먼저, a Q가 암시 적으로 추가됩니다.

s}QsM^s<RRc6."…"4lQ     Implicit: Q = input
            ."…"        Generate "logsincostanlnee"
          c6            Split in 6 parts: ["log", "sin", "cos", "tan", "ln", "ee"]
         R      4       For each n from 0 to 3
       <R               Take the first n chars from each string
      s                 Flatten the results
                 lQ     Get length of input
     ^                  Take that Cartesian power of the list
   sM                   Join each resulting list
 }Q                     Check if the input is found
s                       Cast to integer

OP가 명확 해졌다. 당신은 필요하지 않습니다 s.
Dennis

6

젤리 , 32 31 30 28 26 바이트

ŒṖw@€€“¡Ṡ[ẈKœịḲ-¢ȧ?-»’%3ḌẠ

단어를 입력 할 수 있으면 0을 출력 하고 그렇지 않으면 1을 출력 합니다. 1 바이트를 골프로 해준 @JonathanAllan에게 감사합니다!

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

작동 원리

ŒṖw@€€“¡Ṡ[ẈKœịḲ-¢ȧ?-»’%3ḌẠ  Main link. Argument: s (string of lowercase letters)

ŒṖ                          Yield all partitions of s.
      “¡Ṡ[ẈKœịḲ-¢ȧ?-»       Yield "sine  logcostanln". Every third character
                            marks the start of a typeable word.
  w@€€                      Find the indices of all substrings in the partitions
                            in the string to the right (1-based, 0 if not found).
                     ’      Decrement. "Good" indices are now multiples of 3.
                      %3    Modulo 3. "Good" indices are mapped to 0, "bad"
                            indices are mapped to 1 or 2.
                        Ḍ   Convert from decimal to integer. A partition will
                            yield 0 iff all indices are "good".
                         Ạ  All; yield 0 if one or more integers are falsy (0), 1
                            if all integers are truthy (non-zero).

6

Brachylog , 33 바이트

@Synoli 덕분에 버그가 수정되었습니다.

~c:1a
,"sincostanloglneeee"@6e@[?

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

입력 가능한 true.경우 또는 false.그렇지 않은 경우 출력 합니다 .

설명

연결하는 모든 문자열이 접두사 중 하나의 접두사를 찾을 때까지 입력의 연결 해제를 시도 ["sin", "cos", "tan", "log", "lne", "eee]합니다.

~c                          A list of strings which when concatenated results in the Input
  :1a                       All strings of this list satisfy the predicate below:

,"sincostanloglneeee"@5           The list ["sin", "cos", "tan", "log", "lne", "eee"]
                       e          Take one element of that list
                        @[?       The input is a prefix of that element

.후에 true?
Kritixi Lithos

1
@KritixiLithos SWI-Prolog에서 쿼리가 참이면 인쇄 true.되거나 false.그렇지 않습니다. 방금 이것을 다시 구현했습니다 : 출력이 무시되고 (있는 그대로)에 쓰기가 없으면 주 술어의 성공 또는 실패 여부에 따라 STDOUT인쇄 true.되거나 인쇄됩니다 false.. 때문에이 SWI - 프롤로그에 점을 가지고 true.하고 false.항상 성공 실제로 유효한 프로그램은 / 항상 실패합니다.
Fatalize

이 솔루션 tan은 목록에 명시 적으로 나타나지 않고 어떻게 작동 합니까?
Synoli

2
@Synoli 그렇지 않습니다. 나는 3 바이트의 비용으로 그것을 고쳤다.
페이탈 라이즈

4

펄 6 ,  60 50  44 바이트

첫 번째 시도 ( 60 )

put +?(get~~/^<{<sin cos tan ln log e>».&{|m:ex/^.+/}}>*$/)

펄 5 답변의 번역 ( 50 )

put +?(get~~/^[s[in?]?|co?|t[an?]?|ln?|log?|e]*$/)

-n스위치 사용 ( 43 + 1 )

put +?/^[s[in?]?|co?|t[an?]?|ln?|log?|e]*$/

첫 번째 ?는 결과를 부울로 변환하고 첫 번째 는 결과를 +숫자 ( 1for True, 0for False) 로 변환합니다.


3

Mathematica, 101 바이트

If[StringMatchQ[#,("sin"|"si"|"s"|"cos"|"co"|"c"|"tan"|"ta"|"t"|"ln"|"l"|"log"|"lo"|"e")..],"T","F"]&

이 도전의 어려운 부분은 가장 짧은 정규 표현식으로 나타나고 정규 표현식과 일치하는 가장 간결한 언어를 선택하는 것 같습니다. 나는 전자에 기여할 것이 없으며 Mathematica는 StringMatchQand 를 사용해야하기 때문에 후자에 적합하지 않습니다 RegularExpression. 내가 할 수있는 것은 당신의 PS에 답하는 것입니다 : 당신이 입력 할 수있는 가장 긴 단어는 "무미"입니까?

In[1]:= f=StringMatchQ[#,("sin"|"si"|"s"|"cos"|"co"|"c"|"tan"|"ta"|"t"|"ln"|"l"|"log"|"lo"|"e")..]&;

In[2]:= Select[EntityList@"Word",f@#[[2,1]]&][[All,2,1]]//SortBy[StringLength]//DeleteDuplicates
Out[2]= {c,e,l,s,t,cc,cl,el,et,lo,si,sl,ta,te,ccc,col,cos,cot,eel,ell,eta,etc,lee,let,log,lot,sec,see,set,sic,sin,sit,tae,tan,tat,tec,tee,cell,clog,clot,coco,cole,colt,coss,cost,cote,else,less,loco,loge,loll,lose,loss,lota,sect,seel,sell,sess,seta,sett,sill,silo,silt,sine,sise,siss,site,sloe,slog,slot,stet,taco,tact,tael,talc,tale,tall,tect,tell,test,cello,close,cosec,costa,cotan,eccle,elect,elsin,ettle,loess,lotte,secle,setee,since,sleet,stale,stall,state,steel,stele,tasse,taste,tatee,teest,telco,testa,tetel,tsine,cellco,closet,coleta,collet,coltan,cosine,cosset,costal,ecesis,estate,lessee,scelet,select,sellee,sestet,settee,settle,siesta,silole,stacte,stance,stasis,tallet,tallot,taslet,tassel,tasset,tattle,tectal,teetan,tellee,testee,tsetse,celesta,cessile,cocotte,collect,costate,ecolect,ectasis,electee,sessile,sinless,sitelet,statant,tassell,tastant,testate,coestate,colessee,colocolo,cosiness,costless,electant,lossless,sceletal,siletane,statelet,tactless,tallness,telltale,telocoel,coelostat,sissiness,stateless,tasteless,tattletale}

그래서 "담담"은 한 인물만큼 길다.


이것이 경쟁이 아닌 이유는 무엇입니까? 기능 하는가 F 당신은 도전의 규칙을 준수 여부를 정의?
Dennis

아니, 출력 True또는 False단일 문자보다는.
ngenisis

의사 결정 문제가있는 게시물은 True / False를 결정하는 것에 관한 것이므로 이것이 경쟁적이라고 생각합니다.
FlipTack

경쟁하지 않는 상태는 챌린지가 게시 될 때 존재하지 않았거나 버그가있는 언어 또는 언어 기능을 사용하는 제출을 위해 예약 된 것입니다.
Dennis

그럴 수 있지. 실제 솔루션을 갖도록 답변을 편집했습니다.
ngenisis

2

Wonder , 41 바이트

!.(mstr"^(s|t|co?|(l|ta|si)n?|log?|e)+$")

용법:

(!.(mstr"^(s|t|co?|(l|ta|si)n?|log?|e)+$")) "tasteless"

전에 질문을 완전히 오해했지만 이제는 모두 수정되었습니다. F일치 및 일치 T하지 않는 출력 .

비경쟁, 35 바이트

!.`^(s|t|co?|(l|ta|si)n?|log?|e)+$`

용법:

(!.`^(s|t|co?|(l|ta|si)n?|log?|e)+$`) "tasteless"

이 도전 후에 구현 된 적용 가능한 정규 표현식을 사용합니다.


2
나의 이해에서, 당신은 단지 의미 계산기의 마지막 문자, 삭제할 수 n있지만 typable하지에 sinln있다을.
써니 푼

이 정규식은 sa사실로 감지 합니다
Kritixi Lithos

1
이것은 테스트 케이스에 실패합니다 got.
Dennis

나는 그것이 고쳐 졌다고 믿는다.
Mama Fun Roll

?하위 표현식이 유순하게; rexegg.com/regex-quantifiers.html#cheat_sheet를 참조하십시오 . 그러나 욕심 ??이나 소지가 있다고해도 ?+어떤 이유로 든 (적어도 PHP에서는) 작동하지 않습니다. coelostats트랩을 트리거합니다 (at lota).
Titus

2

처리 중, 223 바이트

int d(String b){for(String p:"tan0log0sin0cos0ln0e".split("0"))if(p.startsWith(b))return 1;return 0;}

int l(String p){String b="";int t=1;for(char c:p.toCharArray()){b+=c;if(d(b)<1){b=c+"";t=d(b);}if(t<1)return t;}return t;}

마침내 정규 표현식없이 답변을하기로 결정했습니다. 함수를 호출하려면을 사용하십시오 l("tasteless");. 0false와 1true를 반환 합니다.

설명이있는 확장 코드

int d(String b){
  for(String p:"tan0log0sin0cos0ln0e".split("0"))
    if(p.startsWith(b))
      return 1;
  return 0;
}
//main function
int l(String p){
  String b="";
  int t=1;
  for(char c:p.toCharArray()){
    b+=c;
    if(d(b)<1){
      b=c+"";
      t=d(b);
    }
    if(t<1)return t;
  }
  return t;
}

기본적으로, 우리는 주어진 문자열을 반복하여 bchar by char을 만듭니다. 우리는 사용 검사 d()의있는 경우 tan, log...로 시작 b. 그렇다면 유효합니다. 그렇지 않으면 해당 위치의 문자가 유효한지 확인하고 재설정 b합니다. 이제 유효하지 않은 경우 0반환되거나 그렇지 않으면 여전히 유효합니다. 마지막으로, 프로그램이 아직 무언가를 반환하지 않았다면를 반환하십시오 1.


d함수가 bool?를 반환 할 수 없습니까 ?
Roman Gräf

@ RomanGräf보다 많은 바이트를 사용 boolean합니다 int. 또한 truefalse보다 더 많은 바이트가 필요 1하고0
Kritixi LITHOS

2

스칼라, 49 바이트

s=>s.matches("(s(in?)?|co?|t(an?)?|ln?|log?|e)+")

주어진 문자열이 정규식과 일치하면 true를, 그렇지 않으면 false를 반환합니다.


2

파이썬 3 , 154 바이트

r=1;i=input()
while r:
 r=0
 for s in'sin,cos,tan,log,ln,co,lo,si,ta,s,c,t,l,e'.split(','):
  if i.startswith(s):r=i=i.replace(s,'',1);break
print(i=='')

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


1
들여 쓰기를 확인해야 할 수도 있습니다. 코드를 편집하여 작동시켜야했습니다.
george

@george, 이상하다, 나는 유휴와 온라인 컴파일러에서 시도했고, 둘 다 작동하는 것 같다
Henke

2

파이썬 3 , 149130 바이트

i=input()
for a in 'tan,sin,cos,log,si,co,ta,lo,lo,ln,s,c,t,l,e'.split(','):
    if a in i:
        i=i.replace(a,"")
print(not i)

편집 # 1 : @Henke 솔루션을 사용하여 19 바이트 면도


0

파이썬 2, 124 바이트

f=lambda w:any(f(w[len(s):])if w[:len(s)]==s else 0for s in'sin,cos,tan,log,ln,co,lo,si,ta,s,c,t,l,e'.split(','))if w else 1

0

PHP, 60 바이트

<?=preg_match("#^((si|ta|l)n?|co?|log?|s|e|t)+$#",$argv[1]);

ETHproductions 에서 훔친 정규 표현식 :
명령 줄 인수에서 입력을받습니다. 1타이핑 가능하고 타이핑 0할 수없는 것으로 인쇄 합니다 .

이전 버전, 75 73 69 바이트

<?=!preg_replace("#co|log|ln|lo|sin|si|tan|ta|[celst]#","",$argv[1]);

가능한 모든 단어를 빈 문자열로 바꾸고 결과를 반환하고 부정합니다.

<?=!preg_split("#co|log|ln|lo|sin|si|tan|ta|[celst]#",$argv[1],-1,1);

정규식 일치로 입력을 분할합니다. Flag 1는 비어 있지 않은 결과 만 반환하도록 PREG_SPLIT_NO_EMPTY지시 preg_split합니다. 입력을 입력 preg_split할 수 있으면 빈 결과 만 표시되므로 빈 배열을 반환합니다. !결과를 무효화합니다.

두 버전 모두 명령 줄 인수에서 입력을 받고 결과가 비어 있으면 (입력 가능)
인쇄 1하지 않습니다.

참고 :
정규식을 사용하여 포장하는 ?것은 여기서 작동하지 않습니다. 그것은 표현을 모호하게 만든다; 아마도 역 추적 때문일 것입니다. 그리고 대안의 순서가 중요하다 : ta앞에 서게하는 t또는 엔진, 발견 된 경우 일치 중지됩니다 t.

정량화 컨닝 페이퍼를 찾았 ??거나 생각 하거나 ?+도움이 될 수 있습니다. 그러나 그들은 나를 위해 일하지 않았다.


0

자바 8, 55 바이트

s->return s.matches("^((si|ta|l)n?|co?|log?|[ste])+$");

Disclamer : 내가 사용 ETHproductions ' 는 나보다 많은 바이트가 짧은 때문에 정규식. 그에게 정규식에 대한 완전한 신용. 내가 한 것은 24 바이트를 추가하여 Java 함수로 만드는 것입니다.

false단어가 정규식에 맞지 않으면를 반환 합니다 true.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.