No busques en google "google"

158

Todos sabemos que si buscas en Google la palabra "google", romperá Internet.

Su tarea es crear una función que acepte una cadena y devuelva su longitud, en la menor cantidad posible de caracteres Unicode.

Sin embargo, si la cadena dada es google (minúscula), causará un error.

Por ejemplo, g('bing')volverá 4perog('google') causará un error.

Proporcione un ejemplo de uso y el error si es posible.

rybo111
fuente
122
Yo en Google Google , y Google encontré Google en Google. Mito destruido.
Geobits
86
@Geobits Eso es simplemente una prueba para ver si buscaré en Google Google, lo cual no haré. : D
rybo111
77
¿La función necesita ser sensible a mayúsculas y minúsculas? ¿Debería arrojar dado 'gOOgle'?
AXMIM
2
Cuando escribo google en google (la barra de búsqueda en chrome), aparece un mensaje preguntando si quería ir a google . (Ahora que es un tld, esto tiene sentido, es decir, com.google funciona). Hice clic y obtuve un error de búsqueda de DNS. Internet: roto!
Craig
44
Estoy votando para reabrir esto. No he visto ninguna pregunta sobre qué constituye un error para este desafío y ya tiene 154 respuestas, por lo que no creo que sea justo cambiar las especificaciones. Esto puede no ser un ejemplo de una buena pregunta, pero es lo suficientemente claro. Si una respuesta realmente se reduce a si un determinado resultado es o no un error, de todos modos probablemente no obtendrá tantos votos positivos.
Poke

Respuestas:

228

Pitón 2, 29

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

Da un ZeroDivisionErrorencendido "google"y la longitud de lo contrario. Esto aprovecha la igualación 0y el valor booleano de Python 1.

xnor
fuente
2
+1. Sin embargo, debe establecerlo gen su lambda, o llamarlo anónimamente con una entrada.
Zach Gates
44
Solo por diversión, probé esta técnica con JavaScript ES6. Terminó a las 25, pero regresa Infinitypara "google" en lugar de arrojar un error ...
ETHproductions
18
@ZachGates El consenso sobre el meta es que las funciones anónimas están permitidas a menos que no se permitan específicamente. Dado que la pregunta parece implicar algo como esto (pero todavía no lo rechaza explícitamente), debe preguntarle al OP al respecto.
FryAmTheEggman
3
@Kevin necesitarías un returnsi lo def
usaras
3
Divertidamente, esto traducido a Pyth funciona mejor que mi mejor solución anterior de Pyth. Es L/lbnb"google, 13 bytes.
isaacg
107

Excel, 23 caracteres

Pegue esto en una celda que no sea A1 y escriba su consulta de búsqueda en A1.

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

Por ejemplo:

Google Google

Hand-E-Food
fuente
99
¿Cuál es el consenso general sobre el uso de Excel?
Beta Decay
52
@BetaDecay. Creativo, poco común, parece funcionar. No será aplicable a todos los rompecabezas CG, ¡pero está aquí!
kdbanman
119
¡A los gerentes les encanta!
lkraider
18
Tan eficiente, los usuarios de CG lo odiarán por ello. Pero espera. ¡B3 cambiará tu vida para siempre!
Sumurai8
8
¿Cuál es el consenso específico sobre el uso de Excel?
GreenAsJade
81

C #, 43 bytes

Una mejora sobre la respuesta de Salah Alami. Se repite para lanzar una excepción de desbordamiento de pila al proporcionar "google"

int g(string s)=>s!="google"?s.Length:g(s);
DLeh
fuente
2
Sí, pensé que era una forma bastante inteligente de salvar a algunos personajes para lanzar una excepción. Con 4 caracteres, podría ser la forma más pequeña de lanzar una excepción en C #, no estoy seguro.
DLeh
66
Esto es inteligente! Sin embargo, las versiones recientes de C # tienen soporte para la recursividad de cola, por lo que esta función nunca se lanzará StackOverflowException. De hecho, nunca volverá (se comporta como while(true){}).
NightElfik
2
Las llamadas de recursión de @DLeh Tail son un poco complicadas. Debe ejecutar en x64 JIT y sin depurador (el depurador adjunto hará que la recursión de cola no funcione por razones obvias). Aquí está mi programa como prueba: imgur.com/ErNl8LJ y poco más sobre la recursión de la cola: blogs.msdn.com/b/davbr/archive/2007/06/20/… ;)
NightElfik
12
Jaja: g (cadena) ... me veré afuera ...
gregsdennis
1
@DLeh oh, espera, no, puedo igualar tus 43 bytes pero no superarlo. :) int g (string s) => s! = "google"? s.Length: s [9];
lee
57

