Jangan google "google"

158

Kita semua tahu bahwa jika Anda google kata "google" itu akan merusak internet.

Tugas Anda adalah membuat fungsi yang menerima satu string dan mengembalikan panjangnya, dengan karakter Unicode yang sesedikit mungkin.

Namun, jika string yang diberikan adalah google(huruf kecil), itu akan menyebabkan kesalahan.

Misalnya, g('bing')akan kembali 4tetapi g('google')akan menyebabkan kesalahan.

Harap berikan contoh penggunaan, dan kesalahan jika memungkinkan.

rybo111
sumber
122
Saya googled google , dan Google menemukan Google di Google. Mitos Rusak.
Geobits
86
@ Geobits Itu hanyalah sebuah tes untuk melihat apakah saya akan google Google, yang saya tidak akan. : D
rybo111
7
Apakah fungsi tersebut harus peka terhadap huruf besar-kecil? Haruskah itu diberikan 'gOOgle'?
AXMIM
2
Ketika saya mengetik google di google (bilah pencarian di chrome), sebuah pesan muncul menanyakan apakah saya ingin pergi ke google . (Sekarang ini adalah tld, ini masuk akal yaitu com.google berfungsi). Saya mengkliknya dan mendapat kesalahan pencarian dns. Internet: rusak!
Craig
4
Saya memberikan suara untuk membuka kembali ini. Saya tidak melihat ada pertanyaan tentang apa yang merupakan kesalahan untuk tantangan ini dan sudah ada 154 jawaban jadi saya pikir tidak adil untuk mengubah spesifikasi. Ini mungkin bukan contoh pertanyaan yang bagus tapi cukup jelas. Jika sebuah jawaban benar-benar turun ke apakah output tertentu adalah kesalahan atau tidak, mungkin saja tidak akan mendapatkan banyak upvotes.
Poke

Jawaban:

228

Python 2, 29

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

Memberi ZeroDivisionErroron "google", dan panjangnya sebaliknya. Ini mengambil keuntungan dari menyamakan boolean Python 0dan 1.

Tidak
sumber
2
+1. Anda perlu mengatur gke Anda lambda, atau menyebutnya secara anonim dengan input.
Zach Gates
4
Hanya untuk bersenang-senang, saya mencoba teknik ini dengan JavaScript ES6. Itu berakhir pada 25, tetapi kembali Infinityuntuk "google" bukannya melemparkan kesalahan ...
ETHproduksi
18
@ZachGates Konsensus tentang meta adalah bahwa fungsi anonim diizinkan kecuali secara khusus tidak diizinkan. Karena pertanyaannya memang menyiratkan sesuatu seperti ini (tetapi belum secara eksplisit melarangnya), Anda harus bertanya kepada OP tentang hal itu.
FryAmTheEggman
3
@Kevin Anda akan memerlukannya returnjika Anda menggunakandef
FryAmTheEggman
3
Yang mengherankan, ini diterjemahkan ke Pyth lebih baik daripada solusi Pyth terbaik saya sebelumnya. Yaitu L/lbnb"google, 13 byte.
isaacg
107

Excel, 23 karakter

Rekatkan ini ke sel selain A1 dan ketik permintaan pencarian Anda ke A1.

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

Sebagai contoh:

GoogleGoogle

Makanan Tangan
sumber
9
Apa konsensus umum tentang penggunaan Excel?
Beta Decay
52
@BetaDecay. Kreatif, tidak biasa, tampaknya berhasil. Tidak akan berlaku untuk semua teka-teki CG, tetapi ada di sini!
kdbanman
119
Manajer menyukainya!
lkraider
18
Sangat Efisien, Pengguna CG Akan Membenci Anda karenanya. Tapi tunggu. B3 Akan Mengubah Hidup Anda Selamanya!
Sumurai8
8
Apa konsensus spesifik tentang penggunaan Excel?
GreenAsJade
81

C #, 43 byte

Peningkatan atas jawaban Salah Alami. Berulang-ulang untuk melempar pengecualian stack overflow pada penyediaan "google"

