Nie google „google”


158

Wszyscy wiemy, że jeśli użyjesz słowa „google”, spowoduje to uszkodzenie internetu.

Twoim zadaniem jest utworzenie funkcji, która akceptuje jeden ciąg znaków i zwraca jego długość, używając jak najmniejszej liczby znaków Unicode.

Jeśli jednak podany ciąg znaków google(małe litery) spowoduje błąd.

Na przykład g('bing')wróci, 4ale g('google')spowoduje błąd.

Podaj przykład użycia i błąd, jeśli to możliwe.


122
I google google , Google i Google znaleźć w Google. Mit obalony.
Geobits

86
@Geobits To po prostu test sprawdzający, czy przejdę do Google'a, czego nie zrobię. : D
rybo111

7
Czy funkcja wymaga rozróżniania wielkości liter? Czy powinien rzucić dany „GOOgle”?
AXMIM

2
Kiedy wpisuję google w google (pasek wyszukiwania w chrome), pojawiła się wiadomość z pytaniem, czy chcę przejść do google . (Teraz, gdy jest to tld, ma to sens, tzn. Com.google działa). Kliknąłem go i dostałem błąd wyszukiwania dns. Internet: zepsuty!
Craig

4
Głosuję za ponownym otwarciem tego. Nie widziałem żadnych pytań na temat tego, co stanowi błąd w tym wyzwaniu i ma już 154 odpowiedzi, więc nie sądzę, aby zmiana specyfikacji była sprawiedliwa. To może nie być przykład dobrego pytania, ale jest wystarczająco jasne. Jeśli odpowiedź naprawdę sprowadza się do tego, czy dane wyjście jest błędem, prawdopodobnie i tak nie otrzyma tylu głosów pozytywnych.
Poke

Odpowiedzi:


228

Python 2, 29

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

Daje to ZeroDivisionErrorON "google", a długość inaczej. Wykorzystuje to wartość logiczną Python równą 0i 1.


2
+1. Musisz jednak ustawić gswój lambdalub nazwać go anonimowo z wprowadzonymi danymi .
Zach Gates

4
Dla zabawy wypróbowałem tę technikę w JavaScript ES6. Skończyło się na 25, ale wraca Infinitydo „google” zamiast rzucać błąd ...
ETHproductions

18
@ZachGates Konsensus w sprawie meta jest taki, że anonimowe funkcje są dozwolone, chyba że zostaną wyraźnie zabronione. Ponieważ pytanie wydaje się sugerować coś takiego (ale jeszcze wyraźnie go nie zabrania), powinieneś zapytać o to OP.
FryAmTheEggman

3
@Kevin, którego byś potrzebował return, gdybyś użyłdef
FryAmTheEggman

3
Zabawnie, to przetłumaczone na Pyth radzi sobie lepiej niż moje najlepsze najlepsze rozwiązanie Pyth. To L/lbnb"google13 bajtów.
isaacg

107

Excel, 23 znaki

Wklej to do komórki innej niż A1 i wpisz wyszukiwane hasło w A1.

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

Na przykład:

GoogleGoogle


9
Jaki jest ogólny konsensus w korzystaniu z programu Excel?
Beta Decay

52
@BetaDecay. Kreatywny, niecodzienny, wydaje się działać. Nie będzie dotyczyć wszystkich zagadek CG, ale jest tutaj!
kdbanman

119
Menedżerowie to uwielbiają!
lkraider

18
Tak wydajni, użytkownicy CG będą cię za to nienawidzić. Ale poczekaj. B3 zmieni Twoje życie na zawsze!
Sumurai8

8
Jaki jest szczególny rodzaj używania Excela?
GreenAsJade

81

C #, 43 bajty

Poprawa w stosunku do odpowiedzi Salah Alami. Powraca, aby zgłosić wyjątek przepełnienia stosu po udostępnieniu „google”

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

2
Tak, pomyślałem, że to całkiem sprytny sposób na uratowanie niektórych postaci przed wyjątkiem. Przy 4 znakach może to być najmniejszy sposób zgłoszenia wyjątku w C #, nie jestem pewien.
DLeh

6
To jest sprytne! Jednak najnowsze wersje języka C # obsługują rekurencję ogona, więc ta funkcja nigdy nie zostanie uruchomiona StackOverflowException. W rzeczywistości nigdy nie powróci (zachowuje się jak while(true){}).
NightElfik,

2
@DLeh Wywołania rekurencyjne Tail są trochę trudne. Musisz działać na JIT x64 i bez debuggera (podłączony debugger spowoduje, że rekursja ogona nie będzie działać z oczywistych powodów). Oto mój program jako dowód: imgur.com/ErNl8LJ i trochę więcej informacji na temat rekurencji ogona: blogs.msdn.com/b/davbr/archive/2007/06/20/… ;)
NightElfik 10.10.15

12
Haha: g (string) ... zobaczę się ...
gregsdennis,

1
@DLeh oh czekaj nie, nie mogę dopasować twoich 43 bajtów, ale go nie pobiłem. :) int g (string s) => s! = "google"? s.Length: s [9];
Lee

57

Pyth, 14 13 znaków

L/lbnb"google

Definiuje nazwaną funkcję y.

To dzieli długość przez 1, jeśli ciąg nie jest google, i przez 0 w przeciwnym razie. Pomysł nie jest nowy, ale wpadłem na to niezależnie.

Wypróbuj online.

Jak to działa

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

Tak, właściwie nie jestem tego pewien, nie sądzę, żeby stało się to wcześniej z sznurkiem. Zwykle możesz to zamknąć, ;ale oczywiście nie możesz tutaj ...
FryAmTheEggman

Nie potrzebujesz cytatu końcowego.
Maltysen

48
Definiuje nazwaną funkcję y. ” Ale yw twoim kodzie nie ma !?
AL

46
@AL To prawda. Wbudowane na Lnowo definiuje funkcję y.
Dennis

90
Nie jestem pewien, ale myślę, że nienawidzę Pytha.
Pan Lister

40

MATLAB, 63 41 40 38 36 bajtów

Dzięki Tomowi Carpenterowi za zgolenie 1 bajta!

Dzięki Stewie Griffin za zgolenie 2 bajtów!

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

W przeciwieństwie do innych bardziej eleganckich rozwiązań, wykonanie operacji dzielenia przez zero w MATLAB-ie nie spowoduje błędu, a raczej Inf. To rozwiązanie znajduje długość ciągu według nnz. Wytworzony ciąg znaków umożliwia indeksowanie od początku ciągu do końca, który jest w zasadzie kopią ciągu. Ważne jest jednak to, że początek miejsca dostępu do ciągu jest tworzony przez sprawdzenie, czy dane wejściowe są równe 'google'. Jeśli tak nie jest, daje to początkowy indeks 1, a my indeksujemy do łańcucha normalnie ... ponieważ MATLAB rozpoczyna indeksowanie od 1. Jeśli jest równy, wygenerowany indeks wynosi 0, a MATLAB zgłosi błąd indeksowania stwierdzający, że indeks musi być dodatnią liczbą całkowitą. Statysta+ma zapewnić, że wynik kontroli równości jest liczbowy, a nie logiczny / logical. Pominięcie +spowoduje wygenerowanie ostrzeżenia, ale ponieważ specyfikacja tego wyzwania nie zezwala na ostrzeżenia, +jest wymagana ... w ten sposób uzupełniając kod.

Przykładowe zastosowania

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

Bardziej zabawna wersja, 83 77 76 74 72 bajtów

Dzięki Tomowi Carpenterowi za zgolenie 1 bajta!

Dzięki Stewie Griffin za zgolenie 2 bajtów!

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

Powyższe nie jest oficjalnym oświadczeniem, ale jest czymś, co sprawia nieco więcej radości. Nadużywanie evalfunkcji anonimowych polega na tym, że sprawdza, czy ciąg wejściowy jest równy 'google'... a jeśli tak, otworzy się wbudowana przeglądarka internetowa MATLAB i wyświetli stronę błędu 404 Google próbującą uzyskać dostęp do podstrona zlokalizowana, ikiedy to nie istnieje. Jeśli nie, wyświetlamy długość łańcucha normalnie.

Przykładowe zastosowania

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

ans =

     4

>> f('google')
>> 

Ostatnie użycie połączenia 'google'daje nam ten ekran:

wprowadź opis zdjęcia tutaj


3
Możesz zapisać bajt, używając strcmpzamiast isequal.
Tom Carpenter,

@TomCarpenter - Funny. Właściwie to powiedziałem sobie, aby użyć, strcmpale isequalz jakiegoś powodu skończyłem używać .... dzięki!
rayryeng

1
nnzjest dwa bajty krótszy niż numel. Miałeś mój głos kilka lat temu :-)
Stewie Griffin

31

JavaScript ES6, 34 27 25 znaków

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

Zgłasza błąd ReferenceError Δdla google.


10
Możesz użyć operatora trójskładnikowego, aby zapisać dwa bajty.
Konrad Borowski

2
Tak, właśnie to właśnie dostałem. Jeśli chcesz być fantazyjny, użyj symbolu, którego ludzie nigdy nie używają, zamiast g, aby mieć pewność, że nie będzie istniał jako zmienna globalna. Makes tworzy dobrą nazwę zmiennej :)
Domino

1
Możesz użyć #, to błędy w JS afaik
klaszcz

7
Confirmed Potwierdzono Google Illuminati
DynamiteReed


26

TI-BASIC, 15 bajtów

Heck, gdy już nad tym jesteśmy , równie dobrze może uzyskać odpowiedź TI-BASIC tutaj.

Format wejściowy to "string":prgmNAME. Kredyt dla Thomasa Kwa na znalezienie go pierwszy!

length(Ans)+log(Ans≠"GOOGLE

(Przewodnik: dodaj 1 bajt na każdą małą literę, zastępując wielką literę. Tak s/GOOGLE/google/g => +6 bytes.)

ahhhhh przypadki testowe!

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

20 bajtów: length(Ans)/(Ans≠"google. Sprawa również jest błędna; jeśli dozwolone są wielkie litery, to 14 bajtów. Nawiasem mówiąc, poprawne jest przekazywanie argumentów przez Ans.
lirtosiast

AGOOGLEpowinien dać 7, prawda? I nie powinieneś liczyć nagłówka programu w rozmiarze kodu, więc odejmij 10 bajtów.
lirtosiast

BŁĄD: Myślałem o podciągach. Uprzejmie wybacz mi
Conor O'Brien

1
@ThomasKwa Nie widziałem twojego komentarza z kodem. Tak się składa, że ​​oboje natknęliśmy się na to samo rozwiązanie. Jeśli jednak uważasz, że zasługujesz na kredyt, kredyt będzie twój. ^ _ ^ ( EDYCJA Jeśli chcesz przeczytać kod, to nie jest dokładnie to samo.)
Conor O'Brien

@lirtosiast length(to dwa bajty, dzięki którym Twoje liczby będą miały 21 i 15 bajtów.
Timtech

23

APL (14)

(⍴÷'google'∘≢)

Wyjaśnienie:

  • : długość
  • ÷: podzielony przez
  • 'google∘≢: argument nie jest równy 'google”.

podaje długość ciągu, która jest dzielona przez 1, jeśli ciąg nie jest równy google(co daje powrót niezmienionej), lub przez 0, jeśli ciąg jest równy google(dając błąd).


11
Myślę, że nie trzeba liczyć parenów, ponieważ można je przypisać do zmiennej bez nich.
jimmy23013

Raczej zawodzi przy argumentach jednoznakowych. Naprawić poprzez wymianę z . Możesz także sprawić, że będzie fajniejszy, zamieniając operandy . Och, nie zapomnij usunąć skórek. Podsumowując:≢÷≢∘'google'
Adám

21

Python 3, 30 bajtów

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

Indeksuje 1-elementową listę funkcji, podnosząc wartość predykatu IndexErrorif (= 1). Taki funkcjonalny.u=='google'True

Wiele wariantów. Łał:

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

Jeśli wyzwanie zostało odwrócone (błąd we wszystkim, nie „google”), można zapisać znak:

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

Ale znasz już długość, więc po prostu ją zakoduj.


działa również dla Pythona 2.7
Noodle9

Z jakiegoś powodu uwielbiam to rozwiązanie.
foslock

19

Haskell, 24 bajty

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

Wynik:

Main> g "google"

Program error: pattern match failure: g "google"

Main> g "bing"
4

15

CJam, 16 znaków

{_,\"google"=!/}

To dzieli długość przez 1, jeśli ciąg nie jest google, i przez 0 w przeciwnym razie. Pomysł nie jest nowy, ale wpadłem na to niezależnie.

Wypróbuj online.

Jak to działa

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

Co ciekawe, pełny program jest krótszy (15 bajtów) q_,\"google"=!/. Opracowałem go przed obejrzeniem tego postu. Zauważ, że bierze to całe dane wejściowe (które i tak wydajesz się brać za argument funkcji). Niestety nie możesz go użyć, ponieważ wymaga on funkcji :(
Erik the Outgolfer

15

Oktawa, 63 bajty

Wiem, że jest on dłuższy niż rozwiązanie Matlab (które również działałoby w Octave), ale jest szczególnie zły. Robię anonimową funkcję (zło) za pomocą literałów macierzy komórek (zło) (zło) zawierających uchwyty funkcji zależne od funkcji wywołania zwrotnego (sama, a więc rekurencyjna, zło), którą należy przekazać argumentem. Następnie tworzę kolejny anonimowy, który zasadniczo redukuje funkcję do argumentu łańcuchowego i naprawia drugi argument fas f(bardzo zły). Każdy rozsądny człowiek nigdy by tego nie zrobił, ponieważ jest prawie tak samo nieczytelny jak Perl lub regex (lub cjam / pyth / any esolang).

Więc jeśli ciąg nie jest „google”, wywoływany jest drugi argument tablicy komórek, który wyświetla długość łańcucha. W przeciwnym razie zostanie wywołana pierwsza funkcja, która jest przekazywana jako oddzwanianie (i również sama się odsyła), która później jest samą funkcją. Błąd jest w zasadzie pewnym błędem maksymalnej głębokości rekurencji.

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

2
Te rzeczy nie są złe w większości języków. A to jest kod golfowy, istnieje tutaj jeden z najbardziej nieczytelnych kodów na naszej planecie :). Fajny uchwyt btw.
BAR

9
Brakuje mi tylko niektórych eval, aby naprawdę ZŁO :-)
Luis Mendo

12

JavaScript, 25 bajtów

Ładny i prosty przykład JavaScript:

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

Jeśli wprowadzono „google”, to przechodzi ono przez ReferenceError

Przykład

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


2
Wow, dziękuję, że powiedziałeś mi, że w javascript jest skrót do funkcji lamda!
Tomáš Zato

3
@ TomášZato Caveat: są zupełnie nowe w ES2015 , więc wsparcie jest nadal różne.
Anko,

11

APL, 19 17 bajtów

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

Jest to nienazwana funkcja monadyczna, która zgłosi błąd składniowy, jeśli dane wejściowe to google. Dokonuje się tego poprzez próbę zabrania naturalnego logarytmu niczego.

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

Wypróbuj online

Zaoszczędzono dwa bajty dzięki Dennisowi!


jest nieformalnie znany jako „ikona”. Bardzo odpowiednia nazwa dla tego zastosowania.
Adám

9

R, 46 bajtów

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

O ile się nie mylę, oryginalny post nigdy nie określał, że kod musi mieć poprawną składnię.

Przykład:

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

Nigdy nie dodałem niczego do parametru „no” instrukcji ifelse, więc zwróci błąd, jeśli ten parametr zostanie wywołany.


10
Oto nieco krótszy:g=function(x)nchar(x)[[x!="google"]]
flodel

9

Perl, 31 29 bajtów

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

-2b dzięki manatwork

Stosowanie:

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

Gdybym mógł uniknąć programu, a nie funkcji, poniższe byłyby poprawne z jedynie 20 bajtami (wiersz poleceń +1 bajt)

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

Błąd to dzielenie przez zero.

Wyjaśnienie:

y///czwraca długość, a następnie !/^google$/zwraca 0 iff input pasuje do „google”.

Stosowanie:

perl -p entry.pl input.txt

2
Można zrobić to anonimową funkcję: sub{…}. (Następnie nazywacie to tak sub{…}->("google").)
manatwork

Zaoszczędź 1 bajt, używając $_!=googlezamiast!/^google$/
Gabriel Benamy

@GabrielBenamy Obawiam się, !=że nie będę mógł porównywać strun ...
Dada

7

Haskell - 30 znaków

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

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

6
Dlaczego wykrzyknik za błąd? Czy pusty łańcuch też nie zrobiłby tego?
Kritzefitz,

1
Chciałem zasugerować zmianę na x=x;g"google"=x;g s=length s, ale z jakiegoś powodu wyjątki <<loop>> nie są wrzucane do ghci.
Kritzefitz,

17
g s|s/="google"=length sEliminuje to potrzebęerror
CHS

7

Python 3, 35 bajtów

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

1
@FryAmTheEggman faktycznie o 16 bitów krótszy. XD
DiegoDD

1
@FryAmTheEggman: Dobra sztuczka, ale id nie działa z pustym ciągiem:(lambda n:len(n)*(n!='google')or d)('')
pabouk

@pabouk Całkiem słusznie, dziękuję za zwrócenie na to uwagi.
FryAmTheEggman

7

Java 7: 53 52 bajtów

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

Powyższy kod wyrzuci ArithmeticExceptiondo podziału przez zero i dla każdego Stringinnego niż google. Warto zauważyć, że ==porównuje odniesienia i nie będzie działać dla Stringobiektów.

Java 8: 29 bajtów

(Na podstawie sugestii podanej w komentarzu poniżej)

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

1
Możesz także użyć deklaracji lambda Java 8:s->(s.equals("google")?null:s).length();
hjk

3
„Warto zauważyć, że == porównuje referencje i nie będzie działać dla Obiektów Ciąg.” W rzeczywistości wszystkie łańcuchy są obiektami, więc porównywanie łańcuchów z ==Javą zazwyczaj nie działa (chyba że polegasz na internalizacji łańcuchów, co jest, no cóż, złe). Być może pomyliłeś się z JavaScriptem?
gengkev,

1
@gengkev Jeśli oba są litrami, zadziała, ponieważ jest to ten sam obiekt, do którego odwołuje się pula ciągów. Specyfikacja daje literał, a tutaj jest literał, więc będzie działać.
Yassin Hajaj

2
@YassinHajaj Zgadzam się, że specyfikacja podaje ją dosłownie, ale to tylko przykład. Funkcja powinna prawdopodobnie działać tak samo, jeśli otrzyma również dane wejściowe ze standardowego wejścia lub jeśli funkcja zostanie wywołana z innej klasy, która została skompilowana osobno. W każdym razie poleganie na optymalizacjach kompilatora (internowanie ciągów) jest złym pomysłem, co pierwotnie powiedziałem.
gengkev

7

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

Cóż, dzielenie przez zero jest po prostu niezdefiniowanym zachowaniem, którego nie nazwałbym błędem. Więc moje podejście.

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

stosowanie

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

1
Możesz zadzwonić, size()aby zapisać 2 bajty. W C ++ 14 można również użyć ogólnych lambd i zastąpić std::stringje auto. Trzeba by przekazać std::stringdo niego rzeczywisty zamiast const char*.
isanae

@isanae Nie wiedziałem std::stringma size()metodę, dzięki za to. Jestem świadomy ogólnych lambd w C ++ 14, ale nie wiem, jak to by mi pomogło, skoro "string"jest const char*i nie jest std::string.
Zereges

1
@Zereges std::stringma size()i length()ponieważ jest zarówno kontenerem, jak i łańcuchem . Jeśli chodzi o autoto, zadzwoniłbyś do lambda za pomocą (std::string("google"))zamiast ("google"). Pytanie tylko mówi „akceptuje 1 ciąg” bez określania, co to jest „ciąg”.
isanae

@isanae C ++ 14 również musi "google"szbudować std::string:)
Quentin

@Zereges, które możesz po prostu throw;uruchomić std::terminate()(ponieważ nie ma tutaj bieżącego wyjątku).
Quentin

6

MUMPS, 28 bajtów

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

Stosowanie:

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

<SELECT>g^MYROUTINE

Dlaczego? Cóż, $S[ELECT]jest w zasadzie zwartą , złożoną z wielu klauzul instrukcją if-else - prawie jak dopasowanie wzorca w języku takim jak Haskell lub Rust. Z wyjątkiem ... inaczej niż w przypadku Haskell czy Rust wzorce nie są sprawdzane pod kątem kompletności, ponieważ pojęcie „bezpieczeństwa podczas kompilacji” jest całkowicie obce MUMPS. Jeśli więc wprowadzono wzorzec, którego nie uwzględniono, wywoływany jest piękny błąd czasu wykonywania <SELECT>.


6

Ruby, 34 30 27 26

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

Nieznany tpodnosi wyjątek.

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

Edycja: całkowicie czytelna i oczywista wersja, która jest krótsza ...

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

Stare: Wydaje się dość podobne do innych pomysłów. Podniesie, ArgumentErrorjeśli x to „google”.


2
Skąd te nawiasy? x=='google'?t: x.size
manatwork

6

JavaScript, 47 bajtów

Ładne i proste.

Edycja: teraz jest zgodny z zasadami

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

Testowanie

Zgłoszony błąd

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

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

Błąd nie został zgłoszony

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

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


Technicznie nie jest to zgodne ze specyfikacjami PO. Ta funkcja ostrzega o długości, ale zwraca undefined.
Bungle

@Bungle Jak tam teraz?
Beta Decay

1
@Bungle Widzę. Zapomniałem, że potrzebny jest zwrot
Beta Decay

1
Korzystając z funkcji strzałek ES6 i operatora trójskładnikowego (zamiast if), możesz wycisnąć to trochę więcej :)
Carles Alcolea

1
@BetaDecay Oryginalność najpierw; Szanuję to.
Carles Alcolea

6

C, 66 48

Oryginał:

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

Za pomocą gcc OSX
l("duck");zwraca 4,
l("google");powoduje Floating point exception: 8.

Na innych platformach konieczne może być dostosowanie stałych pod kątem endianizmu.

Krótszy :

mniej podstępu, te same wyniki.

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

Wow, to trochę interesująca logika. Jeśli dobrze rozumiem część golfową, to w jakiś sposób przesuwasz pierwsze sześć znaków, aby zmieściły się w jedną, gigantyczną liczbę (prawie jak skrót), która z uwagi na to, że stos jest mały, kończy się na „google”, ale do tyłu ( 0x656c676f6f67= elgoog). Myślę, że ta odpowiedź wymaga wyjaśnienia dla tych z nas, którzy doceniają tego rodzaju szalone rzeczy niskiego poziomu.
Braden Best

Zasadniczo masz to. Po prostu rzutuje pamięć przechowującą ciąg znaków na liczbę 64-bitową. Endianness sprawia, że ​​jest „zacofany” w architekturach x86. Tekst zajmuje tylko 7 bajtów, więc maska ​​ukrywa tylko to, co może być następne w pamięci. To zabawna sztuczka, ale myślę, że „!! strcmp (s,„ google ”)” jest w rzeczywistości krótszy.
AShelly

1
W każdym razie +1. Zdecydowanie. Myślę też, że można go skrócić, usuwając int 4 znaki.
Braden Best

Po krótkim wpisaniu wymyśliłem to! Jeśli char *z jednostkami 8-bits, zostanie rzutowany na long *, z jednostkami 64-bits, bez odpowiedniego przeniesienia, dane w tych 8 bajtach przestrzeni sterty zostaną uszkodzone i potraktowane jako pojedyncza liczba ( 8*8 = 64). Dlatego dostajesz pierwsze 6 znaków, + NUL + śmieci. To bardzo sprytne. Niebezpieczne też. Zastanawiam się, dlaczego to nie działa. Ten ósmy bajt śmieci jest poza zakresem, nie?
Braden Best

Spojrzałem na twoją analizę. Masz rację, zmiana powinna wynosić 56, a nie 54. Poza tym nie użyłbym słowa zepsuty. Pamięć jest taka sama, bity są po prostu interpretowane inaczej. Technicznie dostęp do bajtu śmieciowego jest nieokreślonym zachowaniem i może faktycznie spowodować awarię. Praktycznie ten bajt prawie na pewno znajduje się w tym samym legalnym bloku pamięci, co reszta łańcucha, i generalnie te bloki (sterta, stos, stałe) są przydzielane co najmniej w jednostkach wielkości słów. Pamięć należy więc do programu, zawiera ona po prostu coś innego niż ciąg znaków.
AShelly

6

Rubinowy, 29 bajtów

Najpierw wymyśliłem coś bardzo podobnego do pierwszej próby @ Borsunho, ale moja była nieco dłuższa i opublikował ją, zanim skończyłem. Przyszło mi to do głowy przed jego edycją 30 bajtów :)

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

Przykłady użycia:

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

edycja: Dwa lata, a niektóre wersje Ruby później

Rubin , 25 bajtów

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

Zastąpiony String#sizenowym unary plus. Wypróbuj online!


Fajnie, nie mogłem tego uruchomić (nie wymyśliłem wychodzenia ^poza grupę meczową).
Borsunho,

@ Borunho Muszę przyznać, że po prostu „brutalnie wymusiłem” regex, dopóki nie uzyskałem pożądanego rezultatu :) Myślę, że .*na końcu jest to, co sprawia, że ​​działa.
daniero

Łamie się, jeśli ciąg wejściowy ma wiele wierszy i zawiera google we własnej linii. Myślę, że /\A(?!google\Z).*/mto naprawia (jednak kosztem trzech bajtów). ^i $dopasować początek i koniec linii, podczas gdy \Ai \Zdopasować początek i koniec łańcucha jako całości.
histocrat

@histocrat, ale nie sądzę, że możesz ciągi Google z wieloma wierszami;)
daniero

4

> <>, 55 bajtów

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

Pomyślałem, że spróbuję, a nie moja najlepsza próba golfa lub algorytm. Nie jest to funkcja sama w sobie, ale myślę, że nadal powinna się ona kwalifikować. Zobaczę, czy mogę edytować w lepszej wersji.

Jeśli możesz wydrukować długość, a następnie błąd, oto 46-bajtowe rozwiązanie:

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

49 bajtów poprzednie rozwiązanie tego rodzaju:

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

Z przyjemnością przedstawię wyjaśnienie, jeśli jest jakieś zainteresowanie, i daj mi znać, jeśli coś jest nie tak z moją odpowiedzią lub masz sugestie dotyczące gry w golfa.


4

JavaScript ES6, 51 27 25 bajtów

Cześć, jestem nowy w kodowaniu golfa, więc prawdopodobnie można grać w golfa o wiele więcej, ale oto:

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

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

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

i trochę testu:

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

Edycja: Dodano? zastąpić if i zastąpić błąd niezdefiniowanym obiektem.

Edycja 2: Zorientowałem się, że moja liczba bajtów jest nieprawidłowa i usunąłem g =


4

GolfScript, 14 16 znaków

{.,\'google'=!/}

Podobnie jak wiele innych, po prostu porównuje dane wejściowe 'google'i dzieli długość przez odwrotność wyniku.

Przykładowe programy:

  • Z'bing' (wyjście: 4)
  • Z'google' (wyjście: Błąd: Próbowano podzielić przez zero ).

@Dennis Widzę twój punkt widzenia. W oryginalnej formie nie można go było ponownie użyć (nie można, powiedzmy, zastosować kodu nad listą). Nie zdawałem sobie również sprawy z tego, że napisałeś praktycznie identyczną odpowiedź w CJam na długo przed opublikowaniem tego (właściwie do tej pory byłem tylko niejasno świadomy CJam jako języka). +1 za twoje rozwiązanie.
pswg

4

Utknął , 16 bajtów

s_l1u"google"=-/

Postępowanie podobne do większości osób spowoduje błąd dzielenia przez 0 przy wprowadzaniu „google”.


4

Pakiet Windows, 118 znaków

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

Dane wyjściowe to% stringlength%.

Pełny kod:

@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

Modyfikowany odpowiedź Joshua Honig, w tutaj .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.