Non google "google"


158

Sappiamo tutti che se google la parola "google" si romperà Internet.

Il tuo compito è creare una funzione che accetti una stringa e restituisca la sua lunghezza, nel minor numero possibile di caratteri Unicode.

Tuttavia, se la stringa specificata è google(minuscola), causerà un errore.

Ad esempio, g('bing')verrà restituito 4ma g('google')causerà un errore.

Fornisci un esempio di utilizzo e, se possibile, l'errore.


122
Ho cercato su Google e Google ha trovato Google su Google. Mito rotto.
Geobits,

86
@Geobits Questo è semplicemente un test per vedere se google Google, cosa che non lo farò. : D
rybo111,

7
La funzione deve essere sensibile al maiuscolo / minuscolo? Dovrebbe lanciare dato 'gOOgle'?
AXMIM,

2
Quando ho digitato google in google (la barra di ricerca su Chrome), è apparso un messaggio che mi chiedeva se volevo andare su google . (Ora che è un vecchio, questo ha senso, ad esempio com.google funziona). Ho cliccato e ho ricevuto un errore di ricerca DNS. Internet: rotto!
Craig,

4
Sto votando per riaprirlo. Non ho visto domande su ciò che costituisce un errore per questa sfida e ha già 154 risposte, quindi non credo sia giusto cambiare le specifiche. Questo potrebbe non essere un esempio di buona domanda, ma è abbastanza chiaro. Se una risposta si riduce davvero al fatto che un determinato output sia o meno un errore, probabilmente non otterrà altrettanti voti, comunque.
Colpisci il

Risposte:


228

Python 2, 29

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

Dà un ZeroDivisionErroron "google"e la lunghezza altrimenti. Questo sfrutta i booleani di Python 0e 1.


2
+1. Tuttavia, è necessario impostare il gproprio lambdao chiamarlo in modo anonimo con un input.
Zach Gates,

4
Solo per divertimento, ho provato questa tecnica con JavaScript ES6. È finito a 25, ma ritorna Infinityper "google" invece di lanciare un errore ...
ETHproductions

18
@ZachGates Il consenso su meta è che le funzioni anonime sono consentite se non espressamente vietate. Dal momento che la domanda sembra implicare qualcosa del genere (ma non lo rifiuta esplicitamente), è necessario chiedere al PO.
FryAmTheEggman,

3
@Kevin ne avresti bisogno returnse lo def
usassi

3
In modo divertente, questo tradotto in Pyth fa meglio della mia migliore soluzione Pyth precedente. È di L/lbnb"google13 byte.
isaacg,

107

Excel, 23 caratteri

Incollalo in una cella diversa da A1 e digita la query di ricerca in A1.

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

Per esempio:

GoogleGoogle


9
Qual è il consenso generale sull'utilizzo di Excel?
Decadimento beta

52
@BetaDecay. Creativo, non comune, sembra funzionare. Non sarà applicabile a tutti i puzzle CG, ma è qui!
kdbanman,

119
I gestori lo adorano!
Lkraider,

18
Così efficiente, gli utenti di CG ti odieranno per questo. Ma aspetta. B3 ti cambierà per sempre la vita!
Sumurai8

8
Qual è il consenso specifico sull'utilizzo di Excel?
GreenAsJade,

81

C #, 43 byte

Un miglioramento rispetto alla risposta di Salah Alami. Recruit ha lanciato un'eccezione di overflow dello stack fornendo "google"

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

2
Sì, ho pensato che fosse un modo abbastanza intelligente per salvare alcuni personaggi e lanciare un'eccezione. Con 4 caratteri, potrebbe essere il modo più piccolo per generare un'eccezione in C #, non sono sicuro.
DLeh

6
Questo è intelligente! Tuttavia, le versioni recenti di C # supportano la ricorsione della coda, quindi questa funzione non verrà mai lanciata StackOverflowException. In realtà non tornerà mai (si comporta come while(true){}).
NightElfik,

2
@DLeh Le chiamate di ricorsione della coda sono un po 'complicate. Devi eseguire su x64 JIT e senza debugger (il debugger collegato farà in modo che la ricorsione della coda non funzioni per ovvi motivi). Ecco il mio programma come prova: imgur.com/ErNl8LJ e qualche altra lettura sulla ricorsione della coda: blogs.msdn.com/b/davbr/archive/2007/06/20/… ;)
NightElfik

12
Haha: g (stringa) ... Mi vedrò fuori ...
Gregregdennis il

1
@Deh oh aspetta no posso abbinare i tuoi 43 byte ma non batterlo. :) int g (string s) => s! = "google"? s.Length: s [9];
sottovento il

57

Pyth, 14 13 caratteri

L/lbnb"google

Definisce una funzione con nome y.

Questo divide la lunghezza per 1 se la stringa non è google e per 0 altrimenti. L'idea non è nuova, ma mi è venuta in mente in modo indipendente.

Provalo online.

Come funziona

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

Sì, in realtà non sono sicuro di questo, non penso che sia successo prima con una stringa. Normalmente potresti chiuderlo con, ;ma ovviamente non puoi qui ...
FryAmTheEggman,

Non è necessario il preventivo finale.
Maltysen,

48
" Definisce una funzione con nome y. " Ma non c'è nessuna ynel tuo codice !?
AL

46
@AL È corretto. Il built-in Lridefinisce la funzione y.
Dennis,

90
Non ne sono sicuro, ma penso di odiare Pyth.
Lister,

40

MATLAB, 63 41 40 38 36 byte

Grazie a Tom Carpenter per la rasatura di 1 byte!

Grazie a Stewie Griffin per la rasatura di 2 byte!

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

A differenza delle altre soluzioni più eleganti, eseguire una divisione per operazione zero in MATLAB non darà un errore, ma piuttosto Inf. Questa soluzione trova la lunghezza della stringa di nnz. La stringa prodotta è in modo tale da indicizzare dall'inizio della stringa fino alla fine, che è essenzialmente una copia della stringa. Tuttavia, ciò che è importante è che l'inizio di dove accedere alla stringa sia prodotto verificando se l'input è uguale o meno 'google'. In caso contrario, questo produce un indice iniziale di 1 e indicizziamo normalmente la stringa ... poiché MATLAB inizia a indicizzare su 1. Se è uguale, l'indice prodotto è 0 e MATLAB genererà un errore di indicizzazione affermando che il L'indice deve essere un numero intero positivo. Il extra+è garantire che l'output del controllo di uguaglianza sia numerico anziché booleano / logical. Se si omette, +verrà generato un avviso, ma poiché le specifiche di questa sfida non consentono avvisi, +è necessario ... completando così il codice.

L'esempio usa

>> 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 versione più divertente, 83 77 76 74 72 byte

Grazie a Tom Carpenter per la rasatura di 1 byte!

Grazie a Stewie Griffin per la rasatura di 2 byte!

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

Quanto sopra non è una presentazione ufficiale, ma è qualcosa che è un po 'più divertente da eseguire. Abusando evaldi funzioni anonime, ciò che il codice fa è che controlla se la stringa di input è uguale a 'google'... e se lo è, questo aprirà il browser web integrato di MATLAB e mostrerà la pagina di errore 404 di Google che prova ad accedere al sottopagina situata in iquando non esiste. In caso contrario, visualizziamo normalmente la lunghezza della stringa.

L'esempio usa

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

ans =

     4

>> f('google')
>> 

L'ultima chiamata usando 'google'ci dà questa schermata:

inserisci qui la descrizione dell'immagine


3
È possibile salvare un byte utilizzando strcmpinvece di isequal.
Tom Carpenter,

@TomCarpenter - Divertente. In realtà mi sono detto di usare strcmpma ho finito per usarlo isequalper qualche ragione .... grazie!
Rayryeng,

1
nnzè due byte più breve di numel. Ho avuto il mio voto qualche anno fa :-)
Stewie Griffin,

31

JavaScript ES6, 34 27 25 caratteri

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

Genera un errore di riferimento Δper google.


10
È possibile utilizzare un operatore ternario per salvare due byte.
Konrad Borowski,

2
Sì, è esattamente quello che ho appena ricevuto. Se vuoi essere sofisticato, usa un simbolo che le persone non usano mai al posto di g per essere sicuro che non esisterà come variabile globale. Δ crea un buon nome di variabile :)
Domino,

1
Potresti usare #, errori in JS afaik
applaudi il

7
Δ Google Illuminati confermato
DynamiteReed


26

TI-BASIC, 15 byte

Diamine, mentre ci siamo , potrebbe anche ottenere una risposta TI-BASIC qui.

Il formato di input è "string":prgmNAME. Ringraziamo Thomas Kwa per averlo trovato per primo!

length(Ans)+log(Ans≠"GOOGLE

(Guida: aggiungi 1 byte per ogni lettera minuscola sostituendo una maiuscola. Quindi s/GOOGLE/google/g => +6 bytes.)

ahhhhh casi di test!

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

20 byte: length(Ans)/(Ans≠"google. Hai anche sbagliato il caso; se è consentita la maiuscola è di 14 byte. A proposito, è valido per passare argomenti attraverso Ans.
lirtosiast,

AGOOGLEdovrebbe dare 7, corretto? E non dovresti contare l'intestazione del programma nella dimensione del tuo codice, quindi sottrai 10 byte.
lirtosiast,

ERRORE: stavo pensando alle sottostringhe. Per favore, perdonami.
Conor O'Brien,

1
@ThomasKwa Non ho visto il tuo commento con il codice. Accade così che entrambi ci siamo imbattuti nella stessa soluzione. Tuttavia, se ritieni di meritare il credito, il credito sarà tuo. ^ _ ^ ( MODIFICA Se leggessi il codice, non è esattamente la stessa cosa.)
Conor O'Brien,

@lirtosiast length(è di due byte, che renderebbe i tuoi numeri 21 e 15 byte.
Timtech,

23

APL (14)

(⍴÷'google'∘≢)

Spiegazione:

  • : lunghezza
  • ÷: diviso per
  • 'google∘≢: argomento non è uguale a 'google'.

dà la lunghezza della stringa, che è diviso da 1 se la stringa non è uguale a google(che dà la lunghezza posteriore invariato), oppure 0 se la stringa non uguale google(dando un errore).


11
Penso che non sia necessario contare le parentesi, poiché può essere assegnata a una variabile senza di esse.
jimmy23013,

Kind-of non riesce su argomenti a carattere singolo. Risolto sostituendo con . Inoltre, puoi renderlo più bello scambiando gli operandi di . Oh, non dimenticare di rimuovere le parentesi. Tutto sommato:≢÷≢∘'google'
Adám,

21

Python 3, 30 byte

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

Indicizza l'elenco di funzioni a 1 elemento, aumentando un IndexErrorse il u=='google'predicato è True(= 1). Tale funzionale.

Molte varianti. Wow:

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

Se la sfida è stata invertita (errore su tutto ciò che non è "google"), è possibile salvare un carattere:

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

Ma conosci già la lunghezza, quindi basta codificarla.


funziona anche per Python 2.7
Noodle9

Per qualche ragione, adoro questa soluzione.
foslock,

19

Haskell, 24 byte

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

Produzione:

Main> g "google"

Program error: pattern match failure: g "google"

Main> g "bing"
4

15

CJam, 16 caratteri

{_,\"google"=!/}

Questo divide la lunghezza per 1 se la stringa non è google e per 0 altrimenti. L'idea non è nuova, ma mi è venuta in mente in modo indipendente.

Provalo online.

Come funziona

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

È interessante notare che, un programma completo è più breve (15 byte): q_,\"google"=!/. Sviluppato prima di vedere questo post. Si noti che questo richiede l' intero input (che sembra prendere comunque come argomento di funzione). Sfortunatamente, non puoi usarlo, poiché questo richiede una funzione :(
Erik the Outgolfer

15

Ottava, 63 byte

So che è più lungo della soluzione Matlab (che funzionerebbe anche in Octave), ma è particolarmente malvagio. Sto creando una funzione anonima (malvagia) usando letterali (malvagi) letterali (malvagi) contenenti handle di funzioni dipendenti da una funzione di callback (stessa, quindi ricorsiva, malvagia) che deve essere trasmessa tramite argomento. Quindi creo un altro anonimo che sostanzialmente riduce la funzione all'argomento stringa e corregge il secondo argomento di fas f(molto malvagio). Qualsiasi essere umano sano non lo farebbe mai, perché è quasi illeggibile come Perl o regex (o cjam / pyth / qualsiasi altro esolang).

Quindi, se la stringa non è "google", verrà chiamato il secondo argomento dell'array di celle che genera la lunghezza della stringa. Altrimenti verrà chiamata la prima funzione, che viene passata come callback (e si passa anche come callback a se stessa) che in seguito è la funzione stessa. L'errore è fondamentalmente un errore di profondità massima di ricorsione.

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

2
Quelle cose non sono malvagie nella maggior parte delle lingue. E questo è il golf del codice, qui esiste uno dei codici più illeggibili del pianeta :). Manico freddo tra.
BAR

9
Mi manca solo un po ' evalqui per renderlo davvero MALE :-)
Luis Mendo,

12

JavaScript, 25 byte

Esempio JavaScript semplice e piacevole:

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

Se viene inserito "google", passa a ReferenceError

Esempio

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


2
Wow, grazie per avermi detto che c'è una scorciatoia per le funzioni lamda in javascript!
Tomáš Zato,

3
@ TomášZato Caveat: sono nuovi di zecca in ES2015 , quindi il supporto varia ancora.
Anko,

11

APL, 19 17 byte

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

Questa è una funzione monadica senza nome che genererà un errore di sintassi se l'input è google. Ciò si ottiene tentando di prendere il logaritmo naturale del nulla.

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

Provalo online

Hai salvato due byte grazie a Dennis!


è noto in modo informale come "splat". Un nome molto appropriato per questo utilizzo.
Adám,

9

R, 46 byte

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

A meno che non stia leggendo male, il post originale non ha mai specificato che il codice doveva essere sintassi corretta.

Esempio:

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

Non ho mai aggiunto nulla per il parametro "no" dell'istruzione ifelse, quindi verrà restituito un errore se questo parametro viene evocato.


10
Eccone uno leggermente più corto:g=function(x)nchar(x)[[x!="google"]]
flodel

9

Perl, 31 29 byte

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

-2b grazie all'opera d'arte

Uso:

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

Se potessi cavarmela con un programma piuttosto che una funzione, quanto segue sarebbe valido con solo 20 byte (riga di comando +1 byte)

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

L'errore è la divisione per zero.

Spiegazione:

y///crestituisce la lunghezza, quindi !/^google$/restituirà 0 se l'input corrisponde a "google".

Uso:

perl -p entry.pl input.txt

2
Si potrebbe rendere una funzione anonima: sub{…}. (Quindi lo chiami come sub{…}->("google").)
Manatwork

Salvare 1 byte utilizzando $_!=googleinvece di!/^google$/
Gabriel Benamy,

@GabrielBenamy Temo !=che non funzionerà per confrontare la stringa ...
Dada,

7

Haskell - 30 caratteri

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

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

6
Perché il punto esclamativo per errore? Non farebbe anche una stringa vuota?
Kritzefitz,

1
Volevo suggerire di cambiarlo in x=x;g"google"=x;g s=length s, ma per qualche ragione, <<loop>> le eccezioni non vengono generate in ghci.
Kritzefitz,

17
g s|s/="google"=length sevita la necessità dierror
chs

7

Python 3, 35 byte

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

1
@FryAmTheEggman in realtà 16 bit più corto. XD
DiegoDD,

1
@FryAmTheEggman: buon trucco ma l'id non funziona con una stringa vuota:(lambda n:len(n)*(n!='google')or d)('')
pabouk,

@pabouk Esatto, grazie per averlo sottolineato.
FryAmTheEggman,

7

Java 7: 53 52 byte

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

Il codice sopra genererà ArithmeticExceptionper divisione per zero e per qualsiasi Stringaltro che google. Vale la pena notare che ==confronta i riferimenti e non funzionerà per gli Stringoggetti.

Java 8: 29 byte

(Basato sul suggerimento fornito nel commento seguente)

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

1
Puoi anche usare la dichiarazione lambda di Java 8:s->(s.equals("google")?null:s).length();
hjk

3
"Vale la pena notare che == confronta i riferimenti e non funzionerà per gli oggetti String." In realtà, tutte le stringhe sono oggetti, quindi il confronto delle stringhe con ==in Java generalmente non funzionerà (a meno che non si faccia affidamento sull'internamento delle stringhe, il che è, beh, male). Forse ti sei confuso con JavaScript?
Gengkev,

1
@gengkev Se sono entrambi letterali, funzionerà poiché è lo stesso oggetto a cui si fa riferimento nel pool di stringhe. Le specifiche danno una lettera e qui è una lettera quindi funzionerà.
Yassin Hajaj,

2
@YassinHajaj Sono d'accordo sul fatto che le specifiche lo diano letteralmente, ma questo è solo un esempio. La funzione dovrebbe probabilmente eseguire lo stesso se viene fornito anche input da stdin o se la funzione viene chiamata da un'altra classe compilata separatamente. In ogni caso, fare affidamento sulle ottimizzazioni del compilatore (intern stringing) è una cattiva idea, come ho detto in origine.
gengkev,

7

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

Bene, la divisione per zero è solo un comportamento indefinito, che non definirei un errore. Quindi il mio approccio.

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

uso

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

1
È possibile chiamare size()per salvare 2 byte. In C ++ 14, puoi anche usare lambda generici e sostituirli std::stringcon auto. Avresti bisogno di passarci un effettivo std::stringinvece di un const char*.
isanae,

@isanae non sapevo che std::stringavesse un size()metodo, grazie per quello. Sono a conoscenza di lambda generici in C ++ 14, ma non so come mi aiuterebbe, dato che lo "string"è const char*e non lo è std::string.
Zereges,

1
@Zereges std::stringha size()e length()perché è sia un contenitore che una stringa . Per quanto riguarda auto, chiameresti il ​​lambda con (std::string("google"))invece di ("google"). La domanda dice solo "accetta 1 stringa" senza specificare cosa sia una "stringa".
Isanae,

Anche @isanae C ++ 14 deve "google"scostruire un std::string:)
Quentin

@Zereges puoi semplicemente throw;attivare std::terminate()(perché qui non c'è un'eccezione corrente).
Quentin,

6

MUMPS, 28 byte

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

Uso:

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

<SELECT>g^MYROUTINE

Perché? Bene, $S[ELECT]fondamentalmente è un'affermazione if-else compatta multi-clausola - quasi come un pattern-match in un linguaggio come Haskell o Rust. Tranne ... a differenza di Haskell o Rust, i pattern non sono controllati per completezza, perché il concetto di "sicurezza in fase di compilazione" è completamente estraneo a MUMPS. Quindi, se il tuo input è un modello di cui non hai tenuto conto, ricevi un delizioso errore di runtime chiamato <SELECT>.


6

Ruby, 34 30 27 26

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

Sconosciuto tgenera un'eccezione.

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

Modifica: versione totalmente leggibile ed evidente che è più corta ...

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

Vecchio: sembra abbastanza simile ad altre idee. Aumenterà ArgumentErrorse x è "google".


2
Perché quelle parentesi? x=='google'?t: x.size
arte

6

JavaScript, 47 byte

Bello e semplice.

Modifica: ora è conforme alle regole

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

analisi

Errore generato

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

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

Nessun errore generato

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

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


Tecnicamente, questo non soddisfa le specifiche del PO. Questa funzione avvisa la lunghezza ma ritorna undefined.
Bungle,

@Bungle Com'è adesso?
Decadimento beta

1
@Bungle vedo. Ho dimenticato che era necessario un ritorno
Decadimento beta

1
Usando le funzioni freccia di ES6 e l'operatore ternario (invece di if), puoi comprimerlo un po 'di più :)
Carles Alcolea,

1
@BetaDecay Originalità prima; Rispetto quello.
Carles Alcolea,

6

C, 66 48

Originale:

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

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

Su altre piattaforme, potrebbe essere necessario regolare le costanti per l'endianness.

Più breve :

meno inganno, stessi risultati.

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

Wow, questa è una logica interessante lì. Se capisco bene la parte del golf, stai in qualche modo spostando i primi sei caratteri per adattarli a un singolo numero gigante (quasi come un hash), che, a causa del fatto che lo stack è little-endian, finisce per essere "google", ma indietro ( 0x656c676f6f67= elgoog). Penso che questa risposta abbia bisogno di una spiegazione per quelli di noi che apprezzano questo tipo di cose pazze di basso livello.
Braden Best

Fondamentalmente ce l'hai. Lancia semplicemente la memoria che memorizza la stringa in un numero a 64 bit. Endianness lo rende "arretrato" su architetture x86. Il testo occupa solo 7 byte, quindi la maschera nasconde tutto ciò che potrebbe essere il prossimo in memoria. È un trucco divertente, ma penso che '!! strcmp (s, "google")' sia in realtà più breve.
AShelly,

1
Comunque, +1. Decisamente. Inoltre, penso che puoi accorciarlo rimuovendo il int , cioè 4 caratteri.
Braden Best,

Dopo aver digitato , l'ho capito! Se char *, con le unità di 8-bits, viene eseguito il cast su long *, con le unità di 64-bits, senza essere correttamente riallocati, i dati in quegli 8 byte di spazio heap vengono danneggiati e trattati come un singolo numero ( 8*8 = 64). Ecco perché ottieni i primi 6 caratteri, + NUL + immondizia. È molto intelligente. Anche pericoloso. Mi chiedo perché non segfault. Quell'ottavo byte di immondizia è fuori limite, no?
Braden Best

Ho esaminato la tua analisi. Hai ragione, il turno avrebbe dovuto essere 56, non 54. Inoltre, non userei la parola corrotta. La memoria è la stessa, i bit vengono interpretati in modo diverso. Tecnicamente, l'accesso al garbage byte è un comportamento indefinito e potrebbe effettivamente essere segfault. In pratica, quel byte risiede quasi certamente nello stesso blocco di memoria legale del resto della stringa e generalmente questi blocchi (heap, stack, costanti) sono allocati in unità di dimensioni di parole come minimo. Quindi la memoria appartiene al programma, contiene solo qualcosa di diverso dalla stringa.
AShelly,

6

Rubino, 29 byte

All'inizio ho trovato qualcosa di molto simile al primo tentativo di @Borsunho, ma il mio era leggermente più lungo e ha pubblicato il suo prima che avessi finito. Venne con questo prima che i suoi 30 byte modificassero :)

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

Esempi di utilizzo:

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

modifica: due anni e alcune versioni successive di Ruby

Rubino , 25 byte

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

Sostituito String#sizecon il nuovo plus unario. Provalo online!


Bene, non sono riuscito a farlo funzionare (non mi è venuto in mente di ^andarmene fuori dal matchgroup).
Borsunho,

@Borsunho Devo ammettere che ho solo "forzato" il regex fino a quando non ho ottenuto il risultato che volevo :) Penso che .*alla fine sia ciò che lo fa funzionare.
daniero,

Si interrompe se la stringa di input ha più righe e contiene google sulla propria riga. Penso che lo /\A(?!google\Z).*/mrisolva (al costo di tre byte, però). ^e $abbina l'inizio e la fine delle linee, mentre \Ae \Zabbina l'inizio e la fine della stringa nel suo insieme.
istocrato,

@histocrat ma non credo che tu possa stringere google con più righe;)
daniero,

4

> <>, 55 byte

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

Ho pensato di provare, non il mio miglior tentativo di golf o algoritmo, comunque. Non è una funzione in sé, ma penso che questo dovrebbe comunque essere qualificato. Vedrò se posso modificarlo in una versione migliore.

Se ti è permesso stampare la lunghezza e quindi l'errore, ecco una soluzione a 46 byte:

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

49 byte soluzione precedente di questa natura:

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

Sono felice di mettere una spiegazione se c'è qualche interesse, e per favore fatemi sapere se c'è qualcosa di sbagliato nella mia risposta o se avete suggerimenti sul golf.


4

Javascript ES6, 51 27 25 byte

Ciao, sono nuovo a programmare il golf, quindi probabilmente questo può essere giocato a golf molto di più, ma ecco qui:

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

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

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

e alcuni 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

Modifica: aggiunto? per sostituire if e sostituire Error con un oggetto non definito.

Modifica 2: mi sono reso conto che il mio conteggio dei byte era errato e ho rimosso g =


4

GolfScript, 14 16 caratteri

{.,\'google'=!/}

Come molti altri, confronta semplicemente l'input 'google'e divide la lunghezza per l'inverso del risultato.

Programmi di esempio:


@Dennis, vedo il tuo punto. Nella sua forma originale non era esattamente riutilizzabile (non si potrebbe dire, ad esempio, applicare il codice su un elenco). Inoltre non mi ero reso conto che avevi scritto una risposta praticamente identica in CJam ben prima di pubblicarla (in realtà ero solo vagamente consapevole di CJam come lingua fino ad ora). +1 anche per la tua soluzione.
pswg,

4

Bloccato , 16 byte

s_l1u"google"=-/

Seguendo un metodo simile alla maggior parte delle persone, verrà generato un errore di divisione per 0 sull'input di "google".


4

Lotto di Windows, 118 caratteri

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

L'output è% stringlength%.

Codice 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

Modificato dalla risposta di Joshua Honig, qui .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.