Google nicht "google"

158

Wir alle wissen, dass wenn Sie das Wort "google" googeln, es das Internet brechen wird.

Ihre Aufgabe ist es, eine Funktion zu erstellen, die eine Zeichenfolge akzeptiert und deren Länge in möglichst wenigen Unicode-Zeichen zurückgibt.

Wenn die angegebene Zeichenfolge jedoch googleKleinbuchstaben enthält, wird ein Fehler verursacht.

Zum Beispiel g('bing')wird zurückkehren , 4sondern g('google')wird einen Fehler verursachen.

Bitte geben Sie ein Verwendungsbeispiel und den Fehler an, falls möglich.

rybo111
quelle
122
Ich habe googelt und Google hat Google bei Google gefunden. Mythos gesprengt.
Geobits
86
@Geobits Das ist einfach ein Test, um zu sehen, ob ich Google google, was ich nicht tun werde. : D
rybo111
7
Muss die Funktion zwischen Groß- und Kleinschreibung unterscheiden? Sollte es gegebenes "GOOgle" werfen?
AXMIM
2
Wenn ich google in google eingebe (die Suchleiste in Chrome), wird gefragt, ob ich zu google wechseln möchte . (Jetzt, da es ein tld ist, macht dies Sinn, dh com.google funktioniert). Ich habe darauf geklickt und einen DNS-Lookup-Fehler erhalten. Internet: kaputt!
Craig
4
Ich stimme dafür, dies wieder zu eröffnen. Ich habe keine Fragen darüber gesehen, was einen Fehler für diese Herausforderung darstellt, und es gibt bereits 154 Antworten, daher halte ich es nicht für fair, die Spezifikation zu ändern. Dies ist vielleicht kein Beispiel für eine gute Frage, aber es ist klar genug. Wenn eine Antwort darauf lautet, ob eine bestimmte Ausgabe ein Fehler ist oder nicht, wird sie wahrscheinlich sowieso nicht so viele positive Stimmen erhalten.
Poke

Antworten:

228

Python 2, 29

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

Gibt einen ZeroDivisionErroran "google"und die Länge sonst. Dies nutzt Pythons Boolesche Werte gleich 0und 1.

xnor
quelle
2
+1. Sie müssen festlegen , gum Ihre lambdamit einem Eingang, oder rufen Sie es anonym, though.
Zach Gates
4
Aus Spaß habe ich diese Technik mit JavaScript ES6 ausprobiert. Es endete bei 25, aber kehrt Infinityfür "google" zurück, anstatt einen Fehler zu werfen ...
ETHproductions
18
@ZachGates Es besteht Einigkeit darüber, dass anonyme Funktionen zulässig sind, sofern dies nicht ausdrücklich untersagt ist. Da die Frage so etwas zu implizieren scheint (es aber noch nicht explizit verbietet), sollten Sie das OP danach fragen.
FryAmTheEggman
3
@ Kevin Sie würden eine benötigen, returnwenn Sie verwendetdef
FryAmTheEggman
3
Amüsanterweise ist dies in Pyth übersetzt besser als meine bisher beste Pyth-Lösung. Es sind L/lbnb"google13 Bytes.
Isaacg
107

Excel, 23 Zeichen

Fügen Sie dies in eine andere Zelle als A1 ein und geben Sie Ihre Suchanfrage in A1 ein.

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

Zum Beispiel:

GoogleGoogle

Hand-E-Food
quelle
9
Was ist der allgemeine Konsens über die Verwendung von Excel?
Beta Decay
52
@BetaDecay. Kreativ, ungewöhnlich, scheint zu funktionieren. Kann nicht auf alle CG-Rätsel angewendet werden, aber es ist da!
kdbanman
119
Manager lieben es!
lkraider
18
So effizient, CG-Benutzer werden Sie dafür hassen. Aber warte. B3 wird dein Leben für immer verändern!
Sumurai8
8
Was ist die spezifische Übereinstimmung bei der Verwendung von Excel?
GreenAsJade
81

C # 43 Bytes

