Vô vị và các lỗi khác


52

Một số phiên bản của ứng dụng máy tính Android tiêu chuẩn cho phép bạn nhấn một phím, như 'sin' và sau đó là phím 'del' để biến nó thành 'si'. Có lẽ chỉ là một lỗi mà họ không thể bận tâm với việc gỡ bỏ.

Ảnh chụp màn hình máy tính Android

Các chữ cái / nhóm chữ cái sau đây có thể đánh máy:

 

tội
si
S
cos
đồng
c
tan
tôi
t
ln
tôi
đăng nhập
lo
e

Vì vậy, 'vô vị' là có thể đánh máy, bởi vì ta vô dụng và 'guốc' vì 'c-log-s'. Tuy nhiên, 'got' không thể đánh máy, cũng không phải là 'an' hay 'xyz'.

Viết chương trình lấy một từ đơn (hoặc chuỗi các chữ cái, chỉ az trong đầu vào) làm đầu vào và tạo đầu ra để cho biết liệu một từ có thể đánh máy được hay không.

Đầu ra có thể là một ký tự / chữ cái / chữ số / vv. hoặc nó có thể lớn hơn. Tất cả các từ có thể đánh máy sẽ tạo ra cùng một đầu ra. Tất cả các từ không đánh máy cũng sẽ tạo ra cùng một đầu ra.

PS Chỉ tò mò thôi, liệu 'vô vị' là từ điển dài nhất có thể đánh máy?


1
Nói rõ hơn: Chúng tôi đưa ra một chữ số hoặc chữ cái nhất quán mà chúng tôi chọn để chỉ từ có thể đánh máy được, và một chữ số hoặc chữ cái nhất quán, khác nhau mà chúng tôi chọn để chỉ từ không đánh máy được. Đúng không?
Dennis

3
Từ dài nhất tôi có thể tìm thấy là 10 chữ cái, coelostats .
Conor O'Brien

1
Vì vậy, "πe" không phải là một từ?
Ông Lister

@Dennis Ya, nhiều hay ít.
ghosts_in_the_code

1
11: sissinesses khác
Chris H

Câu trả lời:


20

Perl, 47 43 41 + 1 = 42 byte

-4 byte nhờ @Sunny Pun. -2 byte nhờ @Brad Gilbert b2gills và @Downgoat

Chạy với -ncờ.

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

Nó chắc chắn có thể được chơi golf xa hơn, nhưng trong tinh thần cạnh tranh, tôi rời khỏi regex chủ yếu ban đầu mà tôi đã đưa ra lúc đầu. Trả về không có gì nếu đúng, 1nếu sai.

Hãy thử trực tuyến!

Tôi đã tải xuống một tệp từ điển và từ dài nhất tôi tìm thấy là 11 chữ cái - tattletales


1
Tôi nghĩ co?là đủ vì sinsẽ chăm sóc s:) Chơi đẹp với /log?/!
Nắng Pun

1
Điều đó không nói rằng nó cần phải không phân biệt chữ hoa chữ thường (loại bỏ i) hoặc kết quả duy nhất phải có ý nghĩa (loại bỏ một !)
Brad Gilbert b2gills

Bạn có cần i cờ ở cuối không vì đầu vào chỉ là az?
Hạ cấp

Bạn có thể làm điều này đơn giản hơn: -2: /^(s|sin?|co?|t|tan?|ln?|log?|e)+$/hoặc nếu bạn thích:/^([celst]|sin?|co|tan?|ln|log?)+$/
Không phải là Charles

1
Thưởng thức tiền thưởng của bạn!
ghosts_in_the_code

16

JavaScript (ES6), 44 byte

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

Tôi nghĩ rằng đây là regex ngắn nhất có thể, nhưng tất nhiên tôi có thể sai.

Giải trình

Một nơi đầu tiên rõ ràng để bắt đầu sẽ là một regex đơn giản chỉ bao gồm tất cả các tùy chọn riêng biệt:

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

Đầu tiên, chúng ta có thể quan sát coscó thể được hình thành từ cos, làm cho nó không cần thiết:

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

Một số trong số này, chẳng hạn như sinsi, có thể được kết hợp bằng cách đặt chữ cái cuối cùng tùy chọn:

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

Điều này hoạt động vì sin?phù hợp sivới hoặc không có một nkết thúc, do đó bao gồm cả sinsi.

Dường như có rất nhiều n?s là tốt. Điều gì nếu chúng ta đặt tất cả chúng lại với nhau?

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

Một cách nữa để chơi golf này là kết hợp các tùy chọn char đơn còn lại thành một phạm vi nhân vật, nhưng điều này xuất hiện ở cùng một độ dài:

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

Và đó là cách bạn chơi golf một regex đơn giản. Tôi tin rằng đây là regex ngắn nhất có thể phù hợp với mọi chuỗi chính xác, nhưng có lẽ không. Tôi sẽ trao phần thưởng +100 cho bất kỳ ai quản lý để cải thiện regex này.


