อย่า google“ google”


158

เราทุกคนรู้ว่าถ้าคุณ google คำว่า "google" มันจะทำลายอินเทอร์เน็ต

งานของคุณคือการสร้างฟังก์ชั่นที่ยอมรับหนึ่งสตริงและส่งคืนความยาวในอักขระ Unicode ที่เป็นไปได้น้อยที่สุด

อย่างไรก็ตามหากสตริงที่กำหนดคือgoogle(ตัวพิมพ์เล็ก) ก็จะทำให้เกิดข้อผิดพลาด

ตัวอย่างเช่นg('bing')จะกลับมา4แต่g('google')จะทำให้เกิดข้อผิดพลาด

โปรดระบุตัวอย่างการใช้งานและข้อผิดพลาดหากเป็นไปได้


122
ฉันgoogled googleและ Google พบ Google บน Google ตำนานถูกจับ
Geobits

86
@Geobits นั่นเป็นเพียงการทดสอบเพื่อดูว่าฉันจะ google Google ซึ่งฉันจะไม่ : D
rybo111

7
ฟังก์ชันจำเป็นต้องคำนึงถึงตัวพิมพ์เล็กหรือไม่ มันควรจะโยนให้ 'gOOgle' ไหม
AXMIM

2
เมื่อฉันพิมพ์ google เป็น google (แถบการค้นหาบนโครม) มีข้อความปรากฏขึ้นถามว่าฉันต้องการไปหรือไม่ googleหรือไม่ (ตอนนี้มันเป็น tld สิ่งนี้สมเหตุสมผลแล้วเช่นcom.google ใช้งานได้) ฉันคลิกและได้รับข้อผิดพลาดในการค้นหา dns อินเทอร์เน็ต: เสีย!
Craig

4
ฉันโหวตให้เปิดใหม่ ฉันไม่เคยเห็นคำถามเกี่ยวกับสิ่งที่ถือเป็นข้อผิดพลาดสำหรับความท้าทายนี้และมีคำตอบ 154 ข้อดังนั้นฉันคิดว่ามันไม่ยุติธรรมเลยที่จะเปลี่ยนข้อมูลจำเพาะ นี่อาจไม่ใช่ตัวอย่างของคำถามที่ดี แต่ชัดเจนเพียงพอ หากคำตอบจริง ๆ ลงไปว่าเอาต์พุตบางตัวเป็นข้อผิดพลาดหรือไม่มันอาจจะไม่ได้รับการอัปโหลดจำนวนมาก
โผล่

คำตอบ:


228

Python 2, 29

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

ให้ZeroDivisionErrorบน"google"และความยาวเป็นอย่างอื่น นี้ใช้ประโยชน์ของบูลี ธ เท่ากับและ01


2
+1 คุณต้องตั้งค่าgเป็นของคุณlambdaหรือเรียกมันโดยไม่ระบุตัวตนพร้อมอินพุต
Zach Gates

4
เพื่อความสนุกฉันลองใช้เทคนิคนี้กับ JavaScript ES6 มันจบลงที่ 25 แต่ส่งกลับInfinityสำหรับ "google" แทนที่จะโยนข้อผิดพลาด ...
ETHproductions

18
@ZachGates ฉันทามติเกี่ยวกับ metaคืออนุญาตให้ใช้ฟังก์ชันที่ไม่ระบุตัวตนยกเว้นว่าไม่ได้รับอนุญาตเป็นพิเศษ เนื่องจากคำถามดูเหมือนจะบอกเป็นนัยถึงสิ่งนี้ (แต่ยังไม่อนุญาตอย่างชัดเจน) คุณควรถาม OP เกี่ยวกับเรื่องนี้
FryAmTheEggman

3
@Kevin คุณจะต้องมีreturnถ้าคุณใช้def
FryAmTheEggman

3
ด้วยความประหลาดใจการแปลเป็น Pyth นี้ทำได้ดีกว่าโซลูชัน Pyth ที่ดีที่สุดก่อนหน้าของฉัน มันคือL/lbnb"google13 ไบต์
isaacg

107

Excel, 23 ตัวอักษร

วางสิ่งนี้ลงในเซลล์อื่นที่ไม่ใช่ A1 และพิมพ์คำค้นหาของคุณลงใน A1

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

ตัวอย่างเช่น:

GoogleGoogle


9
ฉันทามติทั่วไปเกี่ยวกับการใช้ Excel คืออะไร
Beta Decay

52
@BetaDecay ความคิดสร้างสรรค์ผิดปกติดูเหมือนว่าจะทำงาน จะไม่สามารถใช้กับปริศนา CG ทั้งหมด แต่อยู่ที่นี่!
kdbanman

119
ผู้จัดการรักมัน!
lkraider

18
มีประสิทธิภาพมากผู้ใช้ CG จะไม่ชอบคุณ แต่เดี๋ยวก่อน. B3 จะเปลี่ยนชีวิตของคุณตลอดไป!
Sumurai8 8