int g(string s)=>s!="google"?s.Length:g(s);
DLeh
sumber
2
Ya saya pikir itu cara yang cukup pintar untuk menyimpan beberapa karakter untuk melemparkan pengecualian. Pada 4 karakter, ini mungkin cara terkecil untuk melempar pengecualian dalam C #, tidak yakin.
DLeh
6
Ini pintar! Namun, versi terbaru dari C # memiliki dukungan untuk rekursi ekor sehingga fungsi ini tidak akan pernah melempar StackOverflowException. Bahkan itu tidak akan pernah kembali (berlaku seperti while(true){}).
NightElfik
2
@DLeh Tail rekursi panggilan agak rumit. Anda harus menjalankan JIT x64 dan tanpa debugger (debugger terlampir akan menyebabkan rekursi ekor tidak berfungsi karena alasan yang jelas). Inilah program saya sebagai bukti: imgur.com/ErNl8LJ dan sedikit lagi membaca tentang rekursi ekor: blogs.msdn.com/b/davbr/archive/2007/06/20/… ;)
NightElfik
12
Haha: g (string) ... Aku akan keluar ...
gregsdennis
1
@Deh, oh, tunggu, saya tidak bisa menandingi 43 byte Anda tetapi tidak mengalahkannya. :) int g (string s) => s! = "google"? s.Length: s [9];
lee
57

Pyth, 14 13 karakter

L/lbnb"google

Menentukan fungsi bernama y.

Ini membagi panjang dengan 1 jika string bukan google dan 0 sebaliknya. Idenya bukan novel, tetapi saya memunculkannya secara mandiri.

Cobalah online.

Bagaimana itu bekerja

L                 Define y(b):
  lb                Compute len(b).
    nb"google       Compute (b != "google").
 /                  Set _ = len(b) / (b != "google").
                  Return _. (implicit)
Dennis
sumber
Ya saya sebenarnya tidak yakin tentang ini, saya tidak berpikir itu terjadi sebelumnya dengan sebuah string. Biasanya Anda bisa menutupnya ;tapi jelas Anda tidak bisa di sini ...
FryAmTheEggman
Anda tidak perlu kutipan akhir.
Maltysen
48
" Menentukan fungsi bernama y. " Tapi tidak ada ydalam kode Anda !?
AL
46
@AL Itu benar. Built-in Lmendefinisikan kembali fungsi y.
Dennis
90
Saya tidak yakin, tapi saya pikir saya benci Pyth.
Tuan Lister
40

MATLAB, 63 41 40 38 36 byte

Terima kasih kepada Tom Carpenter karena telah menghemat 1 byte!

Terima kasih kepada Stewie Griffin karena mencukur 2 byte!

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

Berbeda dengan solusi lain yang lebih elegan, melakukan operasi pembagian dengan nol di MATLAB tidak akan memberikan kesalahan, melainkan Inf. Solusi ini menemukan panjang string nnz. String yang dihasilkan sedemikian rupa sehingga Anda mengindeks dari awal string ke akhir, yang pada dasarnya adalah salinan dari string. Namun, yang penting adalah bahwa awal dari mana mengakses string dihasilkan dengan memeriksa apakah input sama atau tidak 'google'. Jika tidak, ini menghasilkan indeks awal 1 dan kami indeks ke dalam string secara normal ... karena MATLAB mulai mengindeks pada 1. Jika sama, indeks yang dihasilkan adalah 0 dan MATLAB akan melempar kesalahan pengindeksan yang menyatakan bahwa indeks harus bilangan bulat positif. Ekstra+adalah untuk memastikan bahwa output dari pemeriksaan kesetaraan adalah numerik daripada Boolean / logical. Menghilangkan +kehendak akan menghasilkan peringatan, tetapi karena spesifikasi tantangan ini tidak memungkinkan untuk peringatan, +diperlukan ... dengan demikian melengkapi kode.

Penggunaan contoh

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

Versi yang lebih menyenangkan, 83 77 76 74 72 byte

Terima kasih kepada Tom Carpenter karena telah menghemat 1 byte!

Terima kasih kepada Stewie Griffin karena mencukur 2 byte!

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

Di atas bukan pengajuan resmi, tapi itu sesuatu yang sedikit lebih menyenangkan untuk dijalankan. Menyalahgunakan evaldalam fungsi anonim, yang dilakukan kode adalah memeriksa untuk melihat apakah string input sama dengan 'google'... dan jika ya, ini akan membuka browser web bawaan MATLAB dan menunjukkan halaman kesalahan 404 Google yang mencoba mengakses Subhalaman terletak pada isaat itu tidak ada. Jika tidak, kami menampilkan panjang string secara normal.

Penggunaan contoh

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