Câu hỏi mà tôi đã sử dụng trong câu trả lời của mình cũng tương tự:^(s|t|co?|(l|ta|si)n?|log?|e)+$
Mama Fun Roll

Đầu tiên, tôi đếm 44 byte. Thứ hai, đây là một giải pháp thay thế nhưng dài hơn : / /.test.bind(/^((si|ta|l)n?|co?|log?|[ste])+$/).
Conor O'Brien

@ ConorO'Brien Rất tiếc, không biết tôi đã hiểu sai như thế nào ...
ETHproductions 4/12/2016

Bạn có thể làm a=/^((si|ta|l)n?|co?|log?|[ste])+$/;a.testcho 42 byte. Tôi tin rằng điều này được cho phép, bởi vì a.testlà một chức năng ẩn danh.
NoOneIsHãy 6/12/2016

@SeeOneRhino Đó là, nhưng nó không thực sự được phép vì f=a.testkhông hoạt động. Tôi tự hỏi nếu nó chấp nhận được gọi với cái tên thay thế a.testmặc dù ...
ETHproductions

7

Pyth, 37 33 29 28 byte

Mã này chứa một ký tự không thể in được, vì vậy đây là một xxdhexdump.

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

Hãy thử trực tuyến.

Cực kỳ kém hiệu quả. Độ phức tạp thời gian và không gian là O (16 n ) O (24 n ).

Giải trình

Đầu tiên, a Qđược ngầm thêm.

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 đã làm rõ; bạn không cần s.
Dennis

6

Thạch , 32 31 30 28 26 byte

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

Đầu ra 0 nếu từ có thể đánh máy, 1 nếu không. Cảm ơn @Jonathan ALLan vì đã chơi golf 1 byte!

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

ŒṖ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 byte

Đã sửa lỗi nhờ @Synoli.

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

Hãy thử trực tuyến!

Đầu ra true.nếu đánh máy hoặc false.cách khác.

Giải trình

Chúng tôi thử deconcatenations của đầu vào cho đến khi chúng tôi tìm thấy một chuỗi mà tất cả các chuỗi mà chúng tôi nối là tiền tố của một trong số đó ["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

Tại sao .sau true?
Kritixi Lithos

1
@KritixiLithos Trong SWI-Prolog khi một truy vấn là đúng, nó sẽ in true.false.nếu không. tôi chỉ thực hiện lại điều này: nếu đầu ra bị bỏ qua (như ở đây) và không có chữ viết nào STDOUT, thì nó sẽ in true.hoặc false.tùy thuộc vào vị từ chính thành công hay thất bại. Nó có một dấu chấm trong SWI-Prolog bởi vì true.false.thực sự là các chương trình hợp lệ luôn thành công / luôn thất bại.
Gây tử vong

Làm thế nào để giải pháp này hoạt động mà không tanxuất hiện rõ ràng trong danh sách?
Synoli

2
@Synoli Nó không. Tôi đã sửa nó với chi phí 3 byte, cảm ơn.
Gây tử vong

4

Perl 6 ,  60 50  44 byte

lần thử đầu tiên ( 60 )

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

bản dịch của câu trả lời Perl 5 ( 50 )

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

sử dụng -ncông tắc ( 43 + 1 )

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

Đầu tiên ?chuyển đổi kết quả thành Boolean và lần đầu tiên chuyển đổi kết quả +thành một số ( 1for True, 0for False)


3

Toán học, 101 byte

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

Có vẻ như các phần khó khăn của thử thách này đang đến với regex ngắn nhất và chọn ngôn ngữ ngắn gọn nhất để phù hợp với regex. Tôi không có bất cứ điều gì để đóng góp cho cái trước, và Mathicala không phải là ứng cử viên tốt cho cái sau vì bạn phải sử dụng StringMatchQRegularExpression. Điều tôi có thể làm là trả lời PS của bạn: "vô vị" là từ dài nhất mà bạn có thể gõ?

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}

Vì vậy, "tattletale" dường như dài nhất bởi một nhân vật.


Tại sao điều này không cạnh tranh? Có phải hàm f bạn xác định không tuân thủ các quy tắc của thử thách?
Dennis

Không, nó xuất ra Truehoặc Falsethay vì một ký tự đơn.
ngenisis

Các bài đăng được gắn thẻ với vấn đề quyết định là về việc xác định Đúng / Sai, vì vậy tôi nghĩ rằng điều này đang cạnh tranh.
FlipTack

Trạng thái không cạnh tranh được dành riêng cho các bài đăng sử dụng tính năng ngôn ngữ hoặc ngôn ngữ không tồn tại hoặc có lỗi khi thử thách được đăng.
Dennis