8
ข้อสรุปเฉพาะในการใช้ Excel คืออะไร
GreenAsJade

81

C #, 43 ไบต์

การปรับปรุงคำตอบของ Salah Alami เรียกใช้ซ้ำเพื่อยกเว้นสแต็กโอเวอร์โฟลว์ที่ระบุ "google"

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

2
ใช่ฉันคิดว่านั่นเป็นวิธีที่ชาญฉลาดในการบันทึกตัวละครบางตัวเพื่อยกเว้น ที่ 4 ตัวอักษรอาจเป็นวิธีที่เล็กที่สุดในการโยนข้อยกเว้นใน C # ไม่แน่ใจ
DLeh

6
นี่มันฉลาด! แต่รุ่นล่าสุดของ C # มีการสนับสนุนrecursion หางStackOverflowExceptionเพื่อฟังก์ชั่นนี้จะไม่โยน ในความเป็นจริงมันจะไม่กลับมา (ทำงานเหมือนwhile(true){})
NightElfik

2
@DLeh Tail recursion call นั้นค่อนข้างยุ่งยาก คุณต้องเรียกใช้บน x64 JIT และไม่มีดีบักเกอร์ (การดีบักเกอร์ที่แนบมาจะทำให้การเรียกซ้ำหางไม่ทำงานด้วยเหตุผลที่ชัดเจน) นี่คือโปรแกรมของฉันเพื่อเป็นหลักฐาน: imgur.com/ErNl8LJและการอ่านเพิ่มเติมเกี่ยวกับการเรียกซ้ำแบบหางเล็กน้อย : blogs.msdn.com/b/davbr/archive/2007/06/20/… ;)
NightElfik

12
ฮ่าฮ่า: g (สายอักขระ) ... ฉันจะเห็นตัวเองออกมา ...
gregsdennis

1
@DLeh โอ้รอไม่ฉันสามารถจับคู่ 43 ไบต์ของคุณ แต่ไม่ชนะ :) int g (string s) => s! = "google"? s.Length: s [9];
lee

57

Pyth, 14 13 ตัวอักษร

L/lbnb"google

yกำหนดฟังก์ชันการตั้งชื่อ

สิ่งนี้หารความยาวด้วย 1 ถ้าสตริงไม่ใช่googleและเป็น 0 มิฉะนั้น ความคิดไม่ใช่เรื่องแปลกใหม่ แต่ฉันคิดขึ้นมาเอง

ลองออนไลน์

มันทำงานอย่างไร

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

ใช่ฉันไม่แน่ใจเกี่ยวกับเรื่องนี้จริง ๆ ฉันไม่คิดว่ามันจะเกิดขึ้นมาก่อนด้วยสาย โดยปกติคุณสามารถปิดได้;แต่เห็นได้ชัดว่าคุณไม่สามารถอยู่ที่นี่ ...
FryAmTheEggman

คุณไม่จำเป็นต้องพูดจบ
Maltysen

48
" กำหนดฟังก์ชั่นการตั้งชื่อy. " แต่ไม่มีyในรหัสของคุณ !?
อัล

46
@AL ถูกต้อง ในตัวLนิยามฟังก์ชันyใหม่
เดนนิส

90
ฉันไม่แน่ใจ แต่ฉันคิดว่าฉันเกลียด Pyth
นาย Lister

40

MATLAB, 63 41 40 38 36 ไบต์

ขอบคุณ Tom Carpenter ที่ช่วยกำจัด 1 ไบต์!

ขอบคุณ Stewie Griffin สำหรับการโกนหนวด 2 ไบต์!

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

ซึ่งแตกต่างจากการแก้ปัญหาที่สง่างามมากขึ้นอื่น ๆ ดำเนินการส่วนหนึ่งโดยการดำเนินการศูนย์ใน MATLAB จะไม่ให้เกิดข้อผิดพลาด Infแต่ การแก้ปัญหานี้พบว่าความยาวของสตริงโดยnnzการแก้ปัญหานี้พบว่าความยาวของสตริงโดยสตริงที่ผลิตนั้นเป็นแบบที่คุณทำดัชนีจากจุดเริ่มต้นของสตริงจนถึงจุดสิ้นสุดซึ่งเป็นสำเนาของสตริง 'google'แต่สิ่งที่สำคัญคือจุดเริ่มต้นของการที่จะเข้าถึงสตริงที่ผลิตโดยการตรวจสอบหรือไม่ว่าการป้อนข้อมูลที่มีค่าเท่ากับ หากไม่ใช่นี่จะสร้างดัชนีเริ่มต้นที่ 1 และเราจัดทำดัชนีลงในสตริงตามปกติ ... เนื่องจาก MATLAB เริ่มทำดัชนีที่ 1 ควรเป็นเท่ากันดัชนีที่ผลิตคือ 0 และ MATLAB จะโยนข้อผิดพลาดการทำดัชนีระบุว่า ดัชนีต้องเป็นจำนวนเต็มบวก ความพิเศษ+เพื่อให้มั่นใจว่าการส่งออกของการตรวจสอบความเสมอภาคเป็นตัวเลขมากกว่าแบบบูลlogical/ การละเว้น+จะสร้างคำเตือน แต่เนื่องจากข้อกำหนดของความท้าทายนี้ไม่อนุญาตให้มีคำเตือน+จึงจำเป็นต้องใช้ ... ดังนั้นจึงต้องกรอกรหัส