Eine Verbesserung gegenüber Salah Alamis Antwort. Rekursionen zum Auslösen einer Stapelüberlauf-Ausnahme bei der Bereitstellung von "google"

int g(string s)=>s!="google"?s.Length:g(s);
DLeh
quelle
2
Ja, ich dachte, das wäre eine ziemlich clevere Art, einige Charaktere zu speichern, um eine Ausnahme auszulösen. Mit 4 Zeichen ist dies möglicherweise die kleinste Möglichkeit, eine Ausnahme in C # auszulösen, nicht sicher.
1.
6
Das ist schlau! Neuere Versionen von C # unterstützen jedoch die Schwanzrekursion, sodass diese Funktion niemals ausgelöst wird StackOverflowException. In der Tat wird es nie zurückkehren (verhält sich wie while(true){}).
NightElfik
2
@DLeh Tail-Rekursionsaufrufe sind etwas knifflig. Sie müssen mit x64 JIT und ohne Debugger ausgeführt werden (der angehängte Debugger führt dazu, dass die Schwanzrekursion aus offensichtlichen Gründen nicht funktioniert). Hier ist mein Programm als Beweis: imgur.com/ErNl8LJ und etwas mehr zum Thema Schwanzrekursion: blogs.msdn.com/b/davbr/archive/2007/06/20/… ;)
NightElfik 10.10.15
12
Haha: g (Schnur) ... ich werde mich sehen ...
gregsdennis
1
@DLeh oh, warte, nein, ich kann deine 43 Bytes vergleichen, aber nicht schlagen. :) int g (string s) => s! = "google"? an Länge: s [9];
Lee
57

Pyth, 14 13 Zeichen

L/lbnb"google

Definiert eine benannte Funktion y.

Dies teilt die Länge durch 1, wenn die Zeichenfolge nicht google ist, und durch 0, wenn dies nicht der Fall ist . Die Idee ist nicht neu, aber ich habe sie eigenständig entwickelt.

Probieren Sie es online aus.

Wie es funktioniert

L                 Define y(b):
  lb                Compute len(b).
    nb"google       Compute (b != "google").
 /                  Set _ = len(b) / (b != "google").
                  Return _. (implicit)
Dennis
quelle
Ja, da bin ich mir eigentlich nicht sicher. Ich glaube nicht, dass es vorher mit einer Saite passiert ist. Normalerweise könnte man es mit schließen, ;aber offensichtlich kann man nicht hier ...
FryAmTheEggman
Sie brauchen das Endzitat nicht.
Maltysen
48
" Definiert eine benannte Funktion y. " Aber es gibt keine yin Ihrem Code!?
AL
46
@AL Das stimmt. Das eingebaute Ldefiniert die Funktion neu y.
Dennis
90
Ich bin nicht sicher, aber ich glaube, ich hasse Pyth.
Mr Lister
40

MATLAB, 63 41 40 38 36 Bytes

Vielen Dank an Tom Carpenter für das Abschneiden von 1 Byte!

Vielen Dank an Stewie Griffin für das Abschneiden von 2 Bytes!

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

Im Gegensatz zu den anderen eleganteren Lösungen führt das Durchführen einer Division durch Null in MATLAB nicht zu einem Fehler, sondern zu einer Abweichung Inf. Diese Lösung ermittelt die Länge der Zeichenkette nach nnz. Die erzeugte Zeichenfolge wird so erstellt, dass Sie vom Anfang der Zeichenfolge bis zum Ende indexieren. Dies ist im Wesentlichen eine Kopie der Zeichenfolge. Wichtig ist jedoch, dass der Anfang des Zugriffs auf die Zeichenfolge erstellt wird, indem überprüft wird, ob die Eingabe gleich ist oder nicht 'google'. Wenn dies nicht der Fall ist, wird ein Anfangsindex von 1 erzeugt, und wir indizieren in der Regel in den String ... wenn MATLAB mit der Indizierung bei 1 beginnt. Wenn der Index gleich ist, wird 0 erzeugt und MATLAB gibt einen Indizierungsfehler aus, der besagt, dass index muss eine positive ganze Zahl sein. Das Extra+soll sicherstellen, dass die Ausgabe der Gleichheitsprüfung numerisch und nicht boolesch ist logical. Wenn Sie das weglassen, +wird eine Warnung ausgegeben. Da die Spezifikationen dieser Herausforderung jedoch keine Warnungen zulassen, +ist das erforderlich. Vervollständigen Sie den Code.