Đủ công bằng. Tôi chỉnh sửa câu trả lời của tôi để có một giải pháp thực tế.
ngenisis

2

Kỳ quan , 41 byte

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

Sử dụng:

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

Hoàn toàn hiểu sai câu hỏi trước đây, nhưng bây giờ tất cả đã được sửa. Đầu ra Fcho khớp và Tkhông khớp.

Không lọc, 35 byte

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

Sử dụng:

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

Điều này sử dụng các biểu thức chính quy được áp dụng, được thực hiện sau thử thách này.


2
Từ sự hiểu biết của tôi, bạn chỉ có thể xóa ký tự cuối cùng trong máy tính, có nghĩa là ntrong không phân typ nhưng sinlnđang có.
Nắng Pun

Regex này phát hiện salà đúng
Kritixi Lithos

1
Điều này không thành công trong trường hợp thử nghiệm got.
Dennis

Tôi tin rằng nó đã được sửa.
Mama Fun Roll

Việc ?làm cho biểu thức phụ ngoan ngoãn; xem rexegg.com/regex-quantifier.html#cheat_sheet . Nhưng thậm chí làm cho nó tham lam với ??hoặc sở hữu với ?+khôngnt hoạt động vì một số lý do (ít nhất là trong PHP). coelostatskích hoạt bẫy (tại lota).
Tít

2

Đang xử lý, 223 byte

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

Cuối cùng quyết định làm một câu trả lời mà không có regex. Để gọi hàm, sử dụng l("tasteless");. Trả về 0sai và 1đúng.

Mã mở rộng với lời giải thích

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

Về cơ bản, chúng tôi lặp lại chuỗi đã cho, xây dựng bchar bằng char. Chúng tôi kiểm tra sử dụng d()nếu bất kỳ tan, log... bắt đầu với b. Nếu có, thì nó là hợp lệ. Khác, chúng tôi kiểm tra nếu char ở vị trí đó là hợp lệ và chúng tôi đặt lại b. Bây giờ nếu nó không hợp lệ, 0sẽ được trả lại, nếu không nó vẫn còn hiệu lực. Cuối cùng, nếu chương trình chưa trả về một cái gì đó, thì hãy quay lại 1.


dHàm có thể trả về a boolkhông?
Roman Gräf

@ RomanGräf Đó là nhiều byte để sử dụng booleanhơn int. Ngoài ra truefalseyêu cầu nhiều byte hơn 10
Kritixi Lithos

2

Scala, 49 byte

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

Trả về true nếu chuỗi đã cho khớp với regex, sai khác.


2

Python 3 , 154 byte

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=='')

Hãy thử trực tuyến!


1
Bạn có thể cần kiểm tra thụt lề, tôi đã phải chỉnh sửa mã để làm cho nó hoạt động
george

@george, thật lạ, tôi đã thử trong IDLE và trình biên dịch trực tuyến, và cả hai dường như đều hoạt động
Henke

2

Python 3 , 149 130 byte

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)

chỉnh sửa # 1: cạo 19 byte bằng giải pháp @Henke


0

Python 2, 124 byte

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 byte

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

regex bị đánh cắp từ ETHproductions :
lấy đầu vào từ đối số dòng lệnh; in 1cho typable, 0cho không đánh máy.

phiên bản cũ hơn, 75 73 69 byte

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

thay thế tất cả các từ có thể bằng chuỗi rỗng, trả về kết quả, phủ định.

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

chia đầu vào bằng regex khớp. Cờ 1là viết tắt của PREG_SPLIT_NO_EMPTYvà nói preg_splitchỉ trả về kết quả không trống. Nếu đầu vào là kiểu chữ, preg_splitsẽ chỉ có kết quả trống, vì vậy nó sẽ trả về một mảng trống, đó là giả. !phủ nhận kết quả.

Cả hai phiên bản đều lấy đầu vào từ đối số dòng lệnh
và in 1nếu kết quả trống (đầu vào có thể đánh máy), không có gì khác.

Lưu ý:
Đóng gói regex sử dụng ?không hoạt động ở đây; nó ám chỉ những biểu hiện vô duyên; có lẽ là do quay lui. Và thứ tự của các lựa chọn thay thế rất quan trọng: taphải đứng trước thoặc động cơ sẽ ngừng khớp khi tìm thấy t.

Tôi tìm thấy một bảng cheat định lượng , suy nghĩ ??hoặc ?+có thể giúp đỡ; nhưng họ đã không làm việc cho tôi.


0

Java 8, 55 byte

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

Disclamer: Tôi đã sử dụng regex của ETHproductions vì nó ngắn hơn nhiều byte so với của tôi. Tín dụng đầy đủ trên Regex cho anh ta. Những gì tôi đã làm là thêm 24 byte để biến nó thành một hàm Java.

Trả về falsenếu từ không phù hợp với Regex, khác true.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.