ans =

     4

>> f('google')
>> 

Panggilan terakhir menggunakan 'google'memberi kita layar ini:

masukkan deskripsi gambar di sini

rayryeng
sumber
3
Anda bisa menyimpan byte dengan menggunakan strcmpalih-alih isequal.
Tom Carpenter
@ TomCarpenter - Lucu. Saya sebenarnya mengatakan pada diri sendiri untuk menggunakan strcmptetapi akhirnya menggunakan isequaluntuk beberapa alasan .... terima kasih!
rayryeng
1
nnzdua byte lebih pendek dari numel. Anda memberikan suara saya beberapa tahun yang lalu :-)
Stewie Griffin
31

JavaScript ES6, 34 27 25 karakter

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

Lempar ReferensiError Δke Google.

Jonathan
sumber
10
Anda dapat menggunakan operator ternary untuk menghemat dua byte.
Konrad Borowski
2
Yay, itulah yang baru saja saya dapatkan. Jika Anda ingin menjadi mewah, gunakan simbol yang orang tidak pernah gunakan alih-alih g untuk memastikan itu tidak akan ada sebagai variabel global. Δ membuat nama variabel yang bagus :)
Domino
1
Anda bisa menggunakannya #, kesalahan dalam JS afaik
clap
7
Δ Google Illuminati dikonfirmasi
DynamiteReed
2
Saya hanya akan meninggalkan ini di sini github.com/Rabrennie/anything.js
sagiksp
26

TI-BASIC, 15 byte

Heck, sementara kita berada di sana , mungkin juga mendapatkan jawaban TI-BASIC di sini.

Format input adalah "string":prgmNAME. Penghargaan untuk Thomas Kwa karena menemukannya pertama kali!