Beispiel verwendet

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

Eine spaßigere Version, 83 77 76 74 72 Bytes

Vielen Dank an Tom Carpenter für das Abschneiden von 1 Byte!

Vielen Dank an Stewie Griffin für das Abschneiden von 2 Bytes!

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

Das oben Gesagte ist keine offizielle Einreichung, aber es macht ein bisschen mehr Spaß, es auszuführen. Wenn evalder Code in anonymen Funktionen missbraucht wird, wird geprüft, ob die Eingabezeichenfolge 'google'... entspricht. Wenn dies der Fall ist, wird der integrierte Webbrowser von MATLAB geöffnet und die 404-Fehlerseite von Google wird angezeigt, die versucht, auf die zuzugreifen Unterseite befindet sich bei, iwenn das nicht existiert. Wenn nicht, zeigen wir die Länge der Zeichenkette normal an.

Beispiel verwendet

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

ans =

     4

>> f('google')
>> 

Der letzte Anruf mit 'google'gibt uns diesen Bildschirm:

Bildbeschreibung hier eingeben

rayryeng
quelle
3
Sie können ein Byte speichern, indem Sie strcmpanstelle von verwenden isequal.
Tom Carpenter
@ TomCarpenter - Lustig. Ich sagte mir eigentlich zu verwenden, strcmpaber endete mit isequalaus irgendeinem Grund .... danke!
Rayryeng
1
nnzist zwei Bytes kürzer als numel. Sie hatten meine Stimme vor ein paar Jahren :-)
Stewie Griffin
31

JavaScript ES6, 34 27 25 Zeichen

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

Löst einen ReferenceError Δfür Google aus.

Jonathan
quelle
10
Sie können einen ternären Operator verwenden, um zwei Bytes zu speichern.
Konrad Borowski
2
Ja, genau das habe ich gerade bekommen. Wenn Sie sich etwas einfallen lassen möchten, verwenden Sie ein Symbol, das die Benutzer niemals anstelle von g verwenden, um sicherzustellen, dass es nicht als globale Variable existiert. Δ ergibt einen guten Variablennamen :)
Domino
1
Sie könnten verwenden #, es Fehler in JS afaik
klatschen
7
Δ Google Illuminati bestätigt
DynamiteReed
2
Ich lasse das hier. Github.com/Rabrennie/anything.js
sagiksp
26

TI-BASIC, 15 Bytes

Heck, während wir gerade dabei sind , könnte genauso gut eine TI-BASIC-Antwort hier bekommen.

Eingabeformat ist "string":prgmNAME. Dank an Thomas Kwa , der es zuerst gefunden hat!