ตัวอย่างการใช้

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

รุ่นที่สนุกสนานยิ่งขึ้น83 77 76 74 72 ไบต์

ขอบคุณ Tom Carpenter ที่ช่วยกำจัด 1 ไบต์!

ขอบคุณ Stewie Griffin สำหรับการโกนหนวด 2 ไบต์!

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

ข้างต้นไม่ใช่การส่งอย่างเป็นทางการ แต่เป็นสิ่งที่สนุกยิ่งขึ้นในการใช้งาน เหยียดหยามevalภายในฟังก์ชั่นที่ไม่ระบุชื่อสิ่งที่รหัสไม่สามารถที่จะตรวจสอบเพื่อดูว่าสายป้อนเท่ากับ'google'... และถ้ามันเป็นอย่างนี้จะเปิดขึ้นในตัวเว็บเบราว์เซอร์ของ MATLAB และแสดงหน้าข้อผิดพลาด 404 ของ Google พยายามที่จะเข้าถึง หน้าย่อยอยู่ที่iเมื่อไม่มีอยู่ ถ้าไม่เราแสดงความยาวของสตริงตามปกติ

ตัวอย่างการใช้

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

ans =

     4

>> f('google')
>> 

การโทรครั้งสุดท้ายที่ใช้'google'ทำให้หน้าจอนี้:

ป้อนคำอธิบายรูปภาพที่นี่


3
คุณสามารถประหยัดไบต์โดยใช้แทนstrcmp isequal
Tom Carpenter

@TomCarpenter - ตลก ฉันบอกตัวเองให้ใช้strcmpแต่สุดท้ายก็ใช้isequalด้วยเหตุผลบางอย่าง .... ขอบคุณ!
rayryeng

1
nnznumelเป็นสองไบต์สั้นกว่า คุณได้รับการโหวตของฉันเมื่อไม่กี่ปีที่ผ่านมา :-)
Stewie Griffin

31

JavaScript ES6, 34 27 25 ตัวอักษร

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

เปิดการอ้างอิงข้อผิดพลาดΔสำหรับ google


10
คุณสามารถใช้ผู้ประกอบการที่ประกอบไปด้วยเพื่อบันทึกสองไบต์
Konrad Borowski

2
ใช่นั่นคือสิ่งที่ฉันเพิ่งได้รับ หากคุณต้องการที่จะแฟนซีให้ใช้สัญลักษณ์ที่คนไม่เคยใช้แทน g เพื่อให้แน่ใจว่ามันจะไม่มีอยู่ในตัวแปรส่วนกลาง Δสร้างชื่อตัวแปรที่ดี :)
โดมิโน

1
คุณสามารถใช้#มันเป็นข้อผิดพลาดใน JS afaik
clap

7
Δ Google Illuminati ยืนยันแล้ว
DynamiteReed

2
ฉันแค่จะออกจากที่นี่github.com/Rabrennie/anything.js
sagiksp

26

TI-BASIC ขนาด 15 ไบต์

ในขณะที่เราอยู่ที่นี่เฮ็คก็อาจได้รับคำตอบจาก TI-BASIC มาด้วย

"string":prgmNAMEรูปแบบอินพุตเป็น ขอมอบเครดิตให้กับThomas Kwaสำหรับการค้นหาครั้งแรก!

