Từ dễ đánh máy


30

Cuộc thi này đã kết thúc.

Người chiến thắng là CJam với 22 nhân vật, đánh bại câu trả lời của TwiNight bằng một nhân vật. Xin chúc mừng Dennis !

Một đề cập đáng trân trọng dành cho Falko , người đã phát điên hoàn toàn với hàng nhập khẩu miễn phí.

.


Cách đây một thời gian, tôi muốn biết làm thế nào tôi có thể loại bỏ điện thoại thông minh hiện đại bằng Nokia 3310 của mình và trong khi một số câu trả lời thực sự tốt, tôi vẫn không thể theo kịp! Có lẽ tôi nên có một cách tiếp cận khác và đơn giản là không viết bất kỳ từ nào khó xử để gõ.

Chúng tôi sẽ gọi một đoạn văn bản có thể đánh máy dễ dàng nếu không có hai chữ cái liên tiếp nằm trên cùng một nút trên bàn phím điện thoại, được bố trí theo tiêu chuẩn:

Bàn phím điện thoại


Nhiệm vụ của bạn

Nhiệm vụ của bạn là viết một chương trình / hàm chấp nhận một chuỗi stừ stdin / như một tham số và trả về một giá trị trung thực nếu sdễ dàng đánh máy và một giá trị sai lệch khác. Đầu vào sẽ chỉ bao gồm các chữ cái thường và dấu cách và được đảm bảo không trống!

Chấm điểm

Đây là codegolf, vì vậy chiến thắng số lượng nhân vật thấp nhất.

Báo cáo nhập khẩu sẽ không được tính vào điểm số cuối cùng của bạn, vì vậy nếu bạn đã bao giờ bạn muốn sử dụng std::set_symmetric_difference, liftM4hoặc itertools.combinationstrong mã của bạn, bây giờ là thời gian!

-3 nếu mã nguồn của bạn dễ dàng đánh máy, giả sử mọi thứ không phải là chữ cái nằm trên nút 0. Sau tất cả, tôi có thể muốn nhắn tin mã của bạn cho một số bạn bè!

Tủ thử

Dưới đây là một vài testcase để kiểm tra xem mã của bạn có hoạt động như dự định không:

"x" -> True
"aardvark" -> False
"ardvark" -> True
"flonk" -> False

"im codegolfing all day long" -> False
"i indulge in minimizing bytecount" -> True

"havent heard from you in a long time" -> False
"your silence was of undue permanence" -> True

"how are  you" -> False
"how are you" -> True

Chúc bạn chơi golf vui vẻ!


Là hai không gian liên tiếp xấu?
Martin Ender

@ MartinBüttner vâng! Có lẽ nên thêm một testcase cho điều đó.
Flonk

9
Tôi có một chiếc điện thoại nokia, nếu tôi nhấn phím cách hai lần, tôi sẽ nhận được số 0.
overactor

1
Câu hỏi liên quan: nghĩ ra cách bố trí bàn phím điện thoại nhằm tối đa hóa một số điểm dựa trên mức độ dễ đánh máy của các từ thường xuyên nhất.
justinpc

1
@jpcooper như hai người đề cập ở đây ? Tôi đã sử dụng 8pen và thực sự thích nó, ngoại trừ kính điện thoại của tôi nóng lên khi sử dụng nó (từ tiếp xúc, không phải từ hoạt động của CPU) và hệ số ma sát làm cho nó khó sử dụng cho các đầu vào dài. Sử dụng s-pen trên Note 3 dễ dàng hơn nhiều :)
Eben

Câu trả lời:


6

CJam, 34 31 27 22 ký tự