length(Ans)+log(Ans≠"GOOGLE

(Anleitung: Fügen Sie 1 Byte für jeden Kleinbuchstaben hinzu und ersetzen Sie einen Großbuchstaben s/GOOGLE/google/g => +6 bytes.)

ahhhhh Testfälle!

"GOGGLE":prgmG
               6
"BING":prgmG
               4
"GOOGLE":prgmG
           Error
Conor O'Brien
quelle
20 Bytes length(Ans)/(Ans≠"google. Sie haben auch den Fall falsch; Wenn Großbuchstaben zulässig sind, sind es 14 Byte. Es ist übrigens zulässig, Argumente über Ans zu übergeben.
Lirtosiast
AGOOGLEsollte 7 geben, richtig? Und Sie sollten den Programmheader nicht in Ihrer Codegröße zählen, also subtrahieren Sie 10 Bytes.
Lirtosiast
FEHLER: Ich dachte an Teilstrings. Bitte vergib mir.
Conor O'Brien
1
@ThomasKwa Ich habe Ihren Kommentar mit dem Code nicht gesehen. Es ist einfach so, dass wir beide auf dieselbe Lösung gestoßen sind. Wenn Sie jedoch der Meinung sind, dass Sie den Kredit verdienen, liegt der Kredit bei Ihnen. ^ _ ^ ( BEARBEITEN Wenn Sie den Code lesen würden, ist es nicht genau dasselbe.)
Conor O'Brien
@lirtosiast length(ist zwei Bytes, das würde Ihre Zahlen 21 und 15 Bytes machen.
Timtech
23

APL (14)

(⍴÷'google'∘≢)

Erläuterung:

  • : Länge
  • ÷: geteilt durch
  • 'google∘≢: Argument ist nicht gleich 'google'.

gibt die Länge der Zeichenkette, die durch 1 , wenn die Zeichenkette nicht gleich geteilt ist google, oder durch 0 (die die Länge unverändert zurück gibt) , wenn die Zeichenfolge nicht gleich google(einen Fehler gibt).

Marinus
quelle
11
Ich denke, Sie müssen die Parens nicht zählen, da sie ohne sie einer Variablen zugewiesen werden können.
Jimmy23013
Fehlgeschlagen bei Argumenten mit einem Zeichen. Fix durch Ersetzen durch . Sie können es auch cooler machen, indem Sie die Operanden von tauschen . Oh, vergessen Sie nicht, die Parens zu entfernen. Alles in allem:≢÷≢∘'google'
Adám
21

Python 3, 30 Bytes

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

Indiziert die 1-Element-Funktionsliste und gibt an, IndexErrorob das u=='google'Prädikat True(= 1) ist. So funktionell.

Viele Varianten. Beeindruckend:

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

Wenn die Herausforderung invertiert wurde (Fehler bei allem, was nicht "google" ist), könnte ein Zeichen gespeichert werden:

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

Aber Sie kennen die Länge bereits, also schreiben Sie sie einfach fest.

Nick T
quelle
funktioniert auch für Python 2.7
Noodle9
Aus irgendeinem Grund liebe ich diese Lösung.
Foslock
19

Haskell, 24 Bytes

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

Ausgabe:

Main> g "google"

Program error: pattern match failure: g "google"

Main> g "bing"
4
chs
quelle
15

CJam, 16 Zeichen

{_,\"google"=!/}

Dies teilt die Länge durch 1, wenn die Zeichenfolge nicht google ist, und durch 0, wenn dies nicht der Fall ist . Die Idee ist nicht neu, aber ich habe sie eigenständig entwickelt.

Probieren Sie es online aus.

Wie es funktioniert

_                 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
quelle
Interessanterweise ist ein volles Programm kürzer (15 Byte): q_,\"google"=!/. Entwickelt, bevor Sie diesen Beitrag sehen. Beachten Sie, dass dies die gesamte Eingabe übernimmt (die Sie anscheinend sowieso als Funktionsargument verwenden). Leider können Sie es nicht verwenden, da dies nach einer Funktion fragt :(
Erik der Outgolfer
15

Oktave, 63 Bytes

Ich weiß, es ist länger als die Matlab-Lösung (die auch in Octave funktionieren würde), aber es ist besonders schlimm. Ich mache eine anonyme Funktion (böse) mit Zellarray (böse) Literalen (böse), die Funktionshandles enthalten, abhängig von einer Rückruffunktion (selbst, also rekursiv, böse), die per Argument übergeben werden muss. Dann erstelle ich ein anderes anonymes, das die Funktion im Grunde auf das Zeichenfolgenargument reduziert und das zweite Argument von fas f(sehr böse) behebt . Jeder vernünftige Mensch würde dies niemals tun, da es fast so unlesbar ist wie Perl oder Regex (oder cjam / pyth / jeder andere Esolang).

Wenn die Zeichenfolge nicht "google" ist, wird das zweite Argument des Zellenarrays aufgerufen, das die Länge der Zeichenfolge ausgibt. Andernfalls wird die erste Funktion aufgerufen, die als Rückruf übergeben wird (und sich selbst auch als Rückruf an sich selbst übergibt), die später die Funktion selbst ist. Der Fehler ist im Grunde ein maximaler Rekursionstiefenfehler.

f=@(s,f){@()f(s,f),numel(s)}{2-strcmp(s,'google')}();@(s)f(s,f)
ಠ_ಠ
quelle
2
Diese Dinge sind in den meisten Sprachen nicht böse. Und das ist Codegolf, hier existiert einer der unleserlichsten Codes der Welt :). Cooler Griff übrigens.
BAR
9
Ich vermisse evalhier nur einige , um es wirklich böse zu machen :-)
Luis Mendo
12

JavaScript, 25 Bytes

Schönes und einfaches JavaScript-Beispiel:

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

Wenn "google" eingegeben wird, passiert es a ReferenceError

Beispiel

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

GeoffWilson
quelle
2
Wow, danke, dass du mir sagst, dass es eine Abkürzung für Lamda-Funktionen in Javascript gibt!
Tomáš Zato
3
@ TomášZato Vorbehalt: Sie sind brandneu in ES2015 , daher variiert die Unterstützung immer noch.
Anko
11

APL, 19 17 Bytes

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

Dies ist eine unbenannte monadische Funktion, die bei Eingabe einen Syntaxfehler ausgibt google. Dies wird erreicht, indem versucht wird, den natürlichen Logarithmus von nichts zu nehmen.

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

Probieren Sie es online aus

Zwei Bytes gespart dank Dennis!

Alex A.
quelle
ist informell als "splat" bekannt. Ein sehr passender Name für diese Verwendung.
Adám
9

R, 46 Bytes

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

Sofern ich nicht falsch verstanden habe, wurde im ursprünglichen Beitrag nie angegeben, dass der Code die richtige Syntax haben muss.

Beispiel:

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

Ich habe für den "no" -Parameter der ifelse-Anweisung nie etwas hinzugefügt, daher wird ein Fehler zurückgegeben, wenn dieser Parameter aufgerufen wird.

syntonicC
quelle
10
Hier ist eine etwas kürzere:g=function(x)nchar(x)[[x!="google"]]
Flodel
9

Perl, 31 29 Bytes

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

-2b dank manatwork

Verwendungszweck:

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

Wenn ich nicht mit einer Funktion, sondern mit einem Programm davonkommen könnte, wäre das Folgende mit nur 20 Bytes gültig (+1 Byte Befehlszeile)

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

Der Fehler ist eine Division durch Null.

Erläuterung:

y///cGibt die Länge zurück und gibt dann !/^google$/0 zurück, wenn die Eingabe 'google' entspricht.

Verwendungszweck:

perl -p entry.pl input.txt
Jarmex
quelle
2
Man könnte es eine anonyme Funktion machen: sub{…}. (Dann nennst du es wie sub{…}->("google").)
manatwork
Sparen Sie 1 Byte, indem Sie $_!=googleanstelle von!/^google$/
Gabriel Benamy den
@ GabrielBenamy Ich fürchte, !=wird nicht funktionieren, um Zeichenfolge zu vergleichen ...
Dada
7

Haskell - 30 Zeichen

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

>g "google"
 *Exception: !
>g "str"
 3
C. Quilley
quelle
6
Warum das Ausrufezeichen für Fehler? Würde eine leere Zeichenfolge nicht auch?
Kritzefitz,
1
Ich wollte vorschlagen, es zu ändern x=x;g"google"=x;g s=length s, aber aus irgendeinem Grund werden << loop >> -Ausnahmen nicht in ghci geworfen.
Kritzefitz,
17
g s|s/="google"=length svermeidet die Notwendigkeit fürerror
chs
7

Python 3, 35 Bytes

lambda n:len(n)if n!='google'else d
Zach Gates
quelle
1
@FryAmTheEggman tatsächlich 16 Bit kürzer. XD
DiegoDD
1
@FryAmTheEggman: Guter Trick, aber ID funktioniert nicht mit leerer Zeichenfolge:(lambda n:len(n)*(n!='google')or d)('')
Pabouk
@pabouk Ganz richtig, danke, dass du darauf hingewiesen hast.
FryAmTheEggman
7

Java 7: 53 52 Bytes

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

Der obige Code wird ArithmeticExceptionzur Division durch Null und für alle Stringanderen als ausgelöst google. Es ist zu beachten, dass der ==Vergleich Referenz und nicht für StringObjekte funktionieren .

Java 8: 29 Bytes

(Gestützt auf den Vorschlag im folgenden Kommentar)

s->s=="google"?0/0:s.length()
CoderCroc
quelle
1
Sie können auch die Lambda-Deklaration von Java 8 verwenden:s->(s.equals("google")?null:s).length();
hjk
3
Msgstr "Beachten Sie, dass == die Referenz vergleicht und für String - Objekte nicht funktioniert." Tatsächlich sind alle Zeichenfolgen Objekte, sodass der Vergleich von Zeichenfolgen mit ==in Java im Allgemeinen nicht funktioniert (es sei denn, Sie verlassen sich auf das Internieren von Zeichenfolgen, was sehr schlecht ist). Vielleicht haben Sie sich mit JavaScript verwechselt?
Gengkev
1
@gengkev Wenn es sich bei beiden um Witterals handelt, funktioniert dies, da es sich um dasselbe Objekt handelt, auf das im String-Pool verwiesen wird. Die Spezifikation gibt einen Wurf an und hier ist es ein Wurf, so dass es funktionieren wird.
Yassin Hajaj
2
@YassinHajaj Ich bin damit einverstanden, dass die Spezifikation es als wörtliches Wort gibt, aber das ist nur ein Beispiel. Die Funktion sollte wahrscheinlich die gleiche Leistung erbringen, wenn auch eine Eingabe von stdin erfolgt oder wenn die Funktion von einer anderen Klasse aufgerufen wird, die separat kompiliert wurde. Auf jeden Fall ist es eine schlechte Idee, sich auf Compiler-Optimierungen (String-Internierung) zu verlassen, was ich ursprünglich gesagt habe.
Gengkev
7

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

Nun, Division durch Null ist nur undefiniertes Verhalten, das ich nicht als Fehler bezeichnen würde. Also mein Ansatz.

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

Verwendungszweck

[](std::string s){return s!="google"?s.size():throw;}("google");
Zereges
quelle
1
Sie können aufrufen size(), um 2 Bytes zu speichern. In C ++ 14, könnten Sie auch generische lambdas verwenden und ersetzen std::stringdurch auto. Sie müssten ein tatsächliches std::stringstatt eines tatsächlichen übergeben const char*.
Isanae
@ Isanae Ich wusste nicht, std::stringhat size()Methode, danke dafür. Ich kenne generische Lambdas in C ++ 14, aber ich weiß nicht, wie es mir helfen würde, da es "string"ist const char*und nicht std::string.
Zereges,
1
@Zereges std::stringhat size()und length()weil es sowohl ein Container als auch ein String ist . Wie für auto, würden Sie das Lambda mit (std::string("google"))anstelle von nennen ("google"). Die Frage lautet nur "akzeptiert 1 Zeichenfolge", ohne anzugeben, was eine "Zeichenfolge" ist.
Isanae
@ Isanae C ++ 14 hat auch "google"szu konstruieren std::string:)
Quentin
@Zereges kannst du einfach throw;auslösen std::terminate()(da es hier keine aktuelle Ausnahme gibt).
Quentin
6

MUMPS, 28 Bytes

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

Verwendungszweck:

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

<SELECT>g^MYROUTINE

Warum? Nun, es $S[ELECT]handelt sich im Grunde genommen um eine kompakte If-else-Anweisung mit mehreren Klauseln - fast wie eine Musterübereinstimmung in einer Sprache wie Haskell oder Rust. Außer ... im Gegensatz zu Haskell oder Rust werden die Muster nicht auf Vollständigkeit überprüft, da der Begriff "Sicherheit beim Kompilieren" MUMPS völlig fremd ist. Wenn Ihre Eingabe also ein Muster ist, das Sie nicht berücksichtigt haben, wird ein hübscher Laufzeitfehler namens angezeigt <SELECT>.

Senshin
quelle
6

Ruby, 34 30 27 26

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

Unbekannt tlöst eine Ausnahme aus.

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

Edit: völlig lesbare und offensichtliche Version, die kürzer ist ...

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

Alt: Es scheint ziemlich ähnlich zu anderen Ideen zu sein. Wird erhöhen, ArgumentErrorwenn x 'google' ist.

Borsunho
quelle
2
Warum diese Klammern? x=='google'?t: x.size
Manatwork
6

JavaScript, 47 Bytes

Schön und einfach.

Bearbeiten: Entspricht jetzt den Regeln

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

Testen

Fehler ausgelöst

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

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

Kein Fehler ausgelöst

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

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

Beta-Zerfall
quelle
Technisch entspricht dies nicht den Spezifikationen des OP. Diese Funktion gibt die Länge aus, kehrt aber zurück undefined.
Bungle
@Bungle Wie geht es dir jetzt?
Beta Decay
1
@Bungle ich sehe. Ich habe vergessen, dass eine Rückkehr erforderlich war
Beta Decay
1
Mit den Pfeilfunktionen von ES6 und dem ternären Operator (anstelle von if) können Sie das ein bisschen mehr ausdrücken :)
Carles Alcolea,
1
@ BetaDecay Originalität zuerst; Ich respektiere das.
Carles Alcolea
6

