Đừng google google google google


158

Chúng ta đều biết rằng nếu bạn google từ "google" thì nó sẽ phá vỡ internet.

Nhiệm vụ của bạn là tạo một hàm chấp nhận một chuỗi và trả về độ dài của nó, trong một vài ký tự Unicode có thể có.

Tuy nhiên, nếu chuỗi đã cho là google(chữ thường), nó sẽ gây ra lỗi.

Ví dụ, g('bing')sẽ trở lại 4nhưng g('google')sẽ gây ra lỗi.

Vui lòng cung cấp một ví dụ về việc sử dụng và lỗi nếu có thể.


122
Tôi googled google và Google tìm thấy Google trên Google. Huyền thoại chán nản.
Geobits

86
@Geobits Đó chỉ đơn giản là một thử nghiệm để xem liệu tôi sẽ google Google, điều mà tôi sẽ không làm. : D
rybo111

7
Là chức năng cần phải được phân biệt chữ hoa chữ thường? Nó có nên ném 'gOOgle' không?
AXMIM

2
Khi tôi gõ google vào google (thanh tìm kiếm trên chrome), một thông báo xuất hiện hỏi tôi có muốn truy cập google không . (Bây giờ nó là một tld, điều này có nghĩa là com.google hoạt động). Tôi nhấp vào nó và nhận được một lỗi tra cứu dns. Internet: hỏng!
Craig

4
Tôi đang bỏ phiếu để mở lại điều này. Tôi đã không thấy câu hỏi nào về lỗi gì cho thử thách này và nó đã có 154 câu trả lời vì vậy tôi không nghĩ việc thay đổi thông số là công bằng. Đây có thể không phải là một ví dụ về một câu hỏi hay nhưng nó đủ rõ ràng. Nếu một câu trả lời thực sự đi đến việc liệu một đầu ra nhất định có phải là một lỗi hay không thì dù sao đi nữa, có lẽ họ sẽ không nhận được nhiều lượt upvote.
Chọc

Câu trả lời:


228

Con trăn 2, 29

lambda x:len(x)/(x!='google')

Đưa ra một ZeroDivisionErrorngày "google", và độ dài khác. Điều này tận dụng các booleans của Python bằng 01.


2
+1. Bạn cần phải đặt gthành của bạn lambda, hoặc gọi nó ẩn danh với một đầu vào, mặc dù.
Zach Gates

4
Để giải trí, tôi đã thử kỹ thuật này với JavaScript ES6. Nó đã kết thúc ở tuổi 25, nhưng trả về Infinity"google" thay vì đưa ra một lỗi ...
ETHproductions

18
@ZachGates Sự đồng thuận về meta là các chức năng ẩn danh được phép trừ khi không được phép cụ thể. Vì câu hỏi dường như ngụ ý điều gì đó như thế này (nhưng rõ ràng không cho phép nó), nên bạn nên hỏi OP về nó.
FryAmTheEggman

3
@Kevin bạn sẽ cần một returnnếu bạn đã sử dụngdef
FryAmTheEggman

3
Thật thú vị, điều này được dịch sang Pyth làm tốt hơn giải pháp Pyth tốt nhất trước đây của tôi. Đó là L/lbnb"google, 13 byte.
isaacg

107

Excel, 23 ký tự

Dán phần này vào một ô khác với A1 và nhập truy vấn tìm kiếm của bạn vào A1.

=LEN(A1)/(A1<>"google")

Ví dụ:

GoogleGoogle


9
Sự đồng thuận chung về việc sử dụng Excel là gì?
Beta Decay

52
@BetaDecay. Sáng tạo, không phổ biến, dường như làm việc. Sẽ không áp dụng cho tất cả các câu đố CG, nhưng nó ở đây!
kdbanman

119
Các nhà quản lý thích nó!
lkraider

18
Vì vậy, hiệu quả, người dùng CG sẽ ghét bạn vì điều đó. Nhưng đợi đã. B3 sẽ thay đổi cuộc sống của bạn mãi mãi!
Sumurai8

8
Sự đồng thuận cụ thể về việc sử dụng Excel là gì?
GreenAsJade

81

C #, 43 byte

Một cải tiến về câu trả lời của Salah Alami. Đệ quy để ném ngoại lệ ngăn xếp chồng lên việc cung cấp "google"

int g(string s)=>s!="google"?s.Length:g(s);

2
Vâng tôi nghĩ rằng đó là một cách khá thông minh để cứu một số nhân vật để ném một ngoại lệ. Với 4 ký tự, đó có thể là cách nhỏ nhất để đưa ra một ngoại lệ trong C #, không chắc chắn.
DLeh

6
Điều này thật thông minh! Tuy nhiên, các phiên bản gần đây của C # có hỗ trợ đệ quy đuôi nên chức năng này sẽ không bao giờ ném StackOverflowException. Trong thực tế, nó sẽ không bao giờ trở lại (hành xử như while(true){}).
NightElfik

2
@DLeh Đuôi cuộc gọi đệ quy là một chút khó khăn. Bạn phải chạy trên x64 JIT và không có trình gỡ lỗi (trình gỡ lỗi được đính kèm sẽ khiến đệ quy đuôi không hoạt động vì lý do rõ ràng). Đây là chương trình của tôi như một bằng chứng: imgur.com/ErNl8LJ và ít đọc thêm về đệ quy đuôi: blogs.msdn.com/b/davbr/archive/2007/06/20/... ;)
NightElfik

12
Haha: g (chuỗi) ... Tôi sẽ thấy chính mình ...
gregsdennis

1
@DLeh oh chờ không tôi có thể phù hợp với 43 byte của bạn nhưng không đánh bại nó. :) int g (chuỗi s) => s! = "google"? s. Chiều dài: s [9];
lee

57

Pyth, 14 13 ký tự

L/lbnb"google

Xác định một hàm được đặt tên y.

Điều này chia độ dài cho 1 nếu chuỗi không phải là google và 0 khác. Ý tưởng không phải là tiểu thuyết, nhưng tôi đã nghĩ ra nó một cách độc lập.

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

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

L                 Define y(b):
  lb                Compute len(b).
    nb"google       Compute (b != "google").
 /                  Set _ = len(b) / (b != "google").
                  Return _. (implicit)

Vâng tôi thực sự không chắc chắn về điều này, tôi không nghĩ rằng nó đã xảy ra trước đây với một chuỗi. Thông thường bạn có thể đóng nó ;nhưng rõ ràng bạn không thể ở đây ...
FryAmTheEggman

Bạn không cần trích dẫn cuối.
Maltysen

48
" Xác định hàm được đặt tên y. " Nhưng ytrong mã của bạn không có !?
AL

46
@AL Đúng vậy. Việc xây dựng trong Lđịnh nghĩa lại các chức năng y.
Dennis

90
Tôi không chắc, nhưng tôi nghĩ tôi ghét Pyth.
Ông Lister

40

MATLAB, 63 41 40 38 36 byte

Cảm ơn Tom Carpenter đã cạo sạch 1 byte!

Cảm ơn Stewie Griffin đã cạo sạch 2 byte!

@(x)nnz(x(+~strcmp('google',x):end))

Không giống như các giải pháp thanh lịch khác, thực hiện phép chia bằng phép toán zero trong MATLAB sẽ không gây ra lỗi mà thay vào đó Inf. Giải pháp này tìm độ dài của chuỗi bằng nnz. Chuỗi được tạo ra theo cách mà bạn lập chỉ mục từ đầu chuỗi đến cuối, về cơ bản là một bản sao của chuỗi. Tuy nhiên, điều quan trọng là sự bắt đầu của nơi truy cập chuỗi được tạo ra bằng cách kiểm tra xem đầu vào có bằng hay không 'google'. Nếu không, điều này tạo ra chỉ mục bắt đầu là 1 và chúng tôi lập chỉ mục vào chuỗi một cách bình thường ... vì MATLAB bắt đầu lập chỉ mục ở mức 1. Nếu bằng nhau, chỉ mục được tạo là 0 và MATLAB sẽ đưa ra lỗi lập chỉ mục cho biết rằng chỉ số cần phải là một số nguyên dương. Thêm+là để đảm bảo rằng đầu ra của kiểm tra đẳng thức là số chứ không phải Boolean / logical. Việc bỏ qua +sẽ tạo ra một cảnh báo, nhưng vì thông số kỹ thuật của thử thách này không cho phép cảnh báo, nên +bắt buộc ... do đó hoàn tất mã.

Ví dụ sử dụng

>> f=@(x)nnz(x(+~strcmp('google',x):end)) %// Declare anonymous function

f = 

    @(x)nnz(x(+~strcmp('google',x):end))

>> f('bing')

ans =

     4

>> f('google')
Subscript indices must either be real positive integers or logicals.

Error in @(x)nnz(x(+~strcmp('google',x):end))

Một phiên bản thú vị hơn, 83 77 76 74 72 byte

Cảm ơn Tom Carpenter đã cạo sạch 1 byte!

Cảm ơn Stewie Griffin đã cạo sạch 2 byte!

@(x)eval('if strcmp(''google'',x),web([x ''.com/i'']);else nnz(x),end');

Trên đây không phải là một đệ trình chính thức, nhưng đó là một cái gì đó thú vị hơn để chạy. Lạm dụng evaltrong các hàm ẩn danh, mã mà nó kiểm tra để xem chuỗi đầu vào có bằng 'google'... và nếu có, điều này sẽ mở ra trình duyệt web tích hợp của MATLAB và hiển thị trang lỗi 404 của Google đang cố truy cập vào trang con nằm ở iđó khi không tồn tại. Nếu không, chúng tôi hiển thị độ dài của chuỗi bình thường.

Ví dụ sử dụng

>> f=@(x)eval('if strcmp(''google'',x),web([x ''.com/i'']);else nnz(x),end'); %// Declare anonymous function
>> f('bing')

ans =

     4

>> f('google')
>> 

Cuộc gọi cuối cùng sử dụng 'google'cho chúng ta màn hình này:

nhập mô tả hình ảnh ở đây


3
Bạn có thể lưu một byte bằng cách sử dụng strcmpthay vì isequal.
Tom Carpenter

@TomCarpenter - Hài hước. Tôi thực sự nói với bản thân mình để sử dụng strcmpnhưng cuối cùng sử dụng isequalvì một số lý do .... cảm ơn!
rayryeng

1
nnzlà hai byte ngắn hơn numel. Bạn đã có phiếu bầu của tôi vài năm trước :-)
Stewie Griffin

31

JavaScript ES6, 34 27 25 ký tự

f=>f=='google'?Δ:f.length

Ném một ReferenceError Δcho google.


10
Bạn có thể sử dụng một toán tử ternary để lưu hai byte.
Konrad Borowski

2
Yay, đó chính xác là những gì tôi vừa có. Nếu bạn muốn trở nên lạ mắt, hãy sử dụng một biểu tượng mà mọi người không bao giờ sử dụng thay vì g để chắc chắn rằng nó sẽ không tồn tại như một biến toàn cục. Làm cho một tên biến tốt :)
Domino

1
Bạn có thể sử dụng #, nó bị lỗi trong JS afaik
vỗ tay vào

7
Google Illuminati đã được xác nhận
DynamiteReed

2
Tôi sẽ rời khỏi đây github.com/Rabrennie/anything.js
sagiksp

26

TI-BASIC, 15 byte

Heck, trong khi chúng ta đang ở đó , cũng có thể nhận được câu trả lời TI-BASIC ở đây.

Định dạng đầu vào là "string":prgmNAME. Tín dụng cho Thomas Kwa cho việc tìm thấy nó đầu tiên!

length(Ans)+log(Ans≠"GOOGLE

(Hướng dẫn: thêm 1 byte cho mỗi chữ cái viết thường thay thế một chữ hoa. Vì vậy s/GOOGLE/google/g => +6 bytes.)

ahhhhh trường hợp thử nghiệm!

"GOGGLE":prgmG
               6
"BING":prgmG
               4
"GOOGLE":prgmG
           Error

20 byte : length(Ans)/(Ans≠"google. Bạn cũng có trường hợp sai; nếu chữ hoa được cho phép thì 14 byte. Nhân tiện, nó hợp lệ để chuyển các đối số thông qua Ans.
lirtosiast

AGOOGLENên cho 7, đúng không? Và bạn không nên đếm tiêu đề chương trình theo kích thước mã của mình, vì vậy hãy trừ 10 byte.
lirtosiast

LRI: Tôi đã suy nghĩ về chất nền. Xin hãy tha thứ cho tôi.
Conor O'Brien

1
@ThomasKwa Tôi không thấy bình luận của bạn với mã. Nó chỉ xảy ra khi cả hai chúng tôi vấp phải cùng một giải pháp. Tuy nhiên, nếu bạn tin rằng bạn xứng đáng với tín dụng, tín dụng sẽ là của bạn. ^ _ ^ ( EDIT Nếu bạn sẽ đọc mã, đó không phải là điều chính xác.)
Conor O'Brien

@lirtosiast length(là hai byte, điều đó sẽ làm cho số của bạn là 21 và 15 byte.
Timtech

23

APL (14)

(⍴÷'google'∘≢)

Giải trình:

  • : chiều dài
  • ÷: chia
  • 'google∘≢: đối số không bằng 'google'.

đưa ra độ dài của chuỗi, được chia cho 1 nếu chuỗi không bằng nhau google(điều này làm cho độ dài trở lại không thay đổi) hoặc bằng 0 nếu chuỗi không bằng google(đưa ra lỗi).


11
Tôi nghĩ rằng bạn không cần phải đếm số parens, vì nó có thể được gán cho một biến mà không có chúng.
jimmy23013

Loại thất bại trên các đối số char đơn. Khắc phục bằng cách thay thế bằng . Ngoài ra, bạn có thể làm cho nó trông mát mẻ hơn bằng cách hoán đổi toán hạng của . Oh, đừng quên loại bỏ các parens. Tất cả trong tất cả:≢÷≢∘'google'
Adám

21

Python 3, 30 byte

lambda u:[len][u=='google'](u)

Lập chỉ mục danh sách hàm 1 phần tử, tăng một vị từ IndexErrornếu u=='google'vị ngữ là True(= 1). Chức năng như vậy.

Nhiều biến thể. Ồ:

lambda u:[len(u)][u=='google']
lambda u:len([u][u=='google'])

Nếu thử thách bị đảo ngược (lỗi trên mọi thứ không phải là "google"), có thể lưu một char:

lambda u:{'google':len}[u](u)

Nhưng bạn đã biết chiều dài, vì vậy chỉ cần hardcode nó.


cũng hoạt động với python 2.7
Noodle9

Vì một số lý do, tôi thích giải pháp này.
foslock

19

Haskell, 24 byte

g s|s/="google"=length s

Đầu ra:

Main> g "google"

Program error: pattern match failure: g "google"

Main> g "bing"
4

15

CJam, 16 ký tự

{_,\"google"=!/}

Điều này chia độ dài cho 1 nếu chuỗi không phải là google và 0 khác. Ý tưởng không phải là tiểu thuyết, nhưng tôi đã nghĩ ra nó một cách độc lập.

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

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

_                 Push a copy of the string on the stack.
 ,                Compute the length of the copy.
  \               Swap the length and the original string.
   "google"=      Push 1 if the string is "google", 0 otherwise.
            !     Apply logical NOT. Maps 1 to 0 and 0 to 1.
             /    Divide the length by the Boolean.

Thật thú vị, một chương trình đầy đủ ngắn hơn (15 byte) : q_,\"google"=!/. Phát triển nó trước khi xem bài này. Lưu ý rằng điều này có toàn bộ đầu vào (mà bạn dường như lấy bất kỳ cách nào làm đối số chức năng). Thật không may, bạn không thể sử dụng nó, vì điều này yêu cầu một chức năng :(
Erik the Outgolfer

15

Octave, 63 byte

Tôi biết nó dài hơn giải pháp Matlab (cũng sẽ hoạt động trong Octave), nhưng nó đặc biệt xấu. Tôi đang thực hiện một hàm ẩn danh (ác) bằng cách sử dụng mảng ô (ác) nghĩa đen (ác) chứa hàm xử lý phụ thuộc vào hàm gọi lại (do đó, đệ quy, ác) phải được truyền qua đối số. Sau đó, tôi tạo một ẩn danh khác về cơ bản làm giảm hàm thành đối số chuỗi và sửa đối số thứ hai flà as f(rất xấu). Bất kỳ con người lành mạnh nào cũng sẽ không bao giờ làm điều này, bởi vì nó gần như không thể đọc được như Perl hoặc regex (hoặc cjam / pyth / bất kỳ esolang nào khác).

Vì vậy, nếu chuỗi không phải là 'google', đối số thứ hai của mảng ô sẽ được gọi sẽ tạo ra độ dài của chuỗi. Nếu không, hàm đầu tiên sẽ được gọi, được truyền dưới dạng gọi lại (và cũng tự chuyển dưới dạng gọi lại cho chính nó) mà sau này là chính hàm đó. Lỗi cơ bản là một số lỗi độ sâu đệ quy tối đa.

f=@(s,f){@()f(s,f),numel(s)}{2-strcmp(s,'google')}();@(s)f(s,f)

2
Những điều đó không phải là xấu trong hầu hết các ngôn ngữ. Và đây mã golf, một số mã khó đọc nhất trên hành tinh tồn tại ở đây :). Tay cầm mát mẻ btw.
BAR

9
Tôi chỉ thiếu một số evalở đây để làm cho nó thực sự
NGAY LẬP TỨC

12

JavaScript, 25 byte

Ví dụ JavaScript đẹp và đơn giản:

e=>e!='google'?e.length:g

Nếu "google" được nhập thì nó sẽ vượt qua ReferenceError

Thí dụ

alert((e=>e!='google'?e.length:g)('test'))


2
Ồ, cảm ơn vì đã cho tôi biết có một tốc ký cho các chức năng lamda trong javascript!
Tomáš Zato

3
@ TomášZato Caveat: chúng hoàn toàn mới trong ES2015 , vì vậy sự hỗ trợ vẫn thay đổi.
Anko

11

APL, 19 17 byte

{⍵≡'google':⍟⋄≢⍵}

Đây là một hàm đơn âm chưa được đặt tên sẽ đưa ra lỗi cú pháp nếu đầu vào là google. Điều này được thực hiện bằng cách cố gắng lấy logarit tự nhiên không có gì.

{
 ⍵≡'google':          ⍝ If the right argument is "google"...
            ⍟⋄        ⍝ Compute log(<nothing>), which brings only sadness
              ≢⍵      ⍝ Otherwise compute the length
}

Dùng thử trực tuyến

Đã lưu hai byte nhờ Dennis!


được gọi một cách không chính thức là "splat". Một cái tên rất thích hợp cho việc sử dụng này.
Adám

9

R, 46 byte

g=function(x)ifelse(x!="google",nchar(x),)

Trừ khi tôi đọc sai, bài viết gốc không bao giờ quy định rằng mã phải đúng cú pháp.

Thí dụ:

> g("bing")
[1] 4
> g("google")
Error in ifelse(x != "google", nchar(x), ) : 
  argument "no" is missing, with no default

Tôi không bao giờ thêm bất cứ điều gì cho tham số "không" của câu lệnh ifelse vì vậy nó sẽ trả về lỗi nếu tham số này được gợi lên.


10
Đây là một cái ngắn hơn một chút:g=function(x)nchar(x)[[x!="google"]]
flodel

9

Perl, 31 29 byte

sub{$_=pop;y///c/!/^google$/}

-2b nhờ thao tác

Sử dụng:

sub{$_=pop;y///c/!/^google$/}->("google")

Nếu tôi có thể thoát khỏi một chương trình chứ không phải là một hàm, thì sau đây sẽ hợp lệ chỉ với 20 byte (dòng lệnh +1 byte)

$_=y///c/!/^google$/

Lỗi là chia cho số không.

Giải trình:

y///ctrả về độ dài, sau đó !/^google$/sẽ trả về 0 iff đầu vào khớp với 'google'.

Sử dụng:

perl -p entry.pl input.txt

2
Bạn có thể làm cho nó một chức năng ẩn danh : sub{…}. (Sau đó, bạn gọi nó như thế sub{…}->("google").)
manatwork

Tiết kiệm 1 byte bằng cách sử dụng $_!=googlethay vì!/^google$/
Gabriel Benamy

@GabrielBenamy Tôi sợ !=sẽ không hoạt động để so sánh chuỗi ...
Dada

7

Haskell - 30 ký tự

g"google"=error"!";g s=length s

>g "google"
 *Exception: !
>g "str"
 3

6
Tại sao dấu chấm than cho lỗi? Sẽ không có một chuỗi trống làm quá?
Kritzefitz

1
Tôi muốn đề nghị thay đổi nó thành x=x;g"google"=x;g s=length s, nhưng vì một số lý do, << loop >> ngoại lệ không bị ném vào ghci.
Kritzefitz

17
g s|s/="google"=length stránh sự cần thiết choerror
chs

7

Python 3, 35 byte

lambda n:len(n)if n!='google'else d

1
@FryAmTheEggman thực sự ngắn hơn 16 bit. XD
DiegoDĐ

1
@FryAmTheEggman: Thủ thuật hay nhưng id không hoạt động với chuỗi rỗng:(lambda n:len(n)*(n!='google')or d)('')
pabouk

@pabouk Hoàn toàn đúng, cảm ơn vì đã chỉ ra điều đó.
FryAmTheEggman

7

Java 7: 53 52 byte

int g(String _){return"google"==_?0/0:_.length();} 

Mã trên sẽ ném ArithmeticException để chia cho số không và cho bất kỳ Stringkhác google. Đáng lưu ý rằng ==so sánh tham chiếu và sẽ không hoạt động cho Stringcác Đối tượng.

Java 8: 29 byte

(Dựa trên đề xuất được đưa ra dưới bình luận)

s->s=="google"?0/0:s.length()

1
Bạn cũng có thể sử dụng khai báo lambda của Java 8:s->(s.equals("google")?null:s).length();
hjk

3
"Đáng lưu ý rằng == so sánh tham chiếu và sẽ không hoạt động đối với Chuỗi đối tượng." Trên thực tế, tất cả các chuỗi đều là các đối tượng, do đó, việc so sánh các chuỗi với ==trong Java nói chung sẽ không hoạt động (trừ khi bạn dựa vào thực tập chuỗi, điều này tốt, xấu). Có lẽ bạn đã nhầm lẫn với JavaScript?
gengkev

1
@gengkev Nếu cả hai đều là rác, nó sẽ hoạt động vì nó là cùng một đối tượng được tham chiếu trên nhóm Chuỗi. Thông số kỹ thuật cho một lứa và ở đây nó là một rác để nó hoạt động.
Yassin Hajaj

2
@YassinHajaj Tôi đồng ý rằng thông số kỹ thuật mang lại cho nó như một nghĩa đen, nhưng đó chỉ là một ví dụ. Hàm có thể cũng sẽ thực hiện tương tự nếu được đưa vào từ stdin hoặc nếu hàm được gọi từ một lớp khác được biên dịch riêng. Trong mọi trường hợp, dựa vào tối ưu hóa trình biên dịch (thực tập chuỗi) là một ý tưởng tồi, đó là những gì tôi đã nói ban đầu.
gengkev

7

C ++ 11, 54 (mã) + 14 (#include) = 68

Chà, chia cho số 0 chỉ là hành vi không xác định, mà tôi sẽ không gọi là lỗi. Vì vậy, cách tiếp cận của tôi.

#include<ios>
[](std::string s){return s!="google"?s.size():throw;};

sử dụng

[](std::string s){return s!="google"?s.size():throw;}("google");

1
Bạn có thể gọi size()để lưu 2 byte. Trong C ++ 14, bạn cũng có thể sử dụng lambdas chung và thay thế std::stringbằng auto. Bạn cần truyền một thực tế std::stringcho nó thay vì a const char*.
isanae

@isanae Tôi không biết std::stringsize()phương pháp, cảm ơn vì điều đó. Tôi biết về lambdas chung trong C ++ 14, nhưng tôi không biết nó sẽ giúp tôi như thế nào, vì "string"const char*và không std::string.
Zereges

1
@Zereges std::stringsize()length()bởi vì nó vừa là một container và một chuỗi . Đối với auto, bạn sẽ gọi lambda với (std::string("google"))thay vì ("google"). Câu hỏi chỉ nói "chấp nhận 1 chuỗi" mà không chỉ định "chuỗi" là gì.
isanae

@isanae C ++ 14 cũng "google"sphải xây dựng một std::string:)
Quentin

@Zereges bạn chỉ có thể throw;kích hoạt std::terminate()(vì không có ngoại lệ hiện tại ở đây).
Quentin

6

MUMPS, 28 byte

g(s) q $S(s'="google":$L(s))

Sử dụng:

>w $$g^MYROUTINE("bing")                                      
4
>w $$g^MYROUTINE("google")

<SELECT>g^MYROUTINE

Tại sao? Chà, $S[ELECT]về cơ bản là một tuyên bố đa mệnh đề nhỏ gọn - gần giống như một mô hình khớp trong một ngôn ngữ như Haskell hoặc Rust. Ngoại trừ ... không giống như trong Haskell hoặc Rust, các mẫu không được kiểm tra tính toàn diện, bởi vì khái niệm "an toàn thời gian biên dịch" hoàn toàn xa lạ với MUMPS. Vì vậy, nếu đầu vào của bạn là một mẫu mà bạn không tính đến, bạn sẽ gặp một lỗi thời gian chạy đáng yêu được gọi <SELECT>.


6

Ruby, 34 30 27 26

->x{x=='google'?t: x.size}

Không biết tlàm tăng ngoại lệ.

->x{x=='google'?fail():x.size}

Chỉnh sửa: phiên bản hoàn toàn dễ đọc và rõ ràng ngắn hơn ...

->x{x[x=~/^(?!google$)/..-1].size}

Cũ: Khá giống với những ý tưởng khác có vẻ như. Sẽ tăng ArgumentErrornếu x là 'google'.


2
Tại sao những dấu ngoặc đơn? x=='google'?t: x.size
manatwork

6

JavaScript, 47 byte

Đẹp và đơn giản.

Chỉnh sửa: Bây giờ tuân thủ các quy tắc

function f(g){if(g=="google")a;return g.length}

Kiểm tra

Lỗi ném

function f(g){if(g=="google")a;return g.length}

alert(f("Hello"))
alert(f("google"))
alert(f("hi"))

Không có lỗi ném

function f(g){if(g=="google")a;return g.length}

alert(f("Hello"))
alert(f("bing"))
alert(f("hi"))


Về mặt kỹ thuật, điều này không đáp ứng thông số kỹ thuật của OP. Hàm này cảnh báo độ dài nhưng trả về undefined.
Bungle

@Bungle Bây giờ thế nào rồi?
Beta Decay

1
@Bungle tôi thấy. Tôi quên rằng cần phải có sự quay trở lại
Beta Decay

1
Sử dụng các hàm mũi tên của ES6 và toán tử ternary (thay vì if), bạn có thể siết chặt hơn một chút :)
Carles Alcolea

1
@BetaDecay Nguyên bản đầu tiên; Tôi tôn trọng điều đó.
Carles Alcolea

6

C, 66 48

Nguyên:

int l(long*s){return strlen(s)/((*s&~(-1L<<56))!=0x656c676f6f67);}

Sử dụng OSX gcc,
l("duck");trả lại 4,
l("google");nguyên nhân Floating point exception: 8.

Trên các nền tảng khác, các hằng số có thể cần được điều chỉnh về độ bền.

Ngắn hơn :

ít khó khăn hơn, kết quả tương tự.

 l(int*s){return strlen(s)/!!strcmp(s,"Google");}

Wow, đó là một số logic thú vị ở đó. Nếu tôi hiểu đúng về phần chơi gôn, bằng cách nào đó, bạn đang chuyển sáu ký tự đầu tiên để khớp với một số khổng lồ duy nhất (gần giống như một hàm băm), do ngăn xếp là cuối cùng nhỏ, cuối cùng là "google", nhưng ngược ( 0x656c676f6f67= elgoog). Tôi nghĩ rằng câu trả lời này cần một lời giải thích cho những người trong chúng ta đánh giá cao loại công cụ cấp thấp điên rồ này.
Braden tốt nhất

Bạn cơ bản có nó. Nó chỉ đơn giản là ép bộ nhớ lưu trữ chuỗi thành một số 64 bit. Endianness làm cho nó 'lạc hậu' trên các kiến ​​trúc x86. Văn bản chỉ chiếm 7 byte, vì vậy mặt nạ chỉ ẩn bất cứ điều gì có thể tiếp theo trong bộ nhớ. Đây là một mẹo thú vị, nhưng tôi nghĩ '!! strcmp (s, "google")' thực sự ngắn hơn.
HỎI NGÀY

1
Dù sao, +1. Chắc chắn rồi. Ngoài ra, tôi nghĩ bạn có thể rút ngắn nó bằng cách loại bỏ int 4 ký tự đó.
Braden tốt nhất

Sau khi gõ một số , tôi đã tìm ra nó! Nếu char *, với các đơn vị 8-bits, được truyền tới long *, với các đơn vị 64-bits, mà không được phân bổ lại chính xác, dữ liệu trong 8 byte không gian heap đó sẽ bị hỏng và được coi là một số duy nhất ( 8*8 = 64). Đó là lý do tại sao bạn nhận được 6 ký tự đầu tiên, + NUL + rác. Điều đó rất thông minh. Nguy hiểm quá. Tự hỏi tại sao nó không segfault. Đó là byte rác thứ 8 nằm ngoài giới hạn, phải không?
Braden hay nhất

Tôi nhìn vào phân tích của bạn. Bạn đã đúng, sự thay đổi nên là 56, không phải 54. Ngoài ra, tôi sẽ không sử dụng từ bị hỏng. Bộ nhớ là như nhau, các bit chỉ được giải thích khác nhau. Về mặt kỹ thuật, truy cập byte rác là hành vi không xác định và thực sự có thể segfault. Thực tế, byte đó gần như chắc chắn nằm trong cùng một khối bộ nhớ hợp pháp với phần còn lại của chuỗi và nói chung các khối này (heap, stack, hằng) được phân bổ ở mức tối thiểu các đơn vị có kích thước từ. Vì vậy, bộ nhớ thuộc về chương trình, nó chỉ chứa một cái gì đó ngoài chuỗi.
HỎI NGÀY

6

Ruby, 29 byte

Lần đầu tiên tôi nghĩ ra thứ gì đó rất giống với nỗ lực đầu tiên của @ Borsunho, nhưng của tôi hơi dài hơn và anh ấy đã đăng bài của mình trước khi tôi hoàn thành. Đã đến với điều này trước khi chỉnh sửa 30 byte của mình :)

->s{s[/^(?!google$).*/].size}

Ví dụ sử dụng:

$ irb
2.2.1 :001 > f = ->s{s[/^(?!google$).*/].size}
 => #<Proc:0x007fa0ea03eb60@(irb):1 (lambda)> 
2.2.1 :002 > f[""]
 => 0 
2.2.1 :003 > f["bing"]
 => 4 
2.2.1 :004 > f["google"]
NoMethodError: undefined method `size' for nil:NilClass
  from (irb):1:in `block in irb_binding'
  from (irb):4:in `[]'
  from (irb):4
  from /Users/daniel/.rvm/rubies/ruby-2.2.1/bin/irb:11:in `<main>'

chỉnh sửa: Hai năm và một số phiên bản Ruby sau

Ruby , 25 byte

->s{+s[/^(?!google$).*/]}

Thay thế String#sizebằng dấu cộng đơn mới. Hãy thử trực tuyến!


Gọn gàng, tôi không thể làm việc này được (tôi đã không nghĩ ra việc rời khỏi ^nhóm đối thủ).
Borsunho

@Borsunho Tôi phải thừa nhận rằng tôi chỉ "vũ phu" cho đến khi tôi nhận được kết quả mà tôi muốn :) Tôi nghĩ rằng .* cuối cùng là điều làm cho nó hoạt động.
daniero

Phá vỡ nếu chuỗi đầu vào có nhiều dòng và chứa google trên dòng riêng của nó. tôi nghĩ/\A(?!google\Z).*/m sửa nó (với chi phí là ba byte). ^$khớp với đầu và cuối của dòng, trong khi \A\Z khớp phần đầu và phần cuối của chuỗi.
lịch sử

@histocrat nhưng tôi không nghĩ bạn có thể google chuỗi với nhiều dòng;)
daniero

4

> <>, 55 byte

i:0(?v
31&l~<v0"google"~~.?%2l
$v?(2l<S?*=2l=6:+={
&<;n

Hình tôi sẽ cho điều này đi, mặc dù không phải là nỗ lực hoặc thuật toán chơi golf tốt nhất của tôi. Không phải là một chức năng mỗi se, nhưng tôi nghĩ rằng điều này vẫn nên đủ điều kiện. Tôi sẽ xem liệu tôi có thể chỉnh sửa trong phiên bản tốt hơn không.

Nếu bạn được phép in độ dài và sau đó lỗi, đây là giải pháp 46 byte:

i:0(?v
2lnl~<v0"google";?%
$;?(2l<S?*=2l=6:+={

Giải pháp 49 byte trước đó có tính chất này:

i:0(?v
l0nl~<v;!?=7
:;?(2l<S?*=2l=6:+=@@g3
elgoog

Tôi rất vui khi đưa ra lời giải thích nếu có bất kỳ mối quan tâm nào, và vui lòng cho tôi biết nếu có bất cứ điều gì sai với câu trả lời của tôi hoặc nếu bạn có đề xuất chơi gôn.


4

Javascript ES6, 51 27 25 byte

Xin chào, tôi chưa quen với môn đánh gôn nên điều này có thể được chơi gôn nhiều hơn, nhưng rồi đây:

_=>_=="google"?a:_.length

g=_=>_=="google"?a:_.length

g=_=>{if("google"==_)throw Error();return _.length}

và một số thử nghiệm:

(_=>_=="google"?a:_.length)("bing")//4
(_=>_=="google"?a:_.length)("google")// Error: a is not defined

g("bing")// returns 4
g("google")// Error: a is not defined

Chỉnh sửa: Đã thêm? để thay thế if và thay thế Error bằng một đối tượng không xác định.

Chỉnh sửa 2: Tôi nhận ra số byte của mình bị sai và xóa g =


4

GolfScript, 14 16 ký tự

{.,\'google'=!/}

Giống như nhiều người khác, chỉ cần so sánh đầu vào với 'google' và chia độ dài cho nghịch đảo của kết quả.

Chương trình ví dụ:


@Dennis Tôi thấy quan điểm của bạn. Ở dạng ban đầu, nó không thể tái sử dụng chính xác (bạn không thể nói rằng hãy áp dụng mã trên một danh sách). Ngoài ra, tôi đã không nhận ra rằng bạn đã viết một câu trả lời gần như giống hệt nhau trong CJam trước khi tôi đăng bài này (thực ra tôi chỉ biết mơ hồ về CJam như một ngôn ngữ cho đến bây giờ). +1 cho giải pháp của bạn, quá.
pswg

4

Bị kẹt , 16 byte

s_l1u"google"=-/

Theo một phương pháp tương tự với hầu hết mọi người, sẽ gây ra lỗi chia cho 0 khi "google" được nhập.


4

Windows Batch, 118 ký tự

IF /I "%string%"=="google" exit
echo %string%> string.txt
for %%? in (string.txt) do ( SET /A stringlength=%%~z? - 2 )

Đầu ra là% stringlength%.

Mã đầy đủ:

@echo off
del string.txt
cls
echo Type your string
echo.
set /p string=String:
IF /I "%string%"=="google" goto err
echo %string%> string.txt
for %%? in (string.txt) do ( SET /A stringlength=%%~z? - 2 )
cls
echo %stringlength%
pause
del string.txt
:err
color c
echo There seems to be an error with your input...
pause>nul

Sửa đổi từ câu trả lời của Joshua Honig, ở đây .

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.