length(Ans)+log(Ans≠"GOOGLE

(คำแนะนำ: เพิ่ม 1 ไบต์สำหรับตัวอักษรพิมพ์เล็กแต่ละตัวแทนตัวพิมพ์ใหญ่หนึ่งตัวดังนั้นs/GOOGLE/google/g => +6 bytes)

กรณีทดสอบ ahhhhh!

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

20 length(Ans)/(Ans≠"googleไบต์: คุณยังมีกรณีที่ผิด; หากได้รับอนุญาตตัวพิมพ์ใหญ่จะมีขนาด 14 ไบต์ โดยวิธีการที่มันจะถูกต้องผ่านข้อโต้แย้งผ่าน Ans
lirtosiast

AGOOGLEควรให้ 7 ถูกต้องไหม และคุณไม่ควรนับส่วนหัวของโปรแกรมในขนาดรหัสของคุณดังนั้นลบ 10 ไบต์
lirtosiast

ข้อผิดพลาด:ฉันกำลังคิดถึงสตริงย่อย โปรดยกโทษให้ฉัน
Conor O'Brien

1
@ThomasKwa ฉันไม่เห็นความคิดเห็นของคุณด้วยรหัส มันเกิดขึ้นจนเราทั้งคู่สะดุดกับวิธีแก้ปัญหาเดียวกัน อย่างไรก็ตามหากคุณเชื่อว่าคุณสมควรได้รับเครดิตเครดิตนั้นจะเป็นของคุณ ^ _ ^ ( แก้ไขถ้าคุณจะอ่านรหัสมันไม่เหมือนกันแน่นอน)
Conor O'Brien

@lirtosiast length(มีสองไบต์ซึ่งจะทำให้ตัวเลขของคุณ 21 และ 15 ไบต์
Timtech

23

APL (14)

(⍴÷'google'∘≢)

คำอธิบาย:

  • : ความยาว
  • ÷: หารด้วย
  • 'google∘≢: อาร์กิวเมนต์ไม่เท่ากับ'google'

ให้ความยาวของสตริงซึ่งหารด้วย 1 ถ้าสตริงไม่เท่ากันgoogle(ซึ่งให้ความยาวกลับไม่เปลี่ยนแปลง) หรือ 0 ถ้าสตริงไม่เท่ากันgoogle(ให้ข้อผิดพลาด)


11
ฉันคิดว่าคุณไม่จำเป็นต้องนับ parens เพราะมันสามารถถูกกำหนดให้กับตัวแปรโดยไม่มีพวกมัน
jimmy23013

ชนิดของความล้มเหลวในข้อโต้แย้งเดียวถ่าน แก้ไขโดยการแทนที่ด้วย นอกจากนี้คุณยังสามารถทำให้มันเย็นมองโดยการแลกเปลี่ยนตัวถูกดำเนินการของ โอ้อย่าลืมลบ parens รวมทุกอย่าง:≢÷≢∘'google'
Adám

21

Python 3, 30 ไบต์

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

จัดทำดัชนีรายการฟังก์ชัน 1 องค์ประกอบโดยเพิ่มIndexErrorเงื่อนไขถ้าu=='google'เป็นTrue(= 1) ฟังก์ชั่นดังกล่าว

หลากหลายรูปแบบ ว้าว:

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

หากความท้าทายกลับด้าน (ข้อผิดพลาดในทุกสิ่งที่ไม่ใช่ "google") สามารถบันทึกตัวอักษร:

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

แต่คุณรู้ความยาวอยู่แล้วดังนั้นลองใส่ฮาร์โค้ด


ทำงานกับ python 2.7 ด้วย
Noodle9

ด้วยเหตุผลบางอย่างฉันชอบวิธีนี้
foslock

19

Haskell, 24 ไบต์

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

เอาท์พุท:

Main> g "google"

Program error: pattern match failure: g "google"

Main> g "bing"
4

15

CJam, 16 ตัวอักษร

{_,\"google"=!/}

สิ่งนี้หารความยาวด้วย 1 ถ้าสตริงไม่ใช่googleและเป็น 0 มิฉะนั้น ความคิดไม่ใช่เรื่องแปลกใหม่ แต่ฉันคิดขึ้นมาเอง

ลองออนไลน์

มันทำงานอย่างไร

_                 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.

ที่น่าสนใจพอโปรแกรมเต็มรูปแบบสั้น (15 q_,\"google"=!/bytes): พัฒนาก่อนที่จะเห็นโพสต์นี้ โปรดทราบว่านี่ใช้อินพุตทั้งหมด (ซึ่งคุณดูเหมือนว่าจะเป็นอาร์กิวเมนต์ของฟังก์ชัน) น่าเสียดายที่คุณไม่สามารถใช้งานได้เนื่องจากสิ่งนี้ขอฟังก์ชั่น :(
Erik the Outgolfer

15

อ็อกเทฟ 63 ไบต์

ฉันรู้ว่ามันยาวกว่าโซลูชัน Matlab (ซึ่งจะทำงานใน Octave ด้วย) แต่มันก็ชั่วร้ายเป็นพิเศษ ฉันกำลังสร้างฟังก์ชั่นที่ไม่ระบุชื่อ (ความชั่วร้าย) โดยใช้ตัวอักษร (ชั่วร้าย) ของเซลล์อาร์เรย์ (ความชั่วร้าย) ที่มีฟังก์ชั่นที่จับขึ้นอยู่กับฟังก์ชั่นการโทรกลับ (ตัวเองจึงเรียกซ้ำความชั่วร้าย) จากนั้นฉันจะสร้างแบบไม่ระบุตัวตนอีกอันที่ช่วยลดฟังก์ชั่นอาร์กิวเมนต์สตริงและแก้ไขข้อโต้แย้งที่สองของfเป็นf(ชั่วร้ายมาก) มนุษย์ที่มีสติจะไม่ทำสิ่งนี้เพราะมันเกือบจะอ่านไม่ได้เหมือน Perl หรือ regex (หรือ cjam / pyth / esolang อื่น ๆ )

ดังนั้นหากสตริงไม่ใช่ 'google' อาร์กิวเมนต์ที่สองของอาร์เรย์เซลล์จะถูกเรียกใช้ซึ่งจะแสดงผลตามความยาวของสตริง มิฉะนั้นฟังก์ชั่นแรกจะถูกเรียกซึ่งถูกส่งผ่านเป็นโทรกลับ (และผ่านตัวเองเป็นโทรกลับไปยังตัวเองเกินไป) ซึ่งในภายหลังเป็นฟังก์ชั่นของตัวเอง ข้อผิดพลาดนั้นเป็นข้อผิดพลาดความลึกของการเรียกซ้ำสูงสุด

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

2
สิ่งเหล่านั้นไม่ได้เลวร้ายในภาษาส่วนใหญ่ และนี่คือรหัสกอล์ฟมีรหัสที่อ่านไม่ได้มากที่สุดในโลกอยู่ที่นี่ :) btw จับเย็น
BAR

9
ฉันแค่คิดถึงบางอย่างevalที่นี่เพื่อทำให้เป็นจริงชั่วร้าย :-)
Luis Mendo

12

JavaScript ขนาด 25 ไบต์

ตัวอย่าง JavaScript ที่ดีและเรียบง่าย:

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

หากป้อน "google" แล้วจะส่ง a ReferenceError

ตัวอย่าง

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


2
ว้าวขอบคุณที่บอกฉันว่ามีฟังก์ชั่นย่อของ lamda ใน javascript!
Tomáš Zato

3
@ TomášZato Caveat: พวกเขาเป็นแบรนด์ใหม่ใน ES2015ดังนั้นการสนับสนุนยังคงแตกต่างกันไป
Anko

11

APL, 19 17 ไบต์

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

googleนี้เป็นฟังก์ชั่นเอกชื่อที่จะโยนความผิดพลาดทางไวยากรณ์ถ้าใส่เป็น นี่คือความสำเร็จโดยพยายามที่จะใช้ลอการิทึมธรรมชาติของอะไร

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

ลองออนไลน์

บันทึกสองไบต์ด้วยเดนนิส!


เป็นที่รู้จักกันอย่างไม่เป็นทางการว่า "splat" ชื่อที่เหมาะสมมากสำหรับการใช้งานนี้
อดัม

9

R, 46 ไบต์

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

โพสต์ดั้งเดิมไม่เคยระบุว่ารหัสจะต้องมีรูปแบบที่ถูกต้องเว้นแต่ว่าฉันกำลังอ่านผิด

ตัวอย่าง:

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

ฉันไม่เคยเพิ่มอะไรสำหรับพารามิเตอร์ "no" ของคำสั่ง ifelse ดังนั้นมันจะส่งคืนข้อผิดพลาดหากพารามิเตอร์นี้ปรากฏขึ้น


10
นี่คือสั้นกว่าเล็กน้อย:g=function(x)nchar(x)[[x!="google"]]
จำลอง

9

Perl, 31 29 ไบต์

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

-2b ต้องขอบคุณการจัดการ

การใช้งาน:

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

ถ้าฉันสามารถออกไปกับโปรแกรมมากกว่าฟังก์ชั่นต่อไปนี้จะใช้ได้กับ 20 ไบต์เท่านั้น (บรรทัดคำสั่ง +1 ไบต์)

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

ข้อผิดพลาดคือการหารด้วยศูนย์

คำอธิบาย:

y///cส่งคืนความยาวจากนั้น!/^google$/จะส่งคืน 0 iff ที่ตรงกับ 'google'

การใช้งาน:

perl -p entry.pl input.txt

2
คุณสามารถทำให้มันเป็นฟังก์ชั่นนิรนาม: sub{…}. (จากนั้นคุณเรียกมันว่าsub{…}->("google").)
manatwork

บันทึก 1 ไบต์โดยใช้$_!=googleแทน!/^google$/
Gabriel Benamy

@GabrielBenamy ฉันเกรงว่า!=จะไม่ทำงานเพื่อเปรียบเทียบสตริง ...
Dada

7

Haskell - 30 ตัวอักษร

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

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

6
ทำไมเครื่องหมายอัศเจรีย์สำหรับข้อผิดพลาด? สตริงว่างจะไม่ทำด้วยหรือไม่
Kritzefitz

1
ฉันอยากจะแนะนำให้เปลี่ยนเป็นx=x;g"google"=x;g s=length sแต่ด้วยเหตุผลบางอย่าง <<ลูป>> ข้อยกเว้นจะไม่ถูกโยนลงใน ghci
Kritzefitz

17
g s|s/="google"=length sหลีกเลี่ยงความต้องการerror
chs

7

Python 3, 35 ไบต์

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

1
@FryAmTheEggman จริงสั้นกว่า 16 บิต XD
DiegoDD

1
@FryAmTheEggman: เคล็ดลับดี แต่รหัสไม่ได้ทำงานกับสตริงที่ว่างเปล่า:(lambda n:len(n)*(n!='google')or d)('')
pabouk

@pabouk ค่อนข้างถูกต้องขอบคุณที่ชี้ให้เห็น
FryAmTheEggman

7

Java 7: 53 52 ไบต์

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

รหัสข้างต้นจะโยนArithmeticExceptionสำหรับหารด้วยศูนย์และสำหรับการใด ๆStringอื่น ๆ googleกว่า ควรทราบว่า==เปรียบเทียบการอ้างอิงและจะไม่ทำงานกับStringวัตถุ

Java 8: 29 ไบต์

(ตามข้อเสนอแนะที่ให้ไว้ในความคิดเห็นด้านล่าง)

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

1
คุณสามารถใช้การประกาศแลมบ์ดาของ Java 8:s->(s.equals("google")?null:s).length();
hjk

3
"ควรทราบว่า == เปรียบเทียบการอ้างอิงและจะไม่ทำงานกับวัตถุ String" ที่จริงแล้วสตริงทั้งหมดเป็นวัตถุดังนั้นการเปรียบเทียบสตริงด้วย==ใน Java จะไม่ทำงาน (ยกเว้นว่าคุณใช้สตริงการฝึกงานซึ่งก็คือแย่มาก) บางทีคุณอาจสับสนกับ JavaScript?
gengkev

1
@gengkev หากทั้งสองเป็น litterals มันจะทำงานได้เพราะมันเป็นวัตถุเดียวกับที่อ้างถึงใน Pool String ข้อมูลจำเพาะให้ครอกและที่นี่เป็นครอกดังนั้นมันจะทำงาน
Yassin Hajaj

2
@ YassinHajaj ฉันยอมรับว่าสเป็คให้มันเป็นตัวอักษร แต่นั่นเป็นเพียงตัวอย่าง ฟังก์ชั่นน่าจะทำงานเหมือนกันถ้าให้อินพุตจาก stdin เช่นกันหรือถ้าฟังก์ชันถูกเรียกใช้จากคลาสอื่นที่คอมไพล์แยกต่างหาก ไม่ว่าในกรณีใดการพึ่งพาการเพิ่มประสิทธิภาพคอมไพเลอร์ (การฝึกงานสตริง) เป็นความคิดที่ไม่ดีซึ่งเป็นสิ่งที่ฉันพูดไว้ในตอนแรก
gengkev

7

C ++ 11, 54 (รหัส) + 14 (#include) = 68

การหารด้วยศูนย์เป็นเพียงพฤติกรรมที่ไม่ได้กำหนดซึ่งฉันจะไม่เรียกข้อผิดพลาด ดังนั้นวิธีการของฉัน

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

การใช้

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

1
คุณสามารถโทรsize()เพื่อบันทึก 2 ไบต์ ใน C ++ 14 คุณยังสามารถใช้ lambdas ทั่วไปและแทนที่โดยstd::string autoคุณจะต้องผ่านที่เกิดขึ้นจริงกับมันแทนstd::string const char*
isanae

@isanae ฉันไม่รู้ว่าstd::stringมีsize()วิธีการขอบคุณสำหรับสิ่งนั้น ฉันรู้ lambdas ทั่วไปใน C ++ 14 แต่ผมไม่ทราบว่ามันจะช่วยให้ผมตั้งแต่"string"มีและไม่ได้const char* std::string
Zereges

1
@Zereges std::stringมีsize()และlength()เพราะมันเป็นทั้งภาชนะบรรจุและสตริง ในฐานะที่เป็นautoคุณต้องการเรียกแลมบ์ดากับแทน(std::string("google")) ("google")คำถามเพียงกล่าวว่า "ยอมรับ 1 สตริง" โดยไม่ระบุว่า "สตริง" คืออะไร
isanae

@isanae C ++ 14 นอกจากนี้ยังมี"google"sการสร้างstd::string:)
เควนติน

@Zereges คุณสามารถthrow;เรียกstd::terminate()(เพราะไม่มีข้อยกเว้นในปัจจุบันที่นี่)
เควนติน

6

MUMPS ขนาด 28 ไบต์

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

การใช้งาน:

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

<SELECT>g^MYROUTINE

ทำไม? ดี$S[ELECT]เป็นพื้นขนาดกะทัดรัดหลายประโยคถ้า-อื่นงบ - เกือบจะเหมือนรูปแบบการแข่งขันในภาษาเช่น Haskell หรือสนิม ยกเว้น ... ไม่เหมือนใน Haskell หรือ Rust รูปแบบจะไม่ถูกตรวจสอบว่าหมดแรงเพราะแนวคิดของ "ความปลอดภัยเวลารวบรวม" นั้นต่างจาก MUMPS อย่างสมบูรณ์ ดังนั้นหากใส่ของคุณเป็นรูปแบบที่คุณไม่ได้บัญชีสำหรับคุณจะได้รับข้อผิดพลาด runtime <SELECT>น่ารักที่เรียกว่า


6

ทับทิม, 34 30 27 26

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

ไม่รู้จักtยกข้อยกเว้น

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

แก้ไข: รุ่นที่สามารถอ่านได้และชัดเจนซึ่งสั้นกว่า ...

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

เก่า: ค่อนข้างคล้ายกับแนวคิดอื่น ๆ ที่ดูเหมือน จะเพิ่มArgumentErrorหาก x คือ 'google'


2
ทำไมต้องเป็นวงเล็บ x=='google'?t: x.size
จัดการ

6

จาวาสคริปต์, 47 ไบต์

ดีและเรียบง่าย

แก้ไข:ตอนนี้สอดคล้องกับกฎ

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

การทดสอบ

เกิดข้อผิดพลาด

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

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

ไม่มีข้อผิดพลาดเกิดขึ้น

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

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


ในทางเทคนิคแล้วสิ่งนี้ไม่เป็นไปตามข้อกำหนดของ OP ฟังก์ชั่นนี้จะแจ้งเตือนความยาว undefinedแต่ผลตอบแทน
Bungle

@Bungle เป็นไงบ้างตอนนี้?
Beta Decay

1
@ บังอาจฉันเห็น ฉันลืมว่าจำเป็นต้องมีการส่งคืน
สลายตัวเบต้า

1
ด้วยการใช้ฟังก์ชั่นลูกศรของ ES6 และผู้ประกอบการที่ประกอบไปด้วยสามส่วน (แทนถ้า) คุณสามารถบีบให้มันเพิ่มขึ้นอีกนิด :)
Carles Alcolea

1
@BetaDecay Originality ก่อน ฉันเคารพมัน
Carles Alcolea

6

C, 66 48

เดิม:

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

ใช้ OSX gcc,
l("duck");ผลตอบแทน4, สาเหตุ
l("google");Floating point exception: 8

บนแพลตฟอร์มอื่นค่าคงที่อาจต้องมีการปรับเพื่อ endianness

สั้น :

ความยุ่งยากน้อยกว่าผลลัพธ์เดียวกัน

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

ว้าวนั่นเป็นตรรกะที่น่าสนใจ ถ้าฉันเข้าใจส่วนที่ถูกต้องคุณจะขยับตัวอักษรหกตัวแรกให้พอดีกับเลขตัวยักษ์ตัวเดียว (เกือบเหมือนแฮช) ซึ่งเนื่องจากกองเล็ก ๆ ที่เป็น endian กลายเป็น "google" แต่ ไปข้างหลัง ( 0x656c676f6f67= elgoog) ฉันคิดว่าคำตอบนี้ต้องการคำอธิบายสำหรับพวกเราที่ชื่นชมสิ่งต่ำ ๆ แบบนี้
Braden ที่ดีที่สุด

โดยทั่วไปคุณมีมัน มันเพียงแค่โยนหน่วยความจำที่เก็บสตริงเป็นจำนวน 64 บิต Endianness ทำให้มัน 'ถอยหลัง' ในสถาปัตยกรรม x86 ข้อความนี้มีขนาดเพียง 7 ไบต์ดังนั้นหน้ากากจะซ่อนอะไรก็ตามที่อยู่ในหน่วยความจำถัดไป มันเป็นกลลวงสนุก แต่ฉันคิดว่า '!! strcmp (s, "google")' นั้นสั้นกว่าจริง
AShelly

1
อย่างไรก็ตาม +1 อย่างแน่นอน. นอกจากนี้ฉันคิดว่าคุณสามารถย่อให้สั้นลงได้โดยลบint ตัวอักษรนั่นคือ 4 ตัว
Braden ที่ดีที่สุด

หลังจากพิมพ์เสร็จฉันก็รู้! หากchar *มีหน่วย8-bitsเป็นหล่อจะlong *มีหน่วย64-bitsโดยไม่ต้องถูกจัดสรรอย่างถูกต้องของข้อมูลในบรรดา 8 ไบต์ของพื้นที่กองเกิดความเสียหายและถือว่าเป็นหมายเลขเดียว ( 8*8 = 64) นั่นเป็นเหตุผลที่คุณได้รับ 6 ตัวอักษรแรก + NUL + ขยะ นั่นฉลาดมาก อันตรายเช่นกัน สงสัยว่าทำไมมันถึงไม่แยกกัน ไบต์ขยะที่ 8 นั้นอยู่นอกขอบเขตใช่ไหม
Braden ที่ดีที่สุด

ฉันดูการวิเคราะห์ของคุณ คุณถูกต้องการเปลี่ยนแปลงควรมี 56 ไม่ใช่ 54 นอกจากนี้ฉันจะไม่ใช้คำที่เสียหาย หน่วยความจำเท่ากันบิตจะถูกตีความต่างกัน ในทางเทคนิคการเข้าถึงไบต์ขยะเป็นพฤติกรรมที่ไม่ได้กำหนดไว้และอาจทำให้เกิดข้อผิดพลาดได้จริง ในทางปฏิบัติไบต์นั้นเกือบจะแน่นอนอยู่ในบล็อกหน่วยความจำทางกฎหมายแบบเดียวกันกับส่วนที่เหลือของสตริงและโดยทั่วไปบล็อกเหล่านี้ (ฮีปสแต็คค่าคงที่) จะถูกจัดสรรในหน่วยคำขนาดเล็กที่สุด ดังนั้นหน่วยความจำที่เป็นของโปรแกรมมันมีอะไรบางอย่างที่ไม่ใช่สตริง
AShelly

6

Ruby, 29 ไบต์

ฉันมาครั้งแรกกับสิ่งที่คล้ายกับความพยายามครั้งแรกของ @ Borsunho แต่ของฉันก็ยาวขึ้นเล็กน้อยและเขาโพสต์เขาก่อนที่ฉันจะเสร็จ มากับสิ่งนี้ก่อนที่เขาจะแก้ไข 30 ไบต์ :)

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