length(Ans)+log(Ans≠"GOOGLE

(Panduan: tambahkan 1 byte untuk setiap huruf kecil menggantikan huruf besar. Jadi s/GOOGLE/google/g => +6 bytes.)

uji kasus ahhhhh!

"GOGGLE":prgmG
               6
"BING":prgmG
               4
"GOOGLE":prgmG
           Error
Conor O'Brien
sumber
20 bytes: length(Ans)/(Ans≠"google. Anda juga memiliki kasus yang salah; jika huruf besar diizinkan 14 byte. Ngomong-ngomong, valid untuk meneruskan argumen melalui Ans.
lirtosiast
AGOOGLEharus memberi 7, benar? Dan Anda seharusnya tidak menghitung header program dalam ukuran kode Anda, jadi kurangi 10 byte.
lirtosiast
GALAT: Saya sedang memikirkan substring. Mohon maafkan aku.
Conor O'Brien
1
@ ThomasKwa saya tidak melihat komentar Anda dengan kode. Kebetulan kami berdua menemukan solusi yang sama. Namun, jika Anda yakin layak mendapatkan kredit, kredit itu akan menjadi milik Anda. ^ _ ^ ( EDIT Jika Anda akan membaca kode, itu bukan hal yang persis sama.)
Conor O'Brien
@ lirtosiast length(adalah dua byte, yang akan membuat angka Anda 21 dan 15 byte.
Timtech
23

APL (14)

(⍴÷'google'∘≢)

Penjelasan:

  • : panjangnya
  • ÷: dibagi dengan
  • 'google∘≢: argumen tidak sama dengan 'google'.

memberikan panjang string, yang dibagi dengan 1 jika string tidak sama google(yang memberikan panjang kembali tidak berubah), atau dengan 0 jika string tidak sama google(memberikan kesalahan).

marinus
sumber
11
Saya pikir Anda tidak perlu menghitung parens, karena dapat ditugaskan ke variabel tanpa mereka.
jimmy23013
Jenis gagal pada argumen single-char. Perbaiki dengan mengganti dengan . Anda juga dapat membuatnya tampak lebih keren dengan menukar operan . Oh, jangan lupa untuk menghapus parens. All-in-all:≢÷≢∘'google'
Adám
21

Python 3, 30 byte

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

Mengindeks daftar fungsi 1-elemen, menaikkan IndexErrorjika u=='google'predikatnya adalah True(= 1). Fungsional seperti itu.

Banyak varian. Wow:

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

Jika tantangannya terbalik (kesalahan pada semuanya bukan "google"), dapat menyimpan char:

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

Tapi Anda sudah tahu panjangnya, jadi hardcode saja.

Nick T
sumber
bekerja untuk python 2.7 juga
Noodle9
Untuk beberapa alasan, saya suka solusi ini.
foslock
19

Haskell, 24 byte

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

Keluaran:

Main> g "google"

Program error: pattern match failure: g "google"

Main> g "bing"
4
chs
sumber
15

CJam, 16 karakter

{_,\"google"=!/}

Ini membagi panjang dengan 1 jika string bukan google dan 0 sebaliknya. Idenya bukan novel, tetapi saya memunculkannya secara mandiri.

Cobalah online.

Bagaimana itu bekerja

_                 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.
Dennis
sumber
Yang cukup menarik, program penuh yang lebih pendek (15 bytes): q_,\"google"=!/. Mengembangkannya sebelum melihat posting ini. Perhatikan bahwa ini mengambil seluruh input (yang Anda anggap sebagai argumen fungsi). Sayangnya, Anda tidak dapat menggunakannya, karena ini meminta fungsi :(
Erik the Outgolfer
15

Oktaf, 63 byte

Saya tahu ini lebih lama dari solusi Matlab (yang akan bekerja di oktaf juga), tetapi itu sangat jahat. Saya membuat fungsi anonim (jahat) menggunakan array sel (jahat) literal (jahat) yang berisi fungsi menangani tergantung pada fungsi callback (itu sendiri, sehingga rekursif, jahat) yang harus dilewatkan melalui argumen. Lalu saya membuat anonim lain yang pada dasarnya mengurangi fungsi argumen string dan memperbaiki argumen kedua fsebagai f(sangat jahat). Setiap manusia waras tidak akan pernah melakukan ini, karena hampir tidak dapat dibaca seperti Perl atau regex (atau cjam / pyth / esolang lainnya).

Jadi jika string bukan 'google' argumen kedua dari array sel akan dipanggil yang menampilkan panjang string. Kalau tidak, fungsi pertama akan dipanggil, yang dilewatkan sebagai callback (dan melewati dirinya sebagai callback ke dirinya sendiri juga) yang kemudian adalah fungsi itu sendiri. Kesalahan pada dasarnya adalah beberapa kesalahan kedalaman rekursi maksimum.

f=@(s,f){@()f(s,f),numel(s)}{2-strcmp(s,'google')}();@(s)f(s,f)
ಠ_ಠ
sumber
2
Hal-hal itu tidak jahat dalam kebanyakan bahasa. Dan ini adalah kode golf, beberapa kode yang paling tidak dapat dibaca di planet ini ada di sini :). Keren menangani btw.
BAR
9
Saya hanya melewatkan beberapa di evalsini untuk membuatnya benar-benar JAHAT :-)
Luis Mendo
12

JavaScript, 25 Bytes

Contoh JavaScript yang bagus dan sederhana:

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

Jika "google" dimasukkan maka melewati a ReferenceError

Contoh

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

GeoffWilson
sumber
2
Wow, terima kasih sudah memberi tahu saya ada singkatan untuk fungsi lamda di javascript!
Tomáš Zato
3
@ TomášZato Peringatan: mereka baru di ES2015 , jadi dukungannya masih bervariasi.
Anko
11

APL, 19 17 byte

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

Ini adalah fungsi monadik tanpa nama yang akan menimbulkan kesalahan sintaksis jika inputnya adalah google. Ini dicapai dengan berusaha mengambil logaritma natural dari ketiadaan.

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

Cobalah online

Disimpan dua byte berkat Dennis!

Alex A.
sumber
dikenal secara informal sebagai "percikan". Nama yang sangat tepat untuk penggunaan ini.
Adám
9

R, 46 byte

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

Kecuali saya salah membaca, posting asli tidak pernah menentukan bahwa kode tersebut harus sintaks yang benar.

Contoh:

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

Saya tidak pernah menambahkan apa pun untuk parameter "tidak" dari pernyataan ifelse sehingga akan mengembalikan kesalahan jika parameter ini ditimbulkan.

syntonicC
sumber
10
Inilah yang sedikit lebih pendek:g=function(x)nchar(x)[[x!="google"]]
flodel
9

Perl, 31 29 byte

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

-2b terima kasih kepada manatwork

Pemakaian:

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

Jika saya bisa pergi dengan program daripada fungsi, berikut ini akan valid dengan hanya 20 byte (baris perintah +1 byte)

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

Kesalahan adalah pembagian dengan nol.

Penjelasan:

y///cmengembalikan panjangnya, lalu !/^google$/akan mengembalikan 0 jika input cocok dengan 'google'.

Pemakaian:

perl -p entry.pl input.txt
Jarmex
sumber
2
Anda bisa membuatnya fungsi anonim: sub{…}. (Kemudian Anda menyebutnya seperti sub{…}->("google").)
manatwork
Simpan 1 byte dengan menggunakan $_!=googlesebagai gantinya!/^google$/
Gabriel Benamy
@GabrielBenamy Aku takut !=tidak akan bekerja untuk membandingkan string ...
Dada
7

Haskell - 30 karakter

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

>g "google"
 *Exception: !
>g "str"
 3
C. Quilley
sumber
6
Mengapa tanda seru untuk kesalahan? Bukankah string kosong juga bisa?
Kritzefitz
1
Saya ingin menyarankan untuk mengubahnya x=x;g"google"=x;g s=length s, tetapi untuk beberapa alasan, <<loop>> pengecualian tidak dilemparkan ke ghci.
Kritzefitz
17
g s|s/="google"=length smenghindari kebutuhan untukerror
chs
7

Python 3, 35 byte

lambda n:len(n)if n!='google'else d
Zach Gates
sumber
1
@FryAmTheEggman sebenarnya 16 bit lebih pendek. XD
DiegoDD
1
@FryAmTheEggman: Trik bagus tapi id tidak berfungsi dengan string kosong:(lambda n:len(n)*(n!='google')or d)('')
pabouk
@ Patouk Benar sekali, terima kasih telah menunjukkannya.
FryAmTheEggman
7

Java 7: 53 52 Bytes

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

Kode di atas akan membuang ArithmeticExceptionuntuk pembagian dengan nol dan Stringselain dari google. Patut dicatat bahwa ==membandingkan referensi dan tidak akan berfungsi untuk StringObjek.

Java 8: 29 Bytes

(Berdasarkan saran yang diberikan dalam komentar di bawah)

s->s=="google"?0/0:s.length()
CoderCroc
sumber
1
Anda juga dapat menggunakan deklarasi lambda Java 8:s->(s.equals("google")?null:s).length();
hjk
3
"Patut dicatat bahwa == membandingkan referensi dan tidak akan berfungsi untuk Objek String." Sebenarnya, semua string adalah objek, jadi membandingkan string dengan ==di Jawa pada umumnya tidak akan berfungsi (kecuali jika Anda mengandalkan string interning, yang, yah, buruk). Mungkin Anda bingung dengan JavaScript?
gengkev
1
@ Gengkev Jika keduanya litterals, itu akan berfungsi karena itu adalah objek yang sama yang dirujuk pada kolam String. Spek memberikan litteral dan ini adalah litteral sehingga ia akan bekerja.
Yassin Hajaj
2
@ YassinHajaj Saya setuju bahwa spec memberikannya secara literal, tapi itu hanya contoh. Fungsi mungkin harus melakukan hal yang sama jika diberikan input dari stdin juga, atau jika fungsi dipanggil dari kelas lain yang dikompilasi secara terpisah. Bagaimanapun, mengandalkan optimisasi kompiler (string interning) adalah ide yang buruk, itulah yang awalnya saya katakan.
gengkev
7

C ++ 11, 54 (kode) + 14 (# termasuk) = 68

Nah, pembagian dengan nol hanyalah perilaku yang tidak terdefinisi, yang saya tidak akan menyebut kesalahan. Jadi pendekatan saya.

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

pemakaian

[](std::string s){return s!="google"?s.size():throw;}("google");
Zereges
sumber
1
Anda dapat menelepon size()untuk menyimpan 2 byte. Di C ++ 14, Anda juga bisa menggunakan lambdas generik dan menggantinya std::stringdengan auto. Anda harus memberikan yang sebenarnya std::stringbukan const char*.
isanae
@ isanae saya tidak tahu std::stringpunya size()metode, terima kasih untuk itu. Saya menyadari lambda generik di C ++ 14, tapi saya tidak tahu bagaimana ini akan membantu saya, karena "string"ini const char*dan tidak std::string.
Zereges
1
@Zereges std::stringmemiliki size()dan length()karena keduanya merupakan wadah dan string . Adapun auto, Anda akan memanggil lambda dengan (std::string("google"))bukan ("google"). Pertanyaannya hanya mengatakan "menerima 1 string" tanpa menentukan apa "string" itu.
isanae
@ isanae C ++ 14 juga harus "google"smembangun sebuah std::string:)
Quentin
@ Zona Anda dapat throw;memicu std::terminate()(karena tidak ada pengecualian saat ini di sini).
Quentin
6

MUMPS, 28 byte

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

Pemakaian:

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

<SELECT>g^MYROUTINE

Mengapa? Yah, $S[ELECT]pada dasarnya adalah pernyataan multi-klausa ringkas jika ada - hampir seperti pencocokan pola dalam bahasa seperti Haskell atau Rust. Kecuali ... tidak seperti di Haskell atau Rust, polanya tidak diperiksa untuk kelengkapannya, karena gagasan "keamanan waktu kompilasi" sama sekali asing bagi MUMPS. Jadi jika input Anda adalah pola yang tidak Anda pertanggungjawabkan, Anda akan mendapatkan error runtime yang bagus <SELECT>.

senshin
sumber
6

Ruby, 34 30 27 26

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

Tidak dikenal tmemunculkan pengecualian.

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

Sunting: versi yang benar-benar mudah dibaca dan jelas yang lebih pendek ...

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

Lama: Sepertinya mirip dengan ide-ide lain. Akan naik ArgumentErrorjika x adalah 'google'.

Borsunho
sumber
2
Mengapa tanda kurung itu? x=='google'?t: x.size
manatwork
6

JavaScript, 47 byte

Bagus dan sederhana.

Sunting: Sekarang mematuhi aturan

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

Pengujian

Kesalahan terlempar

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

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

Tidak ada kesalahan yang terjadi

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

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

Peluruhan Beta
sumber
Secara teknis, ini tidak memenuhi spesifikasi OP. Fungsi ini mengingatkan panjang tetapi kembali undefined.
Bungle
@ Bunle Bagaimana sekarang?
Beta Decay
1
@ Bunle saya mengerti. Saya lupa bahwa pengembalian diperlukan
Beta Decay
1
Menggunakan fungsi panah ES6 dan operator ternary (alih-alih jika), Anda dapat menekannya sedikit lebih banyak :)
Carles Alcolea
1
@BetaDecay Orisinalitas terlebih dahulu; Saya menghargai itu.
Carles Alcolea
6

C, 66 48

Asli:

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

Menggunakan OSX gcc,
l("duck");mengembalikan 4,
l("google");menyebabkan Floating point exception: 8.

Pada platform lain, konstanta mungkin perlu disesuaikan untuk endianness.

Lebih pendek :

kurang rumit, hasil yang sama.

 l(int*s){return strlen(s)/!!strcmp(s,"Google");}
ASHelly
sumber
Wow, ada beberapa logika yang menarik di sana. Jika saya memahami bagian golf yang benar, Anda entah bagaimana menggeser enam karakter pertama yang cocok menjadi satu, nomor raksasa (hampir seperti hash), yang, karena tumpukan menjadi little-endian, akhirnya menjadi "google", tetapi mundur ( 0x656c676f6f67= elgoog). Saya pikir jawaban ini perlu penjelasan bagi kita yang menghargai hal-hal tingkat rendah yang gila ini.
Braden Best
Anda pada dasarnya memilikinya. Ini hanya melemparkan memori yang menyimpan string ke angka 64 bit. Endianness membuatnya 'terbelakang' pada arsitektur x86. Teks hanya menempati 7 byte, jadi topeng hanya menyembunyikan apa pun yang mungkin berikutnya dalam memori. Ini trik yang menyenangkan, tapi saya pikir '!! strcmp (s, "google")' sebenarnya lebih pendek.
AShelly
1
Bagaimanapun, +1. Pastinya. Juga, saya pikir Anda dapat mempersingkatnya dengan menghapus int , itu 4 karakter.
Braden Best
Setelah mengetik , saya menemukan jawabannya! Jika char *, dengan unit 8-bits, dilemparkan ke long *, dengan unit 64-bits, tanpa dialokasikan kembali dengan benar, data dalam 8 byte ruang tumpukan menjadi rusak, dan diperlakukan sebagai nomor tunggal ( 8*8 = 64). Itu sebabnya Anda mendapatkan 6 karakter pertama, + NUL + sampah. Itu sangat pintar. Berbahaya juga. Bertanya-tanya mengapa itu tidak segfault. Itu byte 8 sampah di luar batas, bukan?
Braden Best
Saya melihat analisis Anda. Anda benar, shiftnya seharusnya 56, bukan 54. Juga, saya tidak akan menggunakan kata rusak. Memorinya sama, bit-bitnya hanya diartikan berbeda. Secara teknis, mengakses byte sampah adalah perilaku yang tidak terdefinisi, dan sebenarnya bisa segfault. Praktis, byte itu hampir pasti berada di blok memori hukum yang sama dengan sisa string, dan umumnya blok ini (tumpukan, tumpukan, konstanta) dialokasikan dalam satuan ukuran kata minimal. Jadi memori itu milik program, hanya berisi sesuatu selain string.
AShelly
6

Ruby, 29 byte

Saya pertama kali datang dengan sesuatu yang sangat mirip dengan upaya pertama @ Borsunho, tetapi milik saya sedikit lebih lama dan dia mempostingnya sebelum saya selesai. Datang dengan ini sebelum 30 byte editnya :)

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