Pyth, 14 13 caracteres

L/lbnb"google

Define una función con nombre y .

Esto divide la longitud por 1 si la cadena no es google y por 0 en caso contrario. La idea no es nueva, pero se me ocurrió de forma independiente.

Pruébalo en línea.

Cómo funciona

L                 Define y(b):
  lb                Compute len(b).
    nb"google       Compute (b != "google").
 /                  Set _ = len(b) / (b != "google").
                  Return _. (implicit)
Dennis
fuente
Sí, en realidad no estoy seguro de esto, no creo que haya sucedido antes con una cuerda. Normalmente puedes cerrarlo, ;pero obviamente no puedes aquí ...
FryAmTheEggman
No necesita la cotización final.
Maltysen
48
" Define una función con nombrey " . ¿Pero no hay ningún yen su código?
AL
46
@AL Eso es correcto. El incorporado Lredefine la función y.
Dennis
90
No estoy seguro, pero creo que odio a Pyth.
Sr. Lister
40

MATLAB, 63 41 40 38 36 bytes

¡Gracias a Tom Carpenter por eliminar 1 byte!

¡Gracias a Stewie Griffin por eliminar 2 bytes!

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

A diferencia de otras soluciones más elegantes, realizar una operación de división por cero en MATLAB no dará un error, sino más bien Inf. Esta solución determina que la longitud de la cadenannz . La cadena que se produce es de tal manera que se indexa desde el principio de la cadena hasta el final, que es esencialmente una copia de la cadena. Sin embargo, lo importante es que el comienzo de dónde acceder a la cadena se produce al verificar si la entrada es igual o no 'google'. Si no lo es, esto produce un índice inicial de 1 e indexamos en la cadena normalmente ... ya que MATLAB comienza a indexar en 1. Si es igual, el índice producido es 0 y MATLAB arrojará un error de indexación que indica que El índice debe ser un número entero positivo. El extra+es asegurar que la salida de la verificación de igualdad sea numérica en lugar de booleana / logical. Omitir +producirá una advertencia, pero debido a que las especificaciones de este desafío no permiten advertencias, +se requiere ... completando así el código.

Usos de ejemplo

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

Una versión más divertida, 83 77 76 74 72 bytes

¡Gracias a Tom Carpenter por eliminar 1 byte!

¡Gracias a Stewie Griffin por eliminar 2 bytes!

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

Lo anterior no es una presentación oficial, pero es algo más divertido de ejecutar. Abusando de evallas funciones anónimas, lo que hace el código es que verifica si la cadena de entrada es igual a 'google'... y si es así, esto abrirá el navegador web incorporado de MATLAB y muestra la página de error 404 de Google tratando de acceder al subpágina ubicada en icuando eso no existe. Si no, mostramos la longitud de la cadena normalmente.

Usos de ejemplo

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

ans =

     4

>> f('google')
>> 

La última llamada usando 'google'nos da esta pantalla:

ingrese la descripción de la imagen aquí

rayryeng
fuente
3
Puede guardar un byte usando en strcmplugar de isequal.
Tom Carpenter
@TomCarpenter - Divertido. De hecho, me dije que usara strcmppero terminé usando isequalpor alguna razón ... ¡gracias!
rayryeng
1
nnzes dos bytes más corto que numel. Tuviste mi voto hace unos años :-)
Stewie Griffin
31

JavaScript ES6, 34 27 25 caracteres

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

Lanza un error de referencia Δpara google.

Jonathan
fuente
10
Podría usar un operador ternario para guardar dos bytes.
Konrad Borowski
2
Yay, eso es exactamente lo que acabo de recibir. Si quieres ser elegante, usa un símbolo que la gente nunca usa en lugar de g para asegurarte de que no exista como una variable global. Δ es un buen nombre de variable :)
Domino
1
Podrías usarlo #, errores en JS afaik
aplaude el
77
Δ Google Illuminati confirmado
DynamiteReed
2
Voy a dejar esto aquí github.com/Rabrennie/anything.js
sagiksp
26

TI-BASIC, 15 bytes

Heck, mientras lo hacemos , bien podría obtener una respuesta TI-BASIC aquí.

El formato de entrada es "string":prgmNAME. ¡Gracias a Thomas Kwa por encontrarlo primero!