C 66, 48

Original:

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

Mit OSX gcc,
l("duck");kehrt 4,
l("google");verursacht Floating point exception: 8.

Auf anderen Plattformen müssen die Konstanten möglicherweise für Endianness angepasst werden.

Kürzer :

Weniger trickreich, gleiche Ergebnisse.

 l(int*s){return strlen(s)/!!strcmp(s,"Google");}
Ahelly
quelle
Wow, das ist eine interessante Logik. Wenn ich den Golf-Teil richtig verstehe, verschieben Sie die ersten sechs Zeichen irgendwie, um in eine einzelne, riesige Zahl (fast wie ein Hash) zu passen, die, da der Stapel Little-Endian ist, letztendlich "google" ist, aber rückwärts ( 0x656c676f6f67= elgoog). Ich denke, diese Antwort braucht eine Erklärung für diejenigen von uns, die diese Art von verrückten Sachen auf niedriger Ebene schätzen.
Braden Best
Sie haben es im Grunde. Der Speicher, in dem die Zeichenfolge gespeichert ist, wird einfach in eine 64-Bit-Zahl umgewandelt. Endianness macht es auf x86-Architekturen "rückwärts". Der Text belegt nur 7 Bytes, so dass die Maske nur das verbirgt, was als nächstes im Speicher sein kann. Es ist ein lustiger Trick, aber ich denke, '!! strcmp (s, "google")' ist tatsächlich kürzer.
AShelly
1
Wie auch immer, +1. Bestimmt. Ich denke, Sie können es auch verkürzen, indem Sie das entfernen int , das sind 4 Zeichen.
Braden Best
Nach einigem Tippen habe ich es herausgefunden! Wenn char *mit Einheiten von 8-bitsin long *Einheiten von umgewandelt wird 64-bits, ohne dass eine ordnungsgemäße Neuzuweisung erfolgt, werden die Daten in diesen 8 Byte des Heapspeichers beschädigt und als einzelne Zahl behandelt ( 8*8 = 64). Deshalb bekommst du die ersten 6 Zeichen, + NUL + Müll. Das ist sehr schlau. Auch gefährlich. Frage mich, warum es nicht segfault. Das achte Müllbyte ist außerhalb der Grenzen, nicht wahr?
Braden Best
Ich habe Ihre Analyse angesehen. Sie haben Recht, die Schicht sollte 56 gewesen sein, nicht 54. Außerdem würde ich das Wort nicht verfälscht verwenden. Der Speicher ist derselbe, die Bits werden nur unterschiedlich interpretiert. Technisch gesehen ist der Zugriff auf das Garbage-Byte ein undefiniertes Verhalten und kann einen Fehler verursachen. Praktischerweise befindet sich dieses Byte mit ziemlicher Sicherheit im selben gültigen Speicherblock wie der Rest der Zeichenfolge, und im Allgemeinen werden diese Blöcke (Heap, Stack, Konstanten) mindestens in Einheiten von Wortgröße zugewiesen. Der Speicher gehört also zum Programm, er enthält nur etwas anderes als den String.
AShelly
6

Ruby, 29 Bytes

Ich hatte zuerst etwas Ähnliches wie @ Borsunhos ersten Versuch, aber meiner war etwas länger und er veröffentlichte seine, bevor ich fertig war. Kam damit auf, bevor seine 30 Bytes bearbeitet wurden :)

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

Anwendungsbeispiele:

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

Bearbeiten: Zwei Jahre und einige Ruby-Versionen später

Ruby , 25 Bytes

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

Ersetzt String#sizedurch das neue unäre Plus. Probieren Sie es online!

daniero
quelle
Gut, ich konnte das nicht ^zum Laufen bringen (ich hatte nicht die Idee, die Gruppe zu verlassen).
Borsunho,
@Borsunho Ich muss zugeben, dass ich den Regex nur "brutal gezwungen" habe, bis ich das gewünschte Ergebnis erzielt habe :) Ich denke, das .*am Ende ist, was es funktioniert.
Daniero
Bricht ab, wenn die Eingabezeichenfolge mehrere Zeilen enthält und Google in einer eigenen Zeile steht. Ich denke, /\A(?!google\Z).*/mbehebt es (auf Kosten von drei Bytes, aber). ^und $passen Sie den Anfang und das Ende von Zeilen an, während \Aund \Zpassen Sie den Anfang und das Ende der Zeichenfolge als Ganzes an.
Histokrat
@histocrat, aber ich glaube nicht, dass Sie Zeichenfolgen mit mehreren Zeilen googeln können;)
Daniero
4

> <>, 55 Bytes

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

Dachte mir, ich würde es versuchen, aber nicht mein bester Golfversuch oder Algorithmus. Per se keine Funktion, aber ich denke, das sollte sich noch qualifizieren. Ich werde sehen, ob ich in einer besseren Version bearbeiten kann.

Wenn Sie die Länge und dann den Fehler drucken dürfen, ist hier eine 46-Byte-Lösung:

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

Bisherige 49-Byte-Lösung dieser Art:

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

Ich freue mich, eine Erklärung abzugeben, wenn Interesse besteht, und bitte lassen Sie mich wissen, wenn etwas mit meiner Antwort nicht stimmt oder wenn Sie Golfvorschläge haben.

cole
quelle
4

Javascript ES6, 51 27 25 Bytes

Hallo, ich bin neu im Code-Golf, also kann man wahrscheinlich viel mehr Golf spielen, aber hier ist es:

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

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

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

und ein Test:

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

Bearbeiten: Hinzugefügt? if ersetzen und Error durch ein undefiniertes Objekt ersetzen.

Edit 2: Ich erkannte, dass meine Byteanzahl falsch war und entfernte das g =

Generischer Benutzer
quelle
4

GolfScript, 14 16 Zeichen

{.,\'google'=!/}

Vergleicht wie viele andere einfach die Eingabe mit 'google'und dividiert die Länge durch die Umkehrung des Ergebnisses.

Beispielprogramme:

pswg
quelle
@ Tennis Ich verstehe deinen Standpunkt. In seiner ursprünglichen Form war es nicht wirklich wiederverwendbar (man konnte den Code nicht auf eine Liste anwenden). Außerdem habe ich nicht bemerkt, dass Sie eine praktisch identische Antwort in CJam geschrieben haben, lange bevor ich dies gepostet habe (tatsächlich war mir CJam als Sprache bis jetzt nur vage bewusst). +1 auch für Ihre Lösung.
pswg
4

Feststecken , 16 Bytes

s_l1u"google"=-/

Nach einer ähnlichen Methode wie bei den meisten anderen wird bei der Eingabe von "google" ein Fehler beim Teilen durch 0 verursacht.

Kade
quelle
4

Windows Batch, 118 Zeichen

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

Die Ausgabe ist% stringlength%.

Vollständiger Code:

@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

Modifiziert von Joshua Honigs Antwort hier .

Shane Smiskol
quelle