Contoh penggunaan:

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

sunting: Dua tahun dan beberapa versi Ruby kemudian

Ruby , 25 byte

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

Digantikan String#sizedengan plus unary baru. Cobalah online!

daniero
sumber
Rapi, saya tidak bisa melakukan ini (saya tidak datang dengan meninggalkan di ^luar matchgroup).
Borsunho
@ Borsunho saya harus mengakui bahwa saya hanya "memaksa" regex sampai saya mendapatkan hasil yang saya inginkan :) Saya pikir .*pada akhirnya adalah apa yang membuatnya bekerja.
daniero
Istirahat jika string input memiliki beberapa baris dan berisi google pada barisnya sendiri. Saya pikir /\A(?!google\Z).*/mmemperbaikinya (dengan biaya tiga byte, meskipun). ^dan $cocok dengan awal dan akhir garis, sementara \Adan \Zcocok dengan awal dan akhir string secara keseluruhan.
histokrat
@ histokrat tapi saya tidak berpikir Anda bisa google string dengan beberapa baris;)
daniero
4

> <>, 55 byte

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

Kupikir aku akan mencobanya, bukan upaya atau algoritme golf terbaikku. Bukan fungsi per se, tapi saya pikir ini masih memenuhi syarat. Saya akan melihat apakah saya dapat mengedit dalam versi yang lebih baik.