length(Ans)+log(Ans≠"GOOGLE

(Guía: agregue 1 byte por cada letra minúscula reemplazando una mayúscula. Entonces s/GOOGLE/google/g => +6 bytes.)

ahhhhh casos de prueba!

"GOGGLE":prgmG
               6
"BING":prgmG
               4
"GOOGLE":prgmG
           Error
Conor O'Brien
fuente
20 bytes: length(Ans)/(Ans≠"google. También tienes el caso equivocado; si se permiten mayúsculas, son 14 bytes. Por cierto, es válido pasar argumentos a través de Ans.
lirtosiast
AGOOGLEdebería dar 7, ¿correcto? Y no deberías contar el encabezado del programa en el tamaño de tu código, así que resta 10 bytes.
lirtosiast
ERROR: Estaba pensando en subcadenas. Por favor perdóname.
Conor O'Brien
1
@ThomasKwa No vi tu comentario con el código. Sucede que ambos nos topamos con la misma solución. Sin embargo, si cree que merece el crédito, el crédito será suyo. ^ _ ^ ( EDITAR Si pudieras leer el código, no es exactamente lo mismo.)
Conor O'Brien
@lirtosiast length(tiene dos bytes, eso haría que sus números sean 21 y 15 bytes.
Timtech
23

APL (14)

(⍴÷'google'∘≢)

Explicación:

  • : longitud
  • ÷: dividido por
  • 'google∘≢: argumento no es igual a 'google'.

da la longitud de la cadena, que se divide por 1 si la cadena no es igual google(lo que devuelve la longitud sin cambios), o por 0 si la cadena es igual google(dando un error).

marinus
fuente
11
Creo que no es necesario contar los parens, ya que se puede asignar a una variable sin ellos.
jimmy23013
Tipo de falla en argumentos de un solo carácter. Arreglar reemplazando con . Además, puede hacer que se vea más genial intercambiando los operandos de . Oh, no olvides quitar los parens. En general:≢÷≢∘'google'
Adám
21

Python 3, 30 bytes

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

Indexa la lista de funciones de 1 elemento, generando un IndexErrorsi el u=='google'predicado es True(= 1). Tal funcional.

Muchas variantes. Guau:

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

Si el desafío fue invertido (error en todo lo que no es "google"), podría guardar un char:

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

Pero ya sabes la longitud, así que solo codifícala.

Nick T
fuente
también funciona para Python 2.7
Noodle9
Por alguna razón, me encanta esta solución.
foslock
19

Haskell, 24 bytes

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

Salida:

Main> g "google"

Program error: pattern match failure: g "google"

Main> g "bing"
4
chs
fuente
15

CJam, 16 caracteres

{_,\"google"=!/}

Esto divide la longitud por 1 si la cadena no es google y por 0 en caso contrario. La idea no es nueva, pero se me ocurrió de forma independiente.

Pruébalo en línea.

Cómo funciona

_                 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
fuente
Curiosamente, un programa completo es más corto (15 bytes): q_,\"google"=!/. Lo desarrollé antes de ver esta publicación. Tenga en cuenta que esto toma toda la entrada (que parece tomar de todos modos como argumento de función). Desafortunadamente, no puede usarlo, ya que esto pide una función :(
Erik the Outgolfer
15

Octava, 63 bytes

Sé que es más largo que la solución de Matlab (que también funcionaría en Octave), pero es particularmente malo. Estoy haciendo una función anónima (evil) usando literales de matriz de celdas (evil) (evil) que contienen manejadores de funciones dependientes de una función de devolución de llamada (en sí misma, por lo tanto, recursiva, evil) que se debe pasar por argumento. Luego creo otro anónimo que básicamente reduce la función al argumento de cadena y arregla el segundo argumento de fas f(muy malvado). Cualquier humano sano nunca haría esto, porque es casi tan ilegible como Perl o regex (o cjam / pyth / cualquier otro esolang).

Entonces, si la cadena no es 'google', se llamará al segundo argumento de la matriz de celdas que genera la longitud de la cadena. De lo contrario, se llamará a la primera función, que se pasa como devolución de llamada (y también se pasa a sí misma como devolución de llamada), que más tarde es la función misma. El error es básicamente un error de profundidad de recursión máxima.

f=@(s,f){@()f(s,f),numel(s)}{2-strcmp(s,'google')}();@(s)f(s,f)
ಠ_ಠ
fuente
2
Esas cosas no son malas en la mayoría de los idiomas. Y este es el código de golf, algunos de los códigos más ilegibles del planeta existen aquí :). Enfriar mango por cierto.
BAR
99
Solo me faltan algunos evalaquí para que sea realmente MAL :-)
Luis Mendo
12

JavaScript, 25 bytes

Ejemplo de JavaScript agradable y simple:

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

Si se ingresa "google", entonces pasa un ReferenceError

Ejemplo

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

GeoffWilson
fuente
2
¡Guau, gracias por decirme que hay una abreviatura para las funciones de lamda en javascript!
Tomáš Zato
3
@ Advertencia de TomášZato: son completamente nuevos en ES2015 , por lo que el soporte todavía varía.
Anko
11

APL, 19 17 bytes

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

Esta es una función monádica sin nombre que arrojará un error de sintaxis si la entrada es google. Esto se logra al intentar tomar el logaritmo natural de la nada.

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

Pruébalo en línea

¡Ahorré dos bytes gracias a Dennis!

Alex A.
fuente
se conoce informalmente como "splat". Un nombre muy apropiado para este uso.
Adám
9

R, 46 bytes

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

A menos que esté leyendo mal, la publicación original nunca especificó que el código tenía que ser la sintaxis correcta.

Ejemplo:

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

Nunca agregué nada para el parámetro "no" de la instrucción ifelse, por lo que devolverá un error si se evoca este parámetro.

SyntonicC
fuente
10
Aquí hay uno un poco más corto:g=function(x)nchar(x)[[x!="google"]]
flodel
9

Perl, 31 29 bytes

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

-2b gracias a manatwork

Uso:

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

Si pudiera salir con un programa en lugar de una función, lo siguiente sería válido con solo 20 bytes (línea de comando de +1 byte)

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

El error es la división por cero.

Explicación:

y///c devuelve la longitud, luego !/^google$/ devolverá 0 si la entrada coincide con 'google'.

Uso:

perl -p entry.pl input.txt
Jarmex
fuente
2
Se podría hacer que sea una función anónima: sub{…}. (Entonces lo llamas como sub{…}->("google").)
manatwork
Ahorre 1 byte utilizando en $_!=googlelugar de!/^google$/
Gabriel Benamy
@GabrielBenamy, me temo !=que no funcionará comparar cadenas ...
Dada
7

Haskell - 30 caracteres

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

>g "google"
 *Exception: !
>g "str"
 3
C. Quilley
fuente
66
¿Por qué el signo de exclamación por error? ¿No haría una cadena vacía también?
Kritzefitz
1
Quería sugerir cambiarlo a x=x;g"google"=x;g s=length s, pero por alguna razón, las excepciones <<loop>> no se lanzan en ghci.
Kritzefitz
17
g s|s/="google"=length sevita la necesidad deerror
chs
7

Python 3, 35 bytes

lambda n:len(n)if n!='google'else d
Puertas de Zach
fuente
1
@FryAmTheEggman en realidad 16 bits más corto. XD
DiegoDD
1
@FryAmTheEggman: Buen truco pero la identificación no funciona con una cadena vacía:(lambda n:len(n)*(n!='google')or d)('')
pabouk
@pabouk Muy bien, gracias por señalarlo.
FryAmTheEggman
7

Java 7: 53 52 bytes

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

El código anterior arrojará la ArithmeticExceptiondivisión por cero y por cualquier Stringotro que no sea google. Vale la pena señalar que ==compara la referencia y no funcionará para StringObjetos.

Java 8: 29 bytes

(Basado en la sugerencia dada en el comentario a continuación)

s->s=="google"?0/0:s.length()
CoderCroc
fuente
1
También puede usar la declaración lambda de Java 8:s->(s.equals("google")?null:s).length();
hjk
3
"Vale la pena señalar que == compara la referencia y no funcionará para objetos de cadena". En realidad, todas las cadenas son objetos, por lo que comparar cadenas con ==Java generalmente no funcionará (a menos que esté confiando en el internamiento de cadenas, que es, bueno, malo). ¿Quizás te confundiste con JavaScript?
gengkev
1
@gengkev Si ambos son literales, funcionará ya que es el mismo objeto al que se hace referencia en el conjunto de cadenas. La especificación da un literal y aquí es un literal para que funcione.
Yassin Hajaj
2
@YassinHajaj Estoy de acuerdo en que la especificación lo da como un literal, pero eso es solo un ejemplo. Probablemente, la función debería realizar lo mismo si también se recibe información de stdin, o si la función se llama desde otra clase que se compila por separado. En cualquier caso, confiar en las optimizaciones del compilador (internamiento de cadenas) es una mala idea, que es lo que dije originalmente.
gengkev
7

C ++ 11, 54 (código) + 14 (#include) = 68

Bueno, la división por cero es solo un comportamiento indefinido, que no llamaría un error. Entonces mi enfoque.

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

uso

[](std::string s){return s!="google"?s.size():throw;}("google");
Zereges
fuente
1
Puede llamar size()para guardar 2 bytes. En C ++ 14, también puede usar lambdas genéricas y reemplazar std::stringpor auto. Tendría que pasarle un real std::stringen lugar de un const char*.
isanae
@isanae no sabía std::stringtiene size()método, gracias por eso. Soy consciente de lambdas genéricos en C ++ 14, pero no sé cómo me ayudaría, ya que "string"es const char*y no std::string.
Zereges
1
@Zereges std::stringtiene size()y length()porque es tanto un contenedor como una cadena . En cuanto a auto, llamarías a la lambda con en (std::string("google"))lugar de ("google"). La pregunta solo dice "acepta 1 cadena" sin especificar qué es una "cadena".
isanae
@isanae C ++ 14 también tiene "google"sque construir un std::string:)
Quentin
@Zereges puede simplemente throw;desencadenar std::terminate()(porque no hay una excepción actual aquí).
Quentin
6

MUMPS, 28 bytes

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

Uso:

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

<SELECT>g^MYROUTINE

¿Por qué? Bueno, $S[ELECT]es básicamente una declaración if-else compacta de múltiples cláusulas, casi como una coincidencia de patrones en un lenguaje como Haskell o Rust. Excepto ... a diferencia de Haskell o Rust, no se verifica la exhaustividad de los patrones, porque la noción de "seguridad en tiempo de compilación" es completamente ajena a MUMPS. Entonces, si su entrada es un patrón que no tuvo en cuenta, obtendrá un encantador error de tiempo de ejecución llamado <SELECT>.

senshin
fuente
6

Rubí, 34 30 27 26

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

Desconocido tplantea excepción.

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

Editar: versión totalmente legible y obvia que es más corta ...

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

Viejo: bastante similar a otras ideas, parece. ElevaráArgumentError si x es 'google'.

Borsunho
fuente
2
¿Por qué esos paréntesis? x=='google'?t: x.size
manatwork
6

JavaScript, 47 bytes

Agradable y simple

Editar: ahora cumple con las reglas

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

Pruebas

Error arrojado

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

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

Ningún error arrojado

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

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

Decaimiento Beta
fuente
Técnicamente, esto no cumple con las especificaciones del OP. Esta función alerta la longitud pero regresa undefined.
Bungle
@Bungle ¿Cómo está ahora?
Beta Decay
1
@Bungle ya veo. Olvidé que se necesitaba un retorno
Beta Decay
1
Usando las funciones de flecha de ES6 y el operador ternario (en lugar de si), puede exprimirlo un poco más :)
Carles Alcolea
1
@BetaDecay Originalidad primero; Respeto eso.
Carles Alcolea
6

C, 66 48

Original:

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

Usando OSX gcc,
l("duck");retornos 4,
l("google");causas Floating point exception: 8.

En otras plataformas, es posible que las constantes deban ajustarse según la resistencia.

Más corto :

menos dificultad, mismos resultados.

 l(int*s){return strlen(s)/!!strcmp(s,"Google");}
AShelly
fuente
Wow, esa es una lógica interesante allí. Si entiendo bien la parte del golf, de alguna manera estás cambiando los primeros seis caracteres para que quepan en un solo número gigante (casi como un hash), que, debido a que la pila es little endian, termina siendo "google", pero al revés ( 0x656c676f6f67= elgoog). Creo que esta respuesta necesita una explicación para aquellos de nosotros que apreciamos este tipo de cosas locas de bajo nivel.
Braden Best
Básicamente lo tienes. Simplemente convierte la memoria almacenando la cadena en un número de 64 bits. Endianness lo hace 'hacia atrás' en arquitecturas x86. El texto solo ocupa 7 bytes, por lo que la máscara simplemente oculta lo que pueda ser el próximo en la memoria. Es un truco divertido, pero creo que '!! strcmp (s, "google")' es en realidad más corto.
AShelly
1
De todos modos, +1. Seguro. Además, creo que puedes acortarlo eliminando los int 4 caracteres.
Braden Best
¡Después de escribir un poco , lo descubrí! Si char *, con unidades de 8-bits, se lanza along * , con unidades de 64-bits, sin reasignarse adecuadamente, los datos en esos 8 bytes de espacio de almacenamiento dinámico se corrompen y se tratan como un solo número ( 8*8 = 64). Es por eso que obtienes los primeros 6 caracteres, + NUL + basura. Eso es muy inteligente. Peligroso también. Me pregunto por qué no se segfault. Ese octavo byte de basura está fuera de límites, ¿no?
Braden Best
Miré tu análisis. Tienes razón, el cambio debería haber sido 56, no 54. Además, no usaría la palabra corrupto. La memoria es la misma, los bits se interpretan de manera diferente. Técnicamente, acceder al byte de basura es un comportamiento indefinido, y en realidad podría segfault. Prácticamente, ese byte casi seguramente reside en el mismo bloque de memoria legal que el resto de la cadena, y generalmente estos bloques (montón, pila, constantes) se asignan en unidades de tamaño de palabra como mínimo. Entonces, la memoria pertenece al programa, simplemente contiene algo diferente a la cadena.
AShelly
6

Ruby, 29 bytes

Primero se me ocurrió algo muy similar al primer intento de @ Borsunho, pero el mío fue un poco más largo y publicó el suyo antes de que terminara. Se le ocurrió esto antes de su edición de 30 bytes :)

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