1l{'h-_9/-D+3/X\:X^*}/

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

Chạy ví dụ

$ cjam <(echo "1l{'h-_9/-D+3/X\:X^*}/") <<< 'aardvark'; echo
0
$ cjam <(echo "1l{'h-_9/-D+3/X\:X^*}/") <<< 'ardvark'; echo
66000

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

1l                         " Push a R := 1 and read a line L from STDIN.                  ";
                           " Initialize X := 1. (implicit)                                ";
  {                  }/    " For each character C of L, do the following:                 ";
    'h-                    "     C -= 'h'                                                 ";
       _9/-D+3/            "     Y := (C - C / 9 + 13) / 3                                ";
               X\  ^*      "     R *= X ^ Y                                               ";
                 :X        "     X := Y                                                   ";
                           " Print R. (implicit)                                          ";

Lý lịch

Cốt lõi của mã bao gồm việc áp dụng bản đồ F cho từng ký tự C của chuỗi đầu vào sao cho hình ảnh của các ký hiệu trên cùng một khóa khớp. Tôi tìm thấy một bản đồ phù hợp bằng cách quan sát những điều sau đây:

Bản đồ T: C (C - 'h') + 13 biến đổi chuỗi S: = "abcdefghijklmnopqrstuvxyz" như sau:

[-59   6  7  8   9 10 11  12 13 14  15 16 17  18 19 20  21 22 23 24  25 26 27  28 29 30 31]

Đối với các phím 0để 6, nó sẽ đủ để chia T (C) bằng 3 , nhưng chúng ta phải áp dụng một số loại điều chỉnh để các nhân vật trong s , t , v , yz .

Bản đồ D: C (C - 'h') / 9 biến chuỗi S thành mảng sau:

[ -8   0  0  0   0  0  0   0  0  0   0  0  0   0  0  0   0  1  1  1   1  1  1   1  1  1  2]

Điều này sửa các chỉ số của s , t , v , yz , mà không ảnh hưởng đến những cái khác.

Cuối cùng, bản đồ F: C (T (C) - D (C)) / 3 biến đổi chuỗi S như sau:

[-17   2  2  2   3  3  3   4  4  4   5  5  5   6  6  6   7  7  7  7   8  8  8   9  9  9  9]

Tất cả những gì còn lại là để so sánh các nhân vật liên tiếp bằng cách nào đó. Với mục đích đó, chúng tôi XOR F (C) với hình ảnh của ký tự trước - đối với lần đầu tiên, chúng tôi XOR F (C) với 1 (giá trị mặc định của biến X ), không có tiền đề - và nhân tất cả các kết quả.

Sản phẩm sẽ được falsy khi và chỉ khi một trong những yếu tố là zero, tức là khi và chỉ khi hai nhân vật liên tiếp có cùng một hình ảnh của F .


Tôi nghĩ rằng số byte (Không phải ký tự) cho số này là 54

@Optimizer Tôi nghĩ rằng wiki thẻ golf nói byte

Câu trả lời này không còn chứa các ký tự không phải ASCII.
Dennis

@professorfish Thẻ wiki chỉ là mặc định. Nếu thử thách chỉ định nhân vật, đó là nhân vật.
Martin Ender

27

Con trăn 2 - 80, 68, 64, 61, 58, 50, 48, 45, 44 42

Mặc dù bây giờ nó hơi vô lý, tôi sẽ tiếp tục sử dụng nhập thư viện miễn phí, ngay cả __builtin__ thư viện:

from numpy import diff as D
from pprint import pprint as P
from __builtin__ import all as A
from __builtin__ import raw_input as I
from __builtin__ import bytearray as B

Vì vậy, chỉ có dòng ngắn sau đây được tính vào chiều dài mã:

P(A(D([(o-o/112-o/59)/3for o in B(I())])))

Tín dụng cho Markuz cho các ý tưởng liên quan input() ! Những thách thức nhập khẩu miễn phí này luôn giới thiệu cho bạn một số thư viện ít được biết đến. ;)


Thay thế chỉ sử dụng operatorthư viện ( 98, 83 79):

from operator import ne as n
K=[(ord(c)-1-(c>'p')-(c>'w'))/3for c in input()]
print all(map(n,K[1:],K[:-1]))

Tôi sẽ dừng ở đây. Nhưng bạn có thể chơi thêm phiên bản này bằng cách sử dụng sys,pprint và các thư viện khác ...