ตัวอย่างการใช้งาน:

$ 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>'

แก้ไข: สองปีและบางรุ่นทับทิมในภายหลัง

Ruby , 25 ไบต์

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

แทนที่String#sizeด้วยเครื่องหมายบวกใหม่ ลองออนไลน์!


เรียบร้อยฉันไม่สามารถทำงานนี้ได้ (ฉันไม่ได้ออกจาก^การแข่งขันนอกกลุ่ม)
Borsunho

@Borunho ฉันต้องยอมรับว่าฉันแค่ "สัตว์เดรัจฉานบังคับ" regex จนกว่าฉันจะได้รับผลที่ฉันต้องการ :) ฉันคิดว่า.*ในตอนท้ายคือสิ่งที่ทำให้มันทำงาน
daniero

แตกถ้าสตริงอินพุตมีหลายบรรทัดและมี google ในบรรทัดของตัวเอง ฉันคิดว่า/\A(?!google\Z).*/mแก้ไขมัน (ที่ราคาสามไบต์) ^และ$จับคู่จุดเริ่มต้นและจุดสิ้นสุดของบรรทัดในขณะที่\Aและ\Zจับคู่จุดเริ่มต้นและจุดสิ้นสุดของสตริงโดยรวม
ประวัติศาสตร์ 24

@histocrat แต่ฉันไม่คิดว่าคุณสามารถ google สตริงที่มีหลายสาย;)
daniero

4

> <>, 55 ไบต์

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

คิดว่าฉันจะเลิกเล่นเกมนี้ไม่ใช่ความพยายามหรืออัลกอริทึมที่ดีที่สุดของฉัน ไม่ใช่ฟังก์ชั่นต่อ se แต่ฉันคิดว่ามันควรจะมีคุณสมบัติ ฉันจะดูว่าฉันสามารถแก้ไขในรุ่นที่ดีกว่า

หากคุณได้รับอนุญาตให้พิมพ์ความยาวและข้อผิดพลาดต่อไปนี้เป็นวิธีการแก้ปัญหา 46 ไบต์:

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

วิธีแก้ปัญหาก่อนหน้านี้ 49 ไบต์ในลักษณะนี้:

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

ฉันยินดีที่จะอธิบายหากมีสิ่งใดสนใจและโปรดแจ้งให้เราทราบว่ามีอะไรผิดปกติกับคำตอบของฉันหรือถ้าคุณมีคำแนะนำในการเล่นกอล์ฟ


4

Javascript ES6, 51 27 25 ไบต์

สวัสดีฉันยังใหม่กับการตีกอล์ฟดังนั้นนี่อาจจะเป็นกอล์ฟมากกว่านี้ แต่ที่นี่จะไป:

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

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

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

และการทดสอบบางอย่าง:

(_=>_=="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

แก้ไข: เพิ่มแล้ว? เพื่อแทนที่ถ้าและแทนที่ข้อผิดพลาดด้วยวัตถุที่ไม่ได้กำหนด

แก้ไข 2: ฉันรู้ว่าจำนวนไบต์ของฉันผิดและลบ g =


4

GolfScript, 14 16 ตัวละคร

{.,\'google'=!/}

เช่นเดียวกับคนอื่น ๆ เพียงแค่เปรียบเทียบอินพุต'google'และหารความยาวโดยอินเวอร์สของผลลัพธ์

โปรแกรมตัวอย่าง:


@ เดนนิสฉันเห็นประเด็นของคุณ ในรูปแบบดั้งเดิมมันไม่สามารถนำกลับมาใช้ใหม่ได้อย่างแน่นอน (คุณทำไม่ได้พูดว่าใช้รหัสกับรายการ) นอกจากนี้ฉันไม่ได้ตระหนักว่าคุณได้เขียนคำตอบที่เหมือนกันเกือบทุกอย่างใน CJam ก่อนที่ฉันจะโพสต์ข้อความนี้ +1 สำหรับโซลูชันของคุณเช่นกัน
pswg

4

ติดอยู่ 16 ไบต์

s_l1u"google"=-/

การทำตามวิธีการที่คล้ายกันกับคนส่วนใหญ่จะทำให้เกิดข้อผิดพลาด 0 โดยแบ่งเป็น "google"


4

Windows Batch 118 ตัว

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

ผลผลิตคือ% stringlength%

รหัสเต็ม:

@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

ดัดแปลงจากคำตอบของโจชัว Honig ของที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.