Jika Anda diizinkan untuk mencetak panjang dan kemudian kesalahan, inilah solusi 46 byte:

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

49 byte solusi sebelumnya dari sifat ini:

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

Saya senang memberikan penjelasan jika ada minat, dan beri tahu saya jika ada yang salah dengan jawaban saya atau jika Anda memiliki saran bermain golf.

cole
sumber
4

Javascript ES6, 51 27 25 byte

Hai, saya baru mengenal kode golf jadi ini mungkin bisa lebih banyak golf, tapi begini saja:

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

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

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

dan beberapa tes:

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

Edit: Ditambahkan? untuk mengganti jika dan mengganti Kesalahan dengan objek yang tidak ditentukan.

Sunting 2: Saya menyadari jumlah byte saya salah, dan menghapus g =

Pengguna Generik
sumber
4

GolfScript, 14 16 Karakter

{.,\'google'=!/}

Seperti banyak yang lain, cukup bandingkan input 'google'dan bagi panjangnya dengan kebalikan dari hasilnya.

Contoh program:

pswg
sumber
@ Dennis, saya mengerti maksud Anda. Dalam bentuk aslinya itu tidak dapat digunakan kembali (Anda tidak bisa, katakan menerapkan kode pada daftar). Juga saya tidak menyadari bahwa Anda telah menulis jawaban yang hampir identik di CJam jauh sebelum saya memposting ini (sebenarnya saya hanya samar-samar menyadari CJam sebagai bahasa sampai sekarang). +1 untuk solusi Anda juga.
pswg
4

Terjebak , 16 Bytes

s_l1u"google"=-/

Mengikuti metode yang mirip dengan kebanyakan orang, akan menyebabkan kesalahan pembagian 0 pada "google" sebagai input.

Kade
sumber
4

Windows Batch, 118 karakter

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

Output adalah% stringlength%.

Kode lengkap:

@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

Dimodifikasi dari jawaban Joshua Honig, di sini .

Shane Smiskol
sumber