Ne pas google "google"


158

Nous savons tous que si vous recherchez le mot "google" sur Google, cela cassera Internet.

Votre tâche consiste à créer une fonction qui accepte une chaîne et renvoie sa longueur, avec le moins de caractères Unicode possibles.

Cependant, si la chaîne donnée est google(minuscule), une erreur sera générée.

Par exemple, g('bing')retournera 4mais g('google')causera une erreur.

Veuillez fournir un exemple d'utilisation et l'erreur si possible.


122
J'ai googlé Google et Google a trouvé Google sur Google. Mythe Busted.
Geobits

86
@ Geobits C'est simplement un test pour voir si je vais chercher sur Google, ce que je ne ferai pas. : D
rybo111

7
La fonction doit-elle être sensible à la casse? Doit-il jeter donné 'gOOgle'?
AXMIM

2
Quand je tape google dans google (la barre de recherche sur chrome), un message me demanda si je voulais aller sur google . (Maintenant que c'est un tld, cela a du sens c'est-à-dire que com.google fonctionne). J'ai cliqué dessus et j'ai eu une erreur de recherche DNS. Internet: cassé!
Craig

4
Je vote pour rouvrir ceci. Je n'ai vu aucune question sur ce qui constitue une erreur pour ce défi et il a déjà 154 réponses, donc je ne pense pas qu'il soit juste de changer les spécifications. Ce n'est peut-être pas un bon exemple, mais c'est assez clair. Si la réponse est vraiment de savoir si une sortie donnée est une erreur, elle ne recevra probablement pas autant de votes positifs, de toute façon.
Poke

Réponses:


228

Python 2, 29

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

Donne un ZeroDivisionErrorsur "google", et la longueur autrement. Cela profite de l’égalisation des booléens de Python 0et 1.


2
+1 Vous devez cependant définir gvotre lambdaou l'appelez anonymement avec une entrée.
Zach Gates

4
Juste pour le fun, j'ai essayé cette technique avec JavaScript ES6. Il a fini à 25 ans, mais retourne Infinitypour "google" au lieu de
générer

18
@ZachGates Le consensus sur les méta est que les fonctions anonymes sont autorisées sauf si elles sont spécifiquement interdites. Étant donné que la question semble impliquer quelque chose comme ceci (mais ne la refuse pas explicitement pour le moment), vous devriez demander au PO à ce sujet.
FryAmTheEggman le

3
@ Kevin vous auriez besoin d'un returnsi vous avez utilisédef
FryAmTheEggman

3
Curieusement, cela traduit mieux en Pyth que ma meilleure solution Pyth antérieure. C'est L/lbnb"google13 octets.
isaacg

107

Excel, 23 caractères

Collez-le dans une cellule autre que A1 et tapez votre requête de recherche dans A1.

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

Par exemple:

GoogleGoogle


9
Quel est le consensus général sur l'utilisation d'Excel?
Beta Decay

52
@BetaDecay. Créatif, peu commun, semble fonctionner. Ne sera pas applicable à tous les casse-têtes de CG, mais c'est ici!
kdbanman

119
Les gestionnaires adorent ça!
lkraider

18
Si efficace, les utilisateurs de CG vous haïront pour cela. Mais attendez. B3 changera votre vie pour toujours!
Sumurai8

8
Quel est le consensus spécifique sur l'utilisation d'Excel?
GreenAsJade

81

C #, 43 octets

Une amélioration par rapport à la réponse de Salah Alami. Rechute pour renvoyer une exception de débordement de pile en fournissant "google"

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

2
Oui, je pensais que c'était une façon assez intelligente de sauver des personnages pour qu'ils jettent une exception. À 4 caractères, ce n'est peut-être pas le moyen le plus simple de générer une exception en C #.
DLeh

6
C'est malin! Cependant, les versions récentes de C # prennent en charge la récursion de la queue afin que cette fonction ne soit jamais lancée StackOverflowException. En fait, il ne reviendra jamais (se comporte comme while(true){}).
NightElfik

2
Les appels de récursivité @DLeh Tail sont un peu délicats. Vous devez exécuter x 64 JIT et sans débogueur (le débogueur attaché empêchera la récursion de la queue pour des raisons évidentes). Voici mon programme comme une preuve: imgur.com/ErNl8LJ et un peu plus au sujet de la lecture récursion queue: blogs.msdn.com/b/davbr/archive/2007/06/20/... ;)
NightElfik

12
Haha: g (string) ... Je vais me
débrouiller

1
@DLeh oh non, je peux faire correspondre vos 43 octets mais pas le battre. :) int g (chaîne s) => s! = "google"? s.Longueur: s [9];
lee

57

Pyth, 14 13 caractères

L/lbnb"google

Définit une fonction nommée y.

Cela divise la longueur par 1 si la chaîne n'est pas google et par 0 sinon. L'idée n'est pas nouvelle, mais je l'ai proposée indépendamment.

Essayez-le en ligne.

Comment ça fonctionne

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

Oui, je ne suis pas sûr de cela, je ne pense pas que ce soit déjà arrivé avec une ficelle. Normalement, vous pouvez le fermer ;mais évidemment, vous ne pouvez pas ici ...
FryAmTheEggman le

Vous n'avez pas besoin de la citation finale.
Maltysen

48
" Définit une fonction nommée y. " Mais il n'y a pas yde code dans votre code!?
AL le

46
@AL C'est correct. L'intégré Lredéfinit la fonction y.
Dennis

90
Je ne suis pas sûr, mais je pense que je déteste Pyth.
M. Lister

40

MATLAB, 63 41 40 38 36 octets

Merci à Tom Carpenter d’avoir supprimé 1 octet!

Merci à Stewie Griffin d'avoir réduit de 2 octets!

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

Contrairement aux autres solutions plus élégantes, effectuer une division par zéro dans MATLAB ne donnera pas une erreur, mais plutôt Inf. Cette solution trouve la longueur de la chaîne par nnz. La chaîne produite est telle que vous indexez du début à la fin de la chaîne, ce qui est essentiellement une copie de la chaîne. Cependant, l’important est que le début de l’accès à la chaîne soit généré en vérifiant si l’entrée est égale ou non 'google'. Si ce n'est pas le cas, cela produit un index de début égal à 1 et nous indexons normalement dans la chaîne ... car MATLAB commence à indexer à 1. S'il est égal, l'index produit est 0 et MATLAB émettra une erreur d'indexation indiquant que le index doit être un entier positif. L'extra+est de s'assurer que le résultat du contrôle d'égalité est numérique plutôt que booléen / logical. Omettre le +produira un avertissement, mais comme les spécifications de ce défi ne permettent pas les avertissements, le +est requis ... complétant ainsi le code.

Exemple d'utilisations

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

Une version plus amusante, 83 77 76 74 72 octets

Merci à Tom Carpenter d’avoir supprimé 1 octet!

Merci à Stewie Griffin d'avoir réduit de 2 octets!

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

Ce qui précède n’est pas une candidature officielle, mais c’est quelque chose de plus amusant à exécuter. Utilisant abusivement evaldes fonctions anonymes, le code vérifie si la chaîne de saisie est égale à 'google'... sous-page située à iquand cela n'existe pas. Sinon, nous affichons la longueur de la chaîne normalement.

Exemple d'utilisations

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

ans =

     4

>> f('google')
>> 

Le dernier appel en utilisant 'google'nous donne cet écran:

entrez la description de l'image ici


3
Vous pouvez enregistrer un octet en utilisant à la strcmpplace de isequal.
Tom Carpenter

@TomCarpenter - drôle. En fait, je me suis dit d'utiliser strcmpmais j'ai fini par utiliser isequalpour une raison quelconque ... merci!
Rayryeng

1
nnzest deux octets plus court que numel. Vous avez voté il y a quelques années :-)
Stewie Griffin

31

JavaScript ES6, 34 27 25 caractères

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

Lance une ReferenceError sur Δpour Google.


10
Vous pouvez utiliser un opérateur ternaire pour enregistrer deux octets.
Konrad Borowski

2
Oui, c'est exactement ce que je viens de recevoir. Si vous voulez être chic, utilisez un symbole que les gens ne utilisent jamais à la place de g pour être sûr qu'il n'existera pas en tant que variable globale. Δ donne un bon nom de variable :)
Domino

1
Vous pouvez utiliser #, il erreurs dans JS afaik
applaudir

7
Δ Google Illuminati confirmé
DynamiteReed

2
Je vais juste laisser ça ici github.com/Rabrennie/anything.js
sagiksp

26

TI-BASIC, 15 octets

Heck, pendant que nous y sommes , autant obtenir une réponse TI-BASIC ici.

Le format d'entrée est "string":prgmNAME. Nous remercions Thomas Kwa de l' avoir trouvé en premier!