Ejemplos de uso:

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

editar: Dos años y algunas versiones de Ruby más tarde

Rubí , 25 bytes.

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

Reemplazado String#sizecon el nuevo plus unario. Pruébalo en línea!

daniero
fuente
Genial, no pude hacer que esto funcionara (no se me ocurrió salir ^del grupo de partidos).
Borsunho
@Borsunho Tengo que admitir que simplemente "forcé brutalmente" la expresión regular hasta que obtuve el resultado que quería :) Creo que .*al final es lo que lo hace funcionar.
daniero
Se rompe si la cadena de entrada tiene varias líneas y contiene google en su propia línea. Creo que lo /\A(?!google\Z).*/marregla (a costa de tres bytes, sin embargo). ^y hacer $coincidir el principio y el final de las líneas, mientras que \Ay hacer \Zcoincidir el principio y el final de la cadena como un todo.
histocrat
@histocrat pero no creo que puedas googlear cadenas con múltiples líneas;)
daniero
4

> <>, 55 bytes

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

Sin embargo, pensé que lo intentaría, no es mi mejor intento o algoritmo de golf. No es una función per se, pero creo que esto aún debería calificar. Veré si puedo editar en una versión mejor.

Si puede imprimir la longitud y luego el error, aquí hay una solución de 46 bytes:

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

Solución previa de 49 bytes de esta naturaleza:

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

Me complace presentar una explicación si hay algún interés, y por favor avíseme si hay algún problema con mi respuesta o si tiene sugerencias de golf.

col
fuente
4

Javascript ES6, 51 27 25 bytes

Hola, soy nuevo en el código de golf, por lo que probablemente se pueda jugar mucho más, pero aquí está:

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

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

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

y alguna prueba:

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

Editar: ¿Agregado? para reemplazar si y reemplazar Error con un objeto indefinido.

Edición 2: me di cuenta de que mi número de bytes estaba mal y eliminé el g =

Usuario
fuente
4

GolfScript, 14 16 caracteres

{.,\'google'=!/}

Como muchos otros, simplemente compara la entrada 'google'y divide la longitud por el inverso del resultado.

Programas de ejemplo:

pswg
fuente
@ Dennis veo tu punto. En su forma original, no era exactamente reutilizable (no podría, por ejemplo, aplicar el código sobre una lista). Además, no me di cuenta de que había escrito una respuesta prácticamente idéntica en CJam mucho antes de que publicara esto (en realidad, hasta ahora solo era vagamente consciente de CJam como idioma). +1 para su solución, también.
pswg
4

Atascado , 16 Bytes

s_l1u"google"=-/

Seguir un método similar al de la mayoría de las personas provocará un error de división por 0 al ingresar "google".

Kade
fuente
4

Lote de Windows, 118 caracteres

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

La salida es% stringlength%.

Código completo:

@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

Modificado de la respuesta de Joshua Honig, aquí .

Shane Smiskol
fuente