Thay thế mà không có thư viện (105):

s=input()
n=lambda c:(ord(c)-1-(c>'p')-(c>'w'))/3
print all([n(s[i])!=n(s[i+1])for i in range(len(s)-1)])

Và một lần nữa, chúng tôi độc lập đăng cùng một giải pháp trong Ruby và Python. Có vẻ như lần này bạn đang chiến thắng. ;) ... Bạn cũng không thể lưu 4 byte, bằng cách gán ord(c)cho một biến (nói o) và sau đó trừ c/112c/119thay vào đó là các booleans?
Martin Ender

@ MartinBüttner: Vâng, thỉnh thoảng Python có thể đánh bại Ruby. Thật không may, tôi không thể gán các biến trong các lambdabiểu thức một cách dễ dàng. Với [(o-1-o/112-o/119)/3for o in map(ord,s)]tôi kết thúc với 80 byte một lần nữa.
Falko

Ah tôi thấy. Sick cải tiến mới mặc dù! : D
Martin Ender

Rất ấn tượng. Và bạn vẫn có thể lưu 3 byte bằng from sys import argv as s, sử dụng s[1]thay vìinput()
Markuz

nhập inputtừ __builtin__cũng thực sự thậm chí còn tốt hơn: D tiết kiệm một Byte khác.
Markuz

20

Ruby Regex (hương vị phổ biến nhất), 106 83 byte

Vì regex

^(?!.*(  |[abc]{2}|[def]{2}|[ghi]{2}|[jkl]{2}|[mno]{2}|[p-s]{2}|[tuv]{2}|[w-z]{2}))

Tôi vừa mới cắt người trung gian (Ruby) và biến nó thành một giải pháp thuần túy. Hoạt động trong rất nhiều hương vị và chỉ tìm thấy sự trùng khớp nếu chuỗi không chứa hai ký tự liên tiếp trên cùng một nút.


Bạn không thể đặt nó {2}bên ngoài xen kẽ, tiết kiệm 22 byte?
Niet the Dark Tuyệt đối

1
@NiettheDarkAbsol không may, vì sau đó nó có thể chọn các lựa chọn thay thế khác nhau cho hai lần lặp lại.
Martin Ender

Aah, tất nhiên rồi. Tôi biết có một lý do XD
Niet the Dark Tuyệt đối

Kudos cho một giải pháp chơi golf dễ hiểu, dễ hiểu!
GreenAsJade

12

Bash + coreutils, 49

tr a-z $[36#8g7e9m4ddqd6]7778888|grep -Pq '(.)\1'

Trả về mã thoát là 1 cho TRUE và 0 cho FALSE:

$ for s in "x" "aardvark" "ardvark" "flonk" "im codegolfing all day long" "i indulge in minimizing bytecount" "havent heard from you in a long time" "your silence was of undue permanence" "how are  you" "how are you"; do echo "./3310.sh <<< \"$s\" returns $(./3310.sh <<< "$s"; echo $?)"; done
./3310.sh <<< "x" returns 1
./3310.sh <<< "aardvark" returns 0
./3310.sh <<< "ardvark" returns 1
./3310.sh <<< "flonk" returns 0
./3310.sh <<< "im codegolfing all day long" returns 0
./3310.sh <<< "i indulge in minimizing bytecount" returns 1
./3310.sh <<< "havent heard from you in a long time" returns 0
./3310.sh <<< "your silence was of undue permanence" returns 1
./3310.sh <<< "how are  you" returns 0
./3310.sh <<< "how are you" returns 1
$ 

Rất đẹp! Đây sẽ là 46 ký tự trong Perl: perl -pE'y/a-z/aaadddgggjjjmmmpppptttwwww/;$_=!/(.)\1/' <(echo "x")Nó in 1 cho đúng và không có gì sai.
hmatt1

@chilemagic Đi trước và đăng câu trả lời perl :). Đừng quên thêm một điểm vào việc sử dụng tham số dòng lệnh -p (theo quy ước golf-code).
Chấn thương kỹ thuật số

Tôi nghĩ rằng tôi có thể tìm cách rút ngắn aaadddgggjjjmmmpppptttwwwwnhưng tôi đã từ bỏ.
Ben Jackson

2
@BenJackson Tôi đã tìm ra một cách. Chúng tôi thực sự có thể sử dụng một chuỗi các ký tự riêng biệt - 11122233344455566667778888sẽ làm. Bằng cơ sở 36 mã hóa 19 chữ số đầu tiên của số này, chúng ta có thể tiết kiệm được 1 char!
Chấn thương kỹ thuật số

9

APL (Dyalog), 24 23

~∨/2=/⌊¯13⌈.21-.31×⎕AV⍳⍞

∧/2≠/⌊¯13⌈.21-.31×⎕AV⍳⍞

Giải trình

: Đưa đầu vào chuỗi từ màn hình
⎕AV: Đây là vectơ nguyên tử về cơ bản là một chuỗi gồm tất cả các ký tự mà APL nhận ra, tất nhiên bao gồm tất cả các chữ cái thường (chỉ số 18 ~ 43) và hàm khoảng trắng (chỉ số 5)
: IndexOf. Đối với nhiều hàm trong APL có một hoặc hai đối số vô hướng, bạn có thể cung cấp cho nó một mảng thay cho vô hướng - APL sẽ thực hiện việc lặp cho bạn. Vì vậy, trả về một loạt các chỉ số. .21-.31×: Lần 0,31 rồi trừ 0,21. Đây là một mẹo nhỏ để ánh xạ chữ cái trên cùng một khóa (đặc biệt là PQRS) thành cùng một số (khi được làm tròn thành số nguyên), ngoại trừ Z, được ánh xạ tới nhóm của chính nó
¯13⌈: maxvới -13. Điều này đưa Z trở lại nhóm với WXY
: Làm tròn xuống số nguyên
2≠/: Pairwise-. Trả về một mảng boolean cho mỗi cặp liên tiếp.
∧/: VÀ cùng tất cả các mục của mảng kết quả.


Tôi sẽ đăng một cái gì đó như thế này, nhưng bạn đánh bại tôi với nó. Phím Z chết tiệt! Bạn vẫn có thể tắt 1 char bằng cách nói ∧/2≠/(tất cả các cặp liên tiếp được gõ trên các phím khác nhau) thay vì ~∨/2=/(không có cặp liên tiếp nào được gõ trên cùng một khóa.) APL FTW !!!
Tobia

Có tkx. Tôi đã suy nghĩ "Tôi nên có thể cạo sạch 1 char ở đây tại sao tôi không thể làm điều đó OMGGGG !!!" Nhưng tôi phải đến lớp nên tôi chỉ đăng những gì tôi có. Và, vâng, DAMN Z KEY. Thật không may, tôi đang ở trên điện thoại của mình vì vậy tôi không thể chỉnh sửa nó cho đến sau này
TwiNight

Và tôi đã suy nghĩ có ý thức về Luật của De Morgan và vẫn không thể hiểu được ... Thật ngu ngốc
TwiNight

1
Chúc may mắn nhắn tin này cho bạn bè của bạn. ;)
Thane Brimhall

Điều này có vẻ rất thú vị. Có cách nào để thử mã này mà không cần mua trình thông dịch APL của Dyalog không? Trình thông dịch trực tuyến tôi thường sử dụng dường như không hiểu phương ngữ ...
Dennis

7

Perl - 44

Về cơ bản, đây là bản phóng tác Perl của câu trả lời của @ DigitalTrauma được đăng với sự cho phép của anh ấy. Cạo sạch 2 ký tự nhờ @KyleStrand.

y/b-y/aadddgggjjjmmmpppptttzzz/;$_=!/(.)\1/

43 ký tự + 1 cho -pcờ. y///cũng giống như tr///. Nó in 1đúng và không có gì sai. Tôi có thể gửi một lời giải thích chi tiết nếu được yêu cầu.

Chạy ví dụ:

perl -pE'y/b-y/aadddgggjjjmmmpppptttzzz/;$_=!/(.)\1/' <(echo "x")

Perl - 81

$s=join"]{2}|[",qw(abc def ghi jkl mno p-s tuv w-z);say/^(?!.*(  |[$s]{2}))/?1:0

+1 cho -ncờ. Nó hoạt động bằng cách sử dụng joinđể tạo regex (giống như của Martin ), tạo ra một vài byte.

Chạy ví dụ:

perl -nE'$s=join"]{2}|[",qw(abc def ghi jkl mno p-s tuv w-z);say/^(?!.*(  |[$s]{2}))/?1:0' <(echo "your silence was of undue permanence")

Bạn không thể cạo hai ký tự khỏi giải pháp Perl bằng cách cho phép azvẫn chưa được dịch? y/b-y/aadddgggjjjmmmpppptttzzz/;$_=!/(.)\1/Ngoài ra, điều này sẽ không xử lý không gian, phải không?
Kyle Strand

... Ồ, phải rồi, hai khoảng trống trong một hàng đã là hai ký tự giống nhau trong một hàng. Lỗi của tôi.
Kyle Strand

@KyleStrand cuộc gọi tốt đẹp cho phép azgiữ nguyên. Cập nhật câu trả lời!
hmatt1

4

JavaScript - 159 156 byte

function g(s){p=n=-1;for(i=0;i!=s.length;i++){p=n;n=s.charCodeAt(i);n-=97;if(n>17)n--;if(n>23)n--;if(p==-1)continue;if(~~(p/3)==~~(n/3))return 0;}return 1;}

Trả về 1 cho sự thật và 0 cho giả.

Giá như tôi có thể thoát khỏi các từ khóa.


Ít nhất bạn có thể thoát khỏi một số khoảng trắng và nếu là :) 141:function g(s){p=n=-1;for(i=0;i<s.length;i++){p=n;n=s.charCodeAt(i)-97;n>17&&n--;n>23&&n--;if(~p)continue;if(~(p/3)==~(n/3))return 0}return 1}
Trình tối ưu hóa

Bạn sử dụng rất nhiều điều thú vị trong câu trả lời của bạn mà tôi chưa từng thấy trước đây. Tôi thường viết bằng C ++ nhưng tôi nghĩ rằng tôi nên thử JS vì nó nhanh hơn để kiểm tra trực tuyến.
Lozzaaa

Tôi chỉ tìm thấy nơi này ngày hôm nay và nghĩ rằng tôi sẽ cho nó một shot. Lần thử tiếp theo của tôi sẽ vượt trội: D
Lozzaaa

Bạn có thể làm cho mã của mình ngắn hơn bằng cách thay thế !=vòng lặp for bằng a <.
Chương trìnhFOX

Vâng, đó là trong tối ưu hóa của Trình tối ưu hóa :) những nghi thức sử dụng đề xuất của mọi người trong câu trả lời của tôi là gì? Bây giờ có một mục JavaScript khác mà tôi có thể đánh bại bằng cách chấp nhận những sửa đổi đó.
Lozzaaa

4

c, 74 byte

main(c,d,r){for(;~(c=getchar());r*=d!=c/3,d=c/3)c-=--c/'p'*(c-'k')/7;c=r;}

Trả về trạng thái thoát khác không cho TRUE và 0 cho FALSE:

$ for s in "x" "aardvark" "ardvark" "flonk" "im codegolfing all day long" "i indulge in minimizing bytecount" "havent heard from you in a long time" "your silence was of undue permanence" "how are  you" "how are you"; do echo "./3310 <<< \"$s\" returns $(./3310 <<< "$s"; echo $?)"; done
./3310 <<< "x" returns 40
./3310 <<< "aardvark" returns 0
./3310 <<< "ardvark" returns 216
./3310 <<< "flonk" returns 0
./3310 <<< "im codegolfing all day long" returns 0
./3310 <<< "i indulge in minimizing bytecount" returns 72
./3310 <<< "havent heard from you in a long time" returns 0
./3310 <<< "your silence was of undue permanence" returns 232
./3310 <<< "how are  you" returns 0
./3310 <<< "how are you" returns 8
$ 

Bạn có thể lưu 3 byte bằng cách thay đổi whilethành for(;c=~getchar();d=c/3)byte và byte khác bằng cách thay đổi đầu tiên của bạn ifthành ?:toán tử.
Allbeert

@ Allbeert - Cảm ơn. Dấu ngoặc xung quanh c=getchar()được yêu cầu mặc dù vì ~có độ ưu tiên cao hơn =. Tuy nhiên, tôi sẽ lấy hai byte còn lại :)
Chấn thương kỹ thuật số

Đối với bit cuối cùng, một cái gì đó như exit(d!=c/3);thay vì if(d==c/3)exit(0);làm việc?

@professorfish Điều đó sẽ khiến lối ra vào thời điểm đó trở nên vô điều kiện, điều mà tôi không muốn
Chấn thương kỹ thuật số

Bạn có thể lưu một ký tự với r * = d ^ c / 3
Alchymist

3

Ruby 1.8, 89 83 81 78 byte

p$*[0].chars.map{|c|c=c[0];(c-c/?p-c/?w-1)/3}.each_cons(2).map{|a,b|a!=b}.all?

Đây là một đệ trình khác. Để xấu hổ của tôi, nó đánh bại regex. :

Điều này nhận chuỗi thông qua đối số dòng lệnh và in một boolean.

Đối với thuật toán, tôi chuyển xuống các chữ cái sau pmột và zhai, và sau đó tôi kiểm tra xem không có xung đột nào sau khi chia số nguyên cho 3.

PS: Đây là lần đầu tiên, việc sử dụng Ruby 1.8 rút ngắn mã (do cách ngắn hơn để lấy mã ký tự).


3

Rắn hổ mang - 80

def f(s)
    for c in s
        for x in 9,if' adgjmptw'[x]>c,break
        t,f=x,t<>x
    print f

3

JavaScript (ES6) 66 74

F=s=>[...s].every(c=>[...' adgjmptw'].map(x=>s+=c<x,w=s,s=0)|s!=w)

Vòng lặp bên trong tìm nhóm cho mỗi nhân vật. Về mặt khái niệm là "giảm" nhưng "bản đồ" thì ngắn hơn. Vòng lặp bên ngoài so sánh nhóm các ký tự liên tiếp và thoát với false nếu chúng bằng nhau.

Kiểm tra trong bảng điều khiển Firefox / Fireorms

;["x","aardvark","ardvark","flonk","im codegolfing all day long",
"i indulge in minimizing bytecount","havent heard from you in a long time",
"your silence was of undue permanence","how are  you","how are you"]
.forEach(x=>console.log(x + ' -> ' + F(x)))

Đầu ra

x -> true
aardvark -> false
ardvark -> true
flonk -> false
im codegolfing all day long -> false
i indulge in minimizing bytecount -> true
havent heard from you in a long time -> false
your silence was of undue permanence -> true
how are  you -> false
how are you -> true

Bạn có thể làm .somethay vì mỗi. Bởi vì ngay cả khi nó thất bại một lần, câu trả lời là sai lệch.
Tối ưu hóa

@Optimizer someeveryđang thay thế cho nhau, loay hoay với các điều kiện. Nhưng ở đây chỉ đơn giản là đặt somethay vì everysẽ không hoạt động, hãy thử nó.
edc65

Hmm, bạn đã đúng. Tôi cần hiểu logic của bạn trước.
Tối ưu hóa

Xin đừng bận tâm nếu tôi bắt đầu sử dụng [...s].everythủ thuật này trong các gôn của mình :)
Trình tối ưu hóa

2

Perl, 83 byte

$_=<>;chop;map{$_=ord;$_=($_-$_/112-$_/119-1)/3;die 0 if$l==$_;$l=$_}split//;die 1

Lạm dụng nặng nề $ _ trong Perl.


1
Như bạn có thể quan sát, được phép truyền các tham số dòng lệnh cho trình thông dịch, chỉ cần bạn phải đếm các tham số phụ. (Tối thiểu cần thiết để truy cập mã, -etrong Perl, là miễn phí.) 71 ký tự thay thế bằng các tham số dòng lệnh : perl -nlaF -e 'map{$_=ord;$_=($_-$_/112-$_/119-1)/3;die 0 if$l==$_;$l=$_}@F;die 1'.
manatwork

@manatwork bạn không cần -l, nhưng có vẻ tốt!
hmatt1

@chilemagic, tôi chỉ cố gắng sao chép mã gốc tương đương, vì vậy tôi đã thêm -lthay thế cho chop. Nhưng tất nhiên, bạn đúng.
manatwork

Cảm ơn @manatwork, tôi thậm chí không nghĩ đến việc sử dụng các tùy chọn dòng lệnh cho Perl.
mcreenan

2

Hai nhiệm vụ khó khăn trong Python; phát hiện chuỗi, và phân công các nhóm. Cả hai có thể được hỗ trợ bằng cách sử dụng numpy, nhưng nó không có trong thư viện tiêu chuẩn.

Python 2 (chỉ thư viện chuẩn) - Hàm 59 ký tự

from itertools import imap as M
from __builtin__ import bytearray as A, all as E
from operator import ne as D, not_ as N
from re import S, sub as X, search as F

# 68
#def f(s):
# g=[(n-n/115-n/61)/3for n in A(s)]
# return E(M(D,g,g[1:]))

# 67 with regex via regex
#f=lambda s:N(F(X('(\S)(.)',r'|[\1-\2]{2}','  acdfgijlmopstvwz'),s))

# 59 slightly optimized ordinal classifier and regex sequence detector
f=lambda s:N(F(r'(.)\1',A((n-n/23-n/30)/3for n in A(s)),S))

# 69 using itertools.groupby
#from itertools import groupby as G
#from __builtin__ import sum as S, len as L
#f=lambda s:N(S(L(A(g))-1for _,g in G((n-n/115-n/61)/3for n in A(s))))

Python 2 (chỉ thư viện chuẩn) - 53 ký tự stdin để thoát giá trị

Ở đây tôi lạm dụng thực tế rằng issubclass(bool,int), vì vậy thay đổi all()để mang lại cho any()tôi một giá trị thoát hợp lệ, loại bỏ not()giá trị trả về. Việc loại bỏ chức năng trên không làm cho các phiên bản regex bị tụt lại về kích thước.

from itertools import groupby as G, imap as M
from __builtin__ import bytearray as A, any as E
from __builtin__ import raw_input as I
from sys import exit as Q
from operator import eq as S

g=[(n-n/23-n/30)/3for n in A(I())]
Q(E(M(S,g,g[1:])))

2

J - 42 char

Chức năng lấy chuỗi bên phải.

*/@(2~:/\(I.4 3 4 1,~5#3){~(u:97+i.26)&i.)

Đầu tiên chúng ta ánh xạ bảng chữ cái ( u:97+i.26) thành các số từ 0 đến 25, tất cả các ký tự khác (bao gồm cả khoảng trắng) sẽ chuyển sang 26 ( i.). Sau đó, chúng tôi ánh xạ ( {~) ba yếu tố đầu tiên ánh xạ tới phím đầu tiên, ba yếu tố tiếp theo sang phím tiếp theo, và thông qua các phím của bàn phím điện thoại, đảm bảo ánh xạ khoảng trắng / dấu chấm câu khác sang một phím riêng ở cuối . ( 4 3 4 1,~5#3bằng 3 3 3 3 3 4 3 4 1I.biến nó thành một mảng gồm 27 mục trong đó ba mục đầu tiên là khóa 1, v.v.) Sau đó, chúng tôi kiểm tra bất đẳng thức cặp ( 2~:/\) và AND tất cả các kết quả cùng nhau ( */).

   */@(2~:/\(I.4 3 4 1,~5#3){~(u:97+i.26)&i.) 'i indulge in minimizing bytecount'
1
   f =: */@(2~:/\(I.4 3 4 1,~5#3){~(u:97+i.26)&i.)
   f 'im codegolfing all day long'
0
   f '*/@(2~:/\(I.4 3 4 1,~5#3){~(u:97+i.26)&i.)'  NB. no -3 bonus :(
0

2

Vợt, 119

(define(f t)(for*/and([s(map ~a'(abc def ghi jkl mno pqrs tuv wxyz))][i s][j s])(not(regexp-match(format"~a~a"i j)t))))

Ungolfed (regexic regexing):

(define(f t)
  (for*/and([s (map ~a '(abc def ghi jkl mno pqrs tuv wxyz))]
            [i s]
            [j s])
    (not (regexp-match (format "~a~a" i j) t))))

1

JavaScript - 152

Không phải là một người chiến thắng nhưng tôi đã cho nó một shot. Beats @Lozzaaa bằng 4 byte khi thời gian đăng bài :)

function m(a){c="abc-def-ghi-jkl-mno-pqrstuv-wxyz";j=a.split("");for(z in j)if(j[z]=Math.floor(c.indexOf(j[z])/4),0!=z&&j[z-1]==j[z])return 0;return 1};

Vượt qua tất cả các bài kiểm tra.
Tận dụng lợi thế của việc thiếu gõ của JS để tạo một mảng nhiều loại và nó tận dụng lợi thế của indexOf trả về -1 để hỗ trợ không gian.

Sử dụng:

m("string here")

Giả sử các ký tự chữ cái thường và chỉ khoảng trắng. Trả về 1 cho đúng, 0 cho sai.

Có lẽ nếu tôi biết ES6, tôi có thể thử thách thứ hai ...


"nếu chỉ ..." - Bạn có thấy câu trả lời của tôi không? : P
Trình tối ưu hóa

Có tôi đã làm. Tôi không biết ES6 (chưa), thật đáng buồn. Tuy nhiên, điều này thật thú vị để thực hiện.
DankMeme

Vâng, giải pháp của bạn bằng cách sử dụng một cách tiếp cận thú vị.
Tối ưu hóa

1

ES6, JavaScript 89 70 ký tự

Tôi biết nó không phải là một người chiến thắng bởi vì khi đến với các hoạt động tiện dụng như nhận được giá trị ASCII của nhân vật, JS đặt rất nhiều sự phình to ( .charCodeAt()).

N=s=>[...s].every(c=>l-(l=(c.charCodeAt()-(c>"r")-(c>"y")-1)/3|0),l=1)

Chạy nó trong Bảng điều khiển web của Firefox mới nhất.

Sử dụng:

N("testing if this works")

Hàm trả về đúng hoặc sai.

EDIT : Chơi golf rất nhiều bằng cách sử dụng[...x].every Chơi golf mẹo học được từ @ edc65 (Cảm ơn!)

Tôi sẽ cố gắng để chơi nó nhiều hơn :)


0

GML (Ngôn ngữ nhà sản xuất trò chơi), 149

s=argument0p=n=-1for(i=0;i<string_length(s);i++){p=n;n=string_char_at(s,i)-97;x=n>17&&n--;x=n>23&&n--‌​;if(!p)x=1if(!(p/3)=!(n/3))x=0}show_message(x)

0

Python 3 - 152 ký tự

Không phải là ngắn nhất tôi có thể đi, nhưng nó sẽ làm ngay bây giờ

k=['abc','def','ghi','jkl','mno','pqrs','tuv','wxyz',' ']
x=input()
l=2>1
for i in range(len(x)-1):
 for j in k:
  if x[i+1] in j and x[i] in j:l=1>2
print(l)
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.