length(Ans)+log(Ans≠"GOOGLE

(Guide: ajoutez 1 octet pour chaque lettre minuscule en remplaçant une lettre majuscule. Donc s/GOOGLE/google/g => +6 bytes.)

ahhhhh cas de test!

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

20 octets: length(Ans)/(Ans≠"google. Vous avez également le cas mal; si les majuscules sont autorisées, elles sont de 14 octets. En passant, il est valide de passer des arguments à Ans.
lirtosiast

AGOOGLEdevrait donner 7, correct? Et vous ne devriez pas compter l'en-tête du programme dans la taille de votre code, donc soustrayez 10 octets.
lirtosiast

ERREUR: Je pensais aux sous-chaînes. Veuillez me pardonner.
Conor O'Brien le

1
@ThomasKwa Je n'ai pas vu votre commentaire avec le code. Il se trouve que nous sommes tous les deux tombés sur la même solution. Toutefois, si vous croyez mériter ce crédit, le crédit vous appartient. ^ _ ^ ( EDIT Si vous lisiez le code, ce n'est pas exactement la même chose.)
Conor O'Brien Le

@lirtosiast length(est deux octets, cela ferait vos nombres 21 et 15 octets.
Timtech

23

APL (14)

(⍴÷'google'∘≢)

Explication:

  • : longueur
  • ÷: divisé par
  • 'google∘≢: l'argument n'est pas égal à 'google'.

donne la longueur de la chaîne, divisée par 1 si la chaîne n'est pas égale google(ce qui rend la longueur inchangée), ou par 0 si la chaîne est égale google(en donnant une erreur).


11
Je pense que vous n'avez pas besoin de compter les parenthèses, car elle peut être assignée à une variable sans eux.
jimmy23013

Kind-of échoue sur les arguments à caractère unique. Correction en remplaçant par . En outre, vous pouvez le rendre plus cool en échangeant les opérandes de . Oh, n'oubliez pas de retirer les parens. Tout-en-un:≢÷≢∘'google'
Adám

21

Python 3, 30 octets

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

Indexe la liste de fonctions à 1 élément, en soulevant un IndexErrorsi le u=='google'prédicat est True(= 1). Tellement fonctionnel.

Beaucoup de variantes. Sensationnel:

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

Si le défi était inversé (erreur sur tout ce qui n'est pas "google"), vous pourriez enregistrer un caractère:

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

Mais vous connaissez déjà la longueur, il suffit donc de la coder en dur.


fonctionne aussi pour Python 2.7
Noodle9

Pour une raison quelconque, j'adore cette solution.
foslock

19

Haskell, 24 octets

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

Sortie:

Main> g "google"

Program error: pattern match failure: g "google"

Main> g "bing"
4

15

CJam, 16 caractères

{_,\"google"=!/}

Cela divise la longueur par 1 si la chaîne n'est pas google et par 0 sinon. L'idée n'est pas nouvelle, mais je l'ai proposée indépendamment.

Essayez-le en ligne.

Comment ça fonctionne

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

Il est intéressant, un programme complet est plus court (15 octets): q_,\"google"=!/. Développé avant de voir ce post. Notez que cela prend toute l' entrée (que vous semblez prendre de toute façon comme argument de fonction). Malheureusement, vous ne pouvez pas l'utiliser, car cela demande une fonction :(
Erik the Outgolfer

15

Octave, 63 octets

Je sais que c'est plus long que la solution Matlab (qui fonctionnerait aussi dans Octave), mais c'est particulièrement pervers. Je crée une fonction anonyme (mal) en utilisant un tableau de cellules (mal) des littéraux (mal) contenant des descripteurs de fonction dépendants d'une fonction de rappel (elle-même, donc récursive, mal) qui doivent être transmis via un argument. Ensuite, je crée un autre anonyme qui réduit fondamentalement la fonction à l'argument chaîne et corrige le deuxième argument de fas f(très diabolique). Aucun humain sensé ne le ferait jamais, car il est presque aussi illisible que Perl ou regex (ou cjam / pyth / tout autre esolang).

Donc, si la chaîne n'est pas "google", le deuxième argument du tableau de cellules sera appelé, ce qui donnera la longueur de la chaîne. Sinon, la première fonction sera appelée, qui sera transmise comme rappel (et se transmettra elle-même comme rappel), qui sera plus tard la fonction elle-même. L'erreur est fondamentalement une erreur de profondeur de récursivité maximale.

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

2
Ces choses ne sont pas mauvaises dans la plupart des langues. Et c'est le golf de code, une partie du code plus illisible sur la planète existe ici :). Cool poignée en fait.
BAR

9
Il me manque seulement quelques-uns evalici pour le rendre vraiment MAL :-)
Luis Mendo

12

JavaScript, 25 octets

Exemple JavaScript simple et agréable:

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

Si "google" est entré, alors il passe un ReferenceError

Exemple

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


2
Wow, merci de me dire qu'il existe un raccourci pour les fonctions de lamda en javascript!
Tomáš Zato

3
@ TomášZato Caveat: ils sont nouveaux dans ES2015 , le support varie donc toujours.
Anko

11

APL, 19 17 octets

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

Il s'agit d'une fonction monadique non nommée qui générera une erreur de syntaxe si l'entrée est google. Ceci est accompli en essayant de prendre le logarithme naturel de rien.

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

Essayez-le en ligne

Sauvé deux octets grâce à Dennis!


est connu de manière informelle comme "splat". Un nom très approprié pour cet usage.
Adám

9

R, 46 octets

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

À moins que je ne me trompe, le message d'origine n'a jamais précisé que le code devait être une syntaxe correcte.

Exemple:

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

Je n’ai jamais rien ajouté pour le paramètre "no" de l’instruction ifelse, ce qui renverra une erreur si ce paramètre est évoqué.


10
En voici un légèrement plus court:g=function(x)nchar(x)[[x!="google"]]
flodel

9

Perl, 31 29 octets

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

-2b grâce à manatwork

Usage:

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

Si je pouvais m'en tirer avec un programme plutôt qu'une fonction, les éléments suivants seraient valables avec seulement 20 octets (ligne de commande de +1 octet)

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

L'erreur est la division par zéro.

Explication:

y///cretourne la longueur, puis !/^google$/retournera 0 si l'entrée correspond à "google".

Usage:

perl -p entry.pl input.txt

2
Vous pouvez faire une fonction anonyme: sub{…}. (Ensuite, vous l'appelez comme sub{…}->("google").)
Manatwork

Économisez 1 octet en utilisant $_!=googleau lieu de!/^google$/
Gabriel Benamy

@GabrielBenamy J'ai bien peur de !=ne pas pouvoir comparer les cordes ...
Dada

7

Haskell - 30 caractères

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

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

6
Pourquoi le point d'exclamation de l'erreur? Une chaîne vide ne ferait-elle pas de même?
Kritzefitz

1
Je voulais suggérer de le changer en x=x;g"google"=x;g s=length s, mais pour une raison quelconque, les exceptions << boucle >> ne sont pas générées en ghci.
Kritzefitz

17
g s|s/="google"=length sévite le besoin deerror
chs

7

Python 3, 35 octets

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

1
@FryAmTheEggman en fait 16 bits plus court. XD
DiegoDD

1
@FryAmTheEggman: Bon truc mais l'id ne fonctionne pas avec une chaîne vide:(lambda n:len(n)*(n!='google')or d)('')
pabouk le

@pabouk Très bien, merci de l'avoir signalé.
FryAmTheEggman le

7

Java 7: 53 52 octets

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

Le code ci-dessus jettera ArithmeticException pour la division par zéro et pour tout Stringautre que google. Il convient de noter que ==compare la référence et ne fonctionnera pas pour les Stringobjets.

Java 8: 29 octets

(Basé sur la suggestion donnée dans le commentaire ci-dessous)

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

1
Vous pouvez également utiliser la déclaration lambda de Java 8:s->(s.equals("google")?null:s).length();
hjk le

3
"Il est intéressant de noter que == compare les références et ne fonctionnera pas pour les objets String." En fait, toutes les chaînes sont des objets, donc comparer des chaînes ==en Java ne fonctionnera généralement pas (à moins que vous ne dépendiez de l'internalisation des chaînes, ce qui est mauvais). Peut-être que vous avez confondu avec JavaScript?
Gengkev

1
@gengkev S'il s'agit de deux littéraux, cela fonctionnera puisqu'il s'agit du même objet référencé dans le pool String. La spécification donne un littéral et ici c'est un littéral donc ça va marcher.
Yassin Hajaj

2
@YassinHajaj Je conviens que la spécification le donne littéralement, mais ce n'est qu'un exemple. La fonction devrait probablement effectuer la même chose si elle reçoit également l'entrée de stdin ou si elle est appelée depuis une autre classe compilée séparément. Dans tous les cas, compter sur les optimisations du compilateur (internat de chaînes) est une mauvaise idée, ce que j'ai dit à l'origine.
Gengkev

7

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

Eh bien, la division par zéro n’est qu’un comportement indéfini, ce que je n’appellerais pas une erreur. Donc mon approche.

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

usage

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

1
Vous pouvez appeler size()pour sauvegarder 2 octets. En C ++ 14, vous pouvez également utiliser des lambdas génériques et les remplacer std::stringpar auto. Vous devez passer un réel std::stringà la place d'un const char*.
Isanae

@isanae Je ne savais pas std::stringa size()méthode, merci pour cela. Je connais des lambdas génériques en C ++ 14, mais je ne sais pas comment cela pourrait m'aider, puisque "string"oui const char*ou non std::string.
Zereges

1
@Zereges std::stringa size()et length()parce que c'est à la fois un conteneur et une chaîne . En ce qui concerne auto, vous appelez le lambda avec (std::string("google"))au lieu de ("google"). La question dit seulement "accepte 1 chaîne" sans spécifier ce qu'est une "chaîne".
Isanae

@isanae C ++ 14 doit également "google"sconstruire un std::string:)
Quentin

@Zereges vous pouvez simplement throw;déclencher std::terminate()(car il n'y a pas d'exception actuelle ici).
Quentin

6

MUMPS, 28 octets

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

Usage:

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

<SELECT>g^MYROUTINE

Pourquoi? Eh bien, il $S[ELECT]s’agit en gros d’une déclaration multipartite if-else, presque semblable à une correspondance de motif dans un langage comme Haskell ou Rust. Sauf que, contrairement à Haskell ou Rust, les motifs ne sont pas vérifiés quant à leur exhaustivité, car la notion de "sécurité au moment de la compilation" est totalement étrangère à MUMPS. Donc, si votre entrée est un motif que vous n'avez pas pris en compte, vous obtenez une belle erreur d'exécution appelée <SELECT>.


6

Ruby, 34 30 27 26

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

Unknown tdéclenche une exception.

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

Edit: version totalement lisible et évidente qui est plus courte ...

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

Old: Assez similaire à d'autres idées semble-t-il Sera levé ArgumentErrorsi x est 'google'.


2
Pourquoi ces parenthèses? x=='google'?t: x.size
Manatwork

6

JavaScript, 47 octets

Sympa et simple.

Edit: se conforme maintenant aux règles

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

Essai

Erreur levée

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

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

Aucune erreur jetée

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

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


Techniquement, cela ne répond pas aux spécifications de l'OP. Cette fonction alerte la longueur mais retourne undefined.
Bungle

@Bungle Comment ça va maintenant?
Beta Decay

1
@Bungle je vois. J'avais oublié qu'un retour s'imposait
Beta Decay

1
En utilisant les fonctions de flèches de l'ES6 et l'opérateur ternaire (au lieu de if), vous pouvez réduire encore un peu cette valeur :)
Carles Alcolea

1
@BetaDecay L'originalité d'abord; Je respecte ça.
Carles Alcolea

6

C, 66 48

Original:

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

Utilisation de OSX gcc,
l("duck");retours 4,
l("google");causes Floating point exception: 8.

Sur d'autres plates-formes, il peut être nécessaire d'ajuster les constantes en fonction de l'endianité.

Plus court :

moins d'astuce, mêmes résultats.

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

Wow, c'est une logique intéressante ici. Si je comprends bien la partie "golfy", vous déplacez d'une manière ou d'une autre les six premiers caractères pour qu'ils tiennent dans un seul chiffre géant (presque comme un hachage), qui, du fait que la pile est un petit bout, finit par être "google", mais en arrière ( 0x656c676f6f67= elgoog). Je pense que cette réponse nécessite une explication pour ceux d’entre nous qui apprécions ce genre de trucs fous de bas niveau.
Braden Best

Vous l'avez essentiellement. Il convertit simplement la mémoire stockant la chaîne en un nombre de 64 bits. Endianness le rend "en arrière" sur les architectures x86. Le texte n'occupant que 7 octets, le masque masque donc tout ce qui peut se trouver en mémoire. C'est un truc amusant, mais je pense que "!! strcmp (s," google ")" est en fait plus court.
AShelly

1
Quoi qu'il en soit, +1. Absolument. En outre, je pense que vous pouvez le raccourcir en supprimant le int , qui est de 4 caractères.
Braden Best

Après avoir tapé quelque chose, je l'ai compris! Si char *, avec des unités de 8-bits, est converti en long *unités 64-bits, sans être correctement réaffecté, les données de ces 8 octets d'espace de segment de mémoire sont corrompues et traitées comme un seul nombre ( 8*8 = 64). C'est pourquoi vous obtenez les 6 premiers caractères, + NUL + garbage. C'est très intelligent. Dangereux aussi. Je me demande pourquoi il ne segfault pas. Ce 8ème octet de poubelle est hors limites, non?
Braden Best

J'ai regardé votre analyse. Vous avez raison, le décalage aurait dû être 56 et non 54. De plus, je n'utiliserais pas le mot corrompu. La mémoire est la même, les bits sont simplement interprétés différemment. Techniquement, accéder à l’octet de mémoire est un comportement indéfini, et pourrait en fait être une erreur de segmentation. Pratiquement, cet octet réside presque certainement dans le même bloc de mémoire juridique que le reste de la chaîne, et généralement ces blocs (tas, pile, constantes) sont alloués au minimum en unités de la taille d'un mot. La mémoire appartient donc au programme, elle ne contient que quelque chose d'autre que la chaîne.
AShelly

6

Ruby, 29 octets

J'ai tout d'abord proposé quelque chose de très similaire à la première tentative de @ Borsunho, mais la mienne était légèrement plus longue et il l'a postée avant la fin. Entré avec cela avant son édition de 30 octets :)

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

Exemples d'utilisation:

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

edit: Deux ans et quelques versions de Ruby plus tard

Ruby , 25 octets

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

Remplacé String#sizepar le nouveau plus unaire. Essayez-le en ligne!


Bien, je ne pouvais pas faire fonctionner ça (je ne pensais pas partir en ^dehors du groupe de match).
Borsunho

@Borsunho Je dois admettre que je viens de "forcer brutalement" le regex jusqu'à ce que j'ai obtenu le résultat que je voulais :) Je pense que c'est .*la fin qui fait son succès.
daniero

Se casse si la chaîne d'entrée a plusieurs lignes et contient Google sur sa propre ligne. Je pense /\A(?!google\Z).*/mrésoudre le problème (au prix de trois octets, cependant). ^et $correspond au début et à la fin des lignes, while \Aet \Zau début et à la fin de la chaîne dans son ensemble.
histocrat

@histocrat mais je ne pense pas que vous puissiez chercher des chaînes sur plusieurs lignes;)
daniero

4

> <>, 55 octets

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

Je pensais que j'allais tenter le coup, pas ma meilleure tentative de golf ni mon meilleur algorithme. Pas une fonction en soi, mais je pense que cela devrait quand même être admissible. Je verrai si je peux éditer une meilleure version.

Si vous êtes autorisé à imprimer la longueur puis l'erreur, voici une solution de 46 octets:

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

Solution précédente de 49 octets de cette nature:

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

Je serai heureux de fournir une explication si cela vous intéresse, et s'il vous plaît, laissez-moi savoir si ma réponse a un problème ou si vous avez des suggestions pour le golf.


4

Javascript ES6, 51 27 25 octets

Salut, je suis nouveau sur le code de golf, donc cela peut probablement être joué beaucoup plus, mais voici:

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

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

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

et quelques 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

Edit: ajouté? pour remplacer if et remplacer Error par un objet non défini.

Edit 2: j’ai réalisé que mon nombre d’octets était faux et j’ai supprimé le g =


4

GolfScript, 14 à 16 caractères

{.,\'google'=!/}

Comme beaucoup d'autres, compare simplement l'entrée à 'google'et divise la longueur par l'inverse du résultat.

Exemples de programmes:


@ Dennis je vois votre point. Dans sa forme originale, il n'était pas exactement réutilisable (vous ne pouviez pas, par exemple, appliquer le code sur une liste). De plus, je ne savais pas que vous aviez écrit une réponse pratiquement identique dans CJam bien avant de la publier (en fait, je n’étais que vaguement au courant de CJam en tant que langue jusqu’à présent). +1 pour votre solution aussi.
pswg

4

Coincé , 16 octets

s_l1u"google"=-/

Suivre une méthode similaire à la plupart des gens provoquera une erreur de division par 0 sur "google" en cours de saisie.


4

Lot Windows, 118 caractères

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

La sortie est% stringlength%.

Code complet:

@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

Modifié à partir de la réponse de Joshua Honig, ici .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.