Не google "google"


158

Всі ми знаємо, що якщо ви перейдете на слово "google", це порушить Інтернет.

Ваше завдання - створити функцію, яка приймає один рядок і повертає його довжину, з найменших символів Unicode.

Однак, якщо даний рядок google(малий), це призведе до помилки.

Наприклад, g('bing')повернеться, 4але g('google')призведе до помилки.

Надайте приклад використання та, якщо можливо, помилка.


122
Я в Google google , і Google знайшов Google в Google. Міф розбитий.
Геобіт

86
@Geobits Це просто тест, щоб зрозуміти, чи буду я гугл Google, чого не буду. : D
rybo111

7
Чи потрібна функція залежно від регістру? Чи повинен він кидати даний "gOOgle"?
AXMIM

2
Коли я набираю google в google (рядок пошуку на хромі), з'явилося повідомлення із запитом, чи хочу я перейти до google . (Тепер, коли це tld, це має сенс, тобто com.google працює). Я натиснув його і отримав помилку пошуку dns. Інтернет: зламаний!
Крейг

4
Я голосую за повторне відкриття цього питання. Я не бачив жодних запитань щодо того, що є помилкою для цього виклику, і на нього вже є 154 відповіді, тому я не думаю, що міняти специфікацію справедливо. Це не може бути прикладом гарного питання, але це досить зрозуміло. Якщо відповідь дійсно зводиться до того, чи є певний вихід помилкою, він, швидше за все, просто не отримає стільки оновлень.
Пукайте

Відповіді:


228

Пітон 2, 29

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

Дає ZeroDivisionErrorна "google", а довжину в іншому випадку. Це використовує переваги буленів Python, що дорівнює 0і 1.


2
+1. Потрібно встановити gсвій lambdaабо назвати його анонімно за допомогою вводу.
Zach Gates

4
Просто заради задоволення, я спробував цю техніку з JavaScript ES6. Він закінчився о 25, але повертається Infinityдля "google" замість того, щоб викидати помилку ...
ETHproductions

18
@ZachGates Консенсус щодо мета полягає в тому, що анонімні функції дозволені, якщо спеціально не дозволено. Оскільки питання, мабуть, означає щось подібне (але явно це не забороняє), вам слід попросити ОП про це.
FryAmTheEggman

3
@Kevin вам знадобиться, returnякщо ви використовувалиdef
FryAmTheEggman

3
Це смішно, це перекладене на Pyth краще, ніж моє попереднє найкраще рішення Pyth. Це L/lbnb"google, 13 байт.
isaacg

107

Excel, 23 символи

Вставте це в іншу клітинку, ніж A1, і введіть пошуковий запит в A1.

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

Наприклад:

GoogleGoogle


9
Який загальний консенсус щодо використання Excel?
Бета-розпад

52
@BetaDecay Творчі, нечасті, здається, працюють. Не застосовується до всіх головоломок CG, але воно є тут!
kdbanman

119
Менеджери люблять це!
lkraider

18
Настільки ефективні, користувачі CG будуть ненавидіти вас за це. Але зачекай. B3 змінить ваше життя назавжди!
Sumurai8

8
Який конкретний консенсус щодо використання Excel?
GreenAsJade

81

C #, 43 байти

Поліпшення щодо відповіді Салама Аламі. Повторне викидання виключення переповнення стека при наданні "google"

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

2
Так, я думав, що це досить розумний спосіб врятувати деяких персонажів, щоб кинути виняток. Для 4 символів це може бути найменший спосіб кинути виняток у C #, не впевнений.
DLeh

6
Це розумно! Однак останні версії C # підтримують рекурсію хвоста, тому ця функція ніколи не кинеться StackOverflowException. Насправді він ніколи не повернеться (поводиться як while(true){}).
NightElfik

2
@DLeh Хвостовий рекурсійний дзвінок трохи складний. Вам потрібно запустити на x64 JIT і без налагодження (доданий налагоджувач призведе до того, що рекурсія хвоста з явних причин не працює). Ось моя програма як доказ: imgur.com/ErNl8LJ та трохи більше читання про хвостові рекурсії: blogs.msdn.com/b/davbr/archive/2007/06/20/… ;)
NightElfik

12
Ха-ха: г (рядок) ... Я побачу себе
позаду

1
@DLeh о, зачекайте ні, я можу відповідати вашим 43 байтам, але не перемогти його. :) int g (string s) => s! = "google"? s.Length: s [9];
lee

57

Піта, 14 13 символів

L/lbnb"google

Визначає названу функцію y.

Це ділить довжину на 1, якщо рядок не є google, а на 0 в іншому випадку. Ідея не новела, але я придумав її самостійно.

Спробуйте в Інтернеті.

Як це працює

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

Так, я насправді не впевнений у цьому, я не думаю, що раніше це було зі струною. Зазвичай ви можете закрити це, ;але, очевидно, ви не можете тут ...
FryAmTheEggman

Вам не потрібна кінцева цитата.
Мальтісен

48
" Визначає названу функцію y. " Але yу вашому коді немає !?
AL

46
@AL Це правильно. Вбудований Lпереробляє функцію y.
Денніс

90
Я не впевнений, але я думаю, що ненавиджу Піта.
Містер Лістер

40

MATLAB, 63 41 40 38 36 байт

Дякую Тому Карпентеру за гоління 1 байта!

Дякуємо Стіві Гріффін за бриття 2-х байт!

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

На відміну від інших більш елегантних рішень, виконання ділення на нульову операцію в MATLAB не призведе до помилок, а навпаки Inf. Це рішення знаходить довжину рядка по nnz. Рядок, що виробляється, виконується таким чином, що ви індексуєте від початку рядка до кінця, що по суті є копією рядка. Однак, що важливо, це те, що початок доступу до рядка виробляється, перевіряючи, чи вхід дорівнює чи ні 'google'. Якщо це не так, це створює початковий індекс 1 і ми індексуємо в рядок нормально ... як MATLAB починає індексувати з 1. Якщо він дорівнює, індекс, що виробляється, дорівнює 0, і MATLAB видасть помилку індексації, вказавши, що індекс повинен бути натуральним числом. Додатковий+полягає в тому, щоб результат перевірки рівності був числовим, а не булевим / logical. Якщо вимкнути +заповіт, ви отримаєте попередження, але оскільки технічні характеристики цього виклику не дозволяють отримувати попередження, то +необхідне ... таким чином завершуючи код.

Приклад використання

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

Більш весела версія, 83 77 76 74 72 байт

Дякую Тому Карпентеру за гоління 1 байта!

Дякуємо Стіві Гріффін за бриття 2-х байт!

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

Сказане не є офіційним поданням, але бігти трохи веселіше. Зловживаючи evalв рамках анонімних функцій, код робить те, що він перевіряє, чи вводиться рядок введення 'google'... та якщо він є, це відкриє вбудований веб-браузер MATLAB і показує сторінку помилки 404 Google, що намагається отримати доступ до підсторінка, розташована тоді, iколи її не існує. Якщо ні, ми зазвичай відображаємо довжину рядка.

Приклад використання

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

ans =

     4

>> f('google')
>> 

Останній дзвінок, що використовується, 'google'дає нам цей екран:

введіть тут опис зображення


3
Ви можете зберегти байт, використовуючи strcmpзамість isequal.
Том Карпентер

@TomCarpenter - смішно. Я фактично сказав собі використовувати, strcmpале в кінцевому підсумку користувався isequalчомусь .... дякую!
rayryeng

1
nnzна два байти коротше, ніж numel. Ви провели моє голосування кілька років тому :-)
Стюі Гріффін

31

JavaScript ES6, 34 27 25 символів

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

Увімкнено ReferenceError Δдля Google.


10
Ви можете використовувати потрійний оператор, щоб зберегти два байти.
Конрад Боровський

2
Так, саме це я і отримав. Якщо ви хочете бути фантазійними, використовуйте символ, який люди ніколи не використовують замість g, щоб бути впевненим, що він не існуватиме як глобальна змінна. Δ означає гарне ім'я змінної :)
Domino

1
Ви можете використовувати #, це помилки в JS afaik
хлопайте

7
Δ Google Illuminati підтверджено
DynamiteReed

2
Я просто збираюся залишити це тут github.com/Rabrennie/anything.js
sagiksp

26

TI-BASIC, 15 байт

Хек, поки ми в цьому , можемо також отримати TI-BASIC відповідь.

Формат вводу є "string":prgmNAME. Кредит Томас Ква для знаходження його першим!

length(Ans)+log(Ans≠"GOOGLE

(Посібник: додайте 1 байт для кожної малої літери, замінюючи великі регістри. Отже s/GOOGLE/google/g => +6 bytes.)

ааааа, тестові випадки!

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

20 байт: length(Ans)/(Ans≠"google. Ви також маєте справу неправильно; якщо великі регістри дозволені, це 14 байт. До речі, аргументи передаються через Ans.
lirtosiast

AGOOGLEмає дати 7, правильно? І ви не повинні рахувати заголовок програми за розміром коду, тому відніміть 10 байт.
lirtosiast

ПОМИЛКА: Я думав про підрядки. Ласкаво пробачте мене.
Conor O'Brien

1
@ThomasKwa Я не побачив ваш коментар із кодом. Так буває, що ми обидва натрапили на одне і те ж рішення. Однак, якщо ви вважаєте, що ви заслуговуєте на кредит, кредит повинен бути вашим. ^ _ ^ ( EDIT Якщо ви читали код, це не зовсім те саме.)
Conor O'Brien

@lirtosiast length(- це два байти, які зробить ваші числа 21 і 15 байтами.
Timtech

23

APL (14)

(⍴÷'google'∘≢)

Пояснення:

  • : довжина
  • ÷: ділиться на
  • 'google∘≢: аргумент не дорівнює 'google'.

дає довжину рядка, яка розділена на 1 , якщо рядок не дорівнює google(що дає довжину назад без змін), або 0 , якщо рядок має рівну google(даючи помилку).


11
Я думаю, вам не потрібно рахувати паролів, оскільки без них можна присвоїти змінну.
jimmy23013

Види невдач для однозначних аргументів. Виправити, замінивши на . Крім того, ви можете зробити його більш крутим, замінивши операнди . О, не забудьте видалити паролі. Все-у-всьому:≢÷≢∘'google'
Адам

21

Python 3, 30 байт

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

Індексує 1-елементний список функцій, піднімаючи, IndexErrorякщо u=='google'предикат дорівнює True(= 1). Такі функціональні.

Багато варіантів. Ого:

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

Якщо виклик було перевернуто (помилка на всьому, що не "google"), можна зберегти знак:

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

Але ви вже знаєте довжину, тому просто жорстко вставте її.


працює і для python 2.7
Noodle9,

Чомусь я люблю це рішення.
foslock

19

Haskell, 24 байти

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

Вихід:

Main> g "google"

Program error: pattern match failure: g "google"

Main> g "bing"
4

15

CJam, 16 символів

{_,\"google"=!/}

Це ділить довжину на 1, якщо рядок не є google, а на 0 в іншому випадку. Ідея не новела, але я придумав її самостійно.

Спробуйте в Інтернеті.

Як це працює

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

Цікаво, що повна програма коротше (15 байт): q_,\"google"=!/. Розробив його перед переглядом цієї публікації. Зауважте, що це займає весь вхід (який ви, здавалося б, сприймаєте як аргумент функції). На жаль, ви не можете його використовувати, оскільки тут потрібна функція :(
Erik the Outgolfer

15

Октава, 63 байти

Я знаю, що він довший за рішення Матлаба (яке також працювало б в Октаві), але це особливо зле. Я створюю анонімну функцію (злий), використовуючи масив комірок (злий) літерал (злий), що містить ручки функції, залежні від функції зворотного виклику (сама, таким чином, рекурсивна, зла), яка повинна передаватися через аргумент. Потім я створюю ще один анонім, який в основному зводить функцію до аргументу рядка і фіксує другий аргумент fяк f(дуже злий). Будь-яка розумна людина ніколи цього не зробить, тому що це майже так само нечитабельно, як Perl або регулярний вираз (або cjam / pyth / будь-який інший езоланг).

Отже, якщо рядок не є "google", буде викликаний другий аргумент масиву комірок, який виводить довжину рядка. В іншому випадку буде викликана перша функція, яка передається як зворотний виклик (і передається як зворотний виклик самому собі), що пізніше є самою функцією. Помилка - це в основному деяка помилка максимальної глибини рекурсії.

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

2
Ці речі не є злом у більшості мов. І це є код для гольфу, деякі з найбільш нечитабельною коду на планеті існує тут :). Класна ручка btw.
БАР

9
Мені evalтут бракує лише деяких, щоб зробити це справді ЗЛИЧОМ :-)
Луїс Мендо

12

JavaScript, 25 байт

Приємний і простий приклад JavaScript:

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

Якщо введено "google", то він проходить a ReferenceError

Приклад

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


2
Нічого, дякую, що сказали мені, що у JavaScripte є скорочення для функцій lamda!
Томаш Зато

3
@ TomášZato Caveat: вони зовсім нові в ES2015 , тому підтримка все ще відрізняється.
Анко

11

APL, 19 17 байт

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

Це неназвана монадійна функція, яка видасть синтаксичну помилку, якщо вхід є google. Це досягається спробою прийняти природний логарифм нічого.

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

Спробуйте в Інтернеті

Збережено два байти завдяки Деннісу!


неофіційно відомий як "бризок". Дуже відповідна назва цього використання.
Адам

9

R, 46 байт

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

Якщо я неправильно читаю, в оригінальній публікації ніколи не було вказано, що код повинен бути правильним синтаксисом.

Приклад:

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

Я ніколи нічого не додавав до параметра "ні" у операторі ifelse, тому він поверне помилку, якщо цей параметр викликається.


10
Ось трохи коротший:g=function(x)nchar(x)[[x!="google"]]
флодел

9

Perl, 31 29 байт

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

-2b завдяки маневреності

Використання:

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

Якщо я міг би відійти від програми, а не функції, наступне було б справедливим лише з 20 байтами (командний рядок +1 байт)

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

Помилка ділиться на нуль.

Пояснення:

y///cповертає довжину, потім !/^google$/поверне 0 iff вхід відповідає "google".

Використання:

perl -p entry.pl input.txt

2
Ви можете зробити це анонімну функцію: sub{…}. (Тоді ви називаєте це так sub{…}->("google").)
маніпулювання

Збережіть 1 байт, використовуючи $_!=googleзамість!/^google$/
Габріель Бенамі

@GabrielBenamy Боюсь !=, не вдасться порівняти рядок ...
Дада

7

Haskell - 30 символів

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

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

6
Чому знак оклику за помилку? Чи не зробила б і порожня рядок?
Kritzefitz

1
Я хотів запропонувати змінити його x=x;g"google"=x;g s=length s, але чомусь <<loop>> винятки не кидаються в ghci.
Kritzefitz

17
g s|s/="google"=length sуникає потребиerror
ч.

7

Python 3, 35 байт

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

1
@FryAmTheEggman насправді на 16 біт коротше. XD
DiegoDD

1
@FryAmTheEggman: Хороший трюк, але ідентифікатор не працює з порожнім рядком:(lambda n:len(n)*(n!='google')or d)('')
pabouk

@pabouk Цілком правильно, дякую, що вказав на це.
FryAmTheEggman

7

Java 7: 53 52 байти

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

Наведений вище код буде кинутий ArithmeticExceptionдля ділення на нуль і для будь-якого Stringіншого, ніж google. Варто зазначити, що ==порівнювати посилання і не працюватиме для StringОб'єктів.

Ява 8: 29 байт

(На основі пропозиції, наведеної в коментарі нижче)

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

1
Ви також можете використовувати лямбда-декларацію Java 8:s->(s.equals("google")?null:s).length();
hjk

3
"Варто зазначити, що == порівнює посилання та не працює для рядкових об'єктів." Насправді всі рядки є об'єктами, тому порівняння рядків з ==Java зазвичай не спрацює (якщо ви не покладаєтесь на строкове інтернування, що, ну, погано). Можливо, ви заплуталися в JavaScript?
gengkev

1
@gengkev Якщо вони обидва litterals, вони працюватимуть, оскільки це той самий об'єкт, на який посилається в пулі String. Спеціалізація дає літерал, і ось це літтерал, тому він буде працювати.
Яссін Хаджай

2
@YassinHajaj Я погоджуюся, що специфікація дає це як буквальне, але це лише приклад. Функція, ймовірно, повинна виконувати те саме, якщо вводиться також вхід від stdin, або якщо функція викликається з іншого класу, який складається окремо. У будь-якому випадку, покладатися на оптимізацію компілятора (строкове інтернування) - це погана ідея, про що я говорив спочатку.
gengkev

7

C ++ 11, 54 (код) + 14 (#include) = 68

Ну, поділ на нуль - це просто невизначена поведінка, яку я б не назвав помилкою. Тож мій підхід.

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

використання

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

1
Ви можете зателефонувати, size()щоб зберегти 2 байти. У C ++ 14 ви також можете використовувати загальні лямбда і замінити std::stringна auto. Вам потрібно буде передати фактичне std::stringйому замість const char*.
isanae

@isanae Я не знав, що std::stringє size()метод, дякую за це. Мені відомо про загальні лямбдаси в C ++ 14, але я не знаю, як це могло б мені допомогти, оскільки "string"є const char*і ні std::string.
Зереги

1
@Zereges std::stringмає size()і length()тому, що це і контейнер, і рядок . Що стосується auto, ви б назвали лямбда (std::string("google"))замість, а не ("google"). Питання говорить лише "приймає 1 рядок", не вказуючи, що таке "рядок".
isanae

@isanae C ++ 14 також має "google"sпобудувати std::string:)
Квентін

@Zereges ви можете просто throw;запустити std::terminate()(адже тут немає нинішнього винятку).
Квентін

6

МУМПА, 28 байт

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

Використання:

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

<SELECT>g^MYROUTINE

Чому? Ну, $S[ELECT]це в основному компактний багатозакласний висловлювання if-else - майже як збіг шаблонів на такій мові, як Haskell або Rust. За винятком ... на відміну від Haskell або Rust, шаблони не перевіряються на вичерпність, оскільки поняття "безпека часу компіляції" абсолютно чуже MUMPS. Отже, якщо ваш вхід - це шаблон, який ви не брали до уваги, ви отримуєте чудову помилку виконання <SELECT>.


6

Рубі, 34 30 27 26

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

Невідоме tпідвищує виняток.

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

Редагувати: повністю читаема і очевидна версія, яка коротша ...

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

Старий: Дуже схожий на інші ідеї, здається. Підніметься, ArgumentErrorякщо x - "google".


2
Чому ці дужки? x=='google'?t: x.size
манатура

6

JavaScript, 47 байт

Приємно і просто.

Редагувати: тепер відповідає правилам

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

Тестування

Помилка закинута

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

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

Жодна помилка не викинута

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

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


Технічно це не відповідає специфікаціям ОП. Ця функція попереджає про довжину, але повертається undefined.
Бангле

@Bungle Як це зараз?
Бета-розпад

1
@ Bungle Я бачу. Я забув, що повернення потрібне
бета-розпад

1
Використовуючи стрілочні функції ES6 та потрійний оператор (замість, якщо), ви можете стиснути це трохи більше :)
Carles Alcolea

1
@BetaDecay Спочатку оригінальність; Я поважаю це.
Карлес Алколія

6

C, 66 48

Оригінал:

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

Використання OSX gcc,
l("duck");повернення 4,
l("google");причини Floating point exception: 8.

На інших платформах константи, можливо, потребуватимуть коригування на витривалість.

Коротше :

менша хитрість, ті ж результати.

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

Нічого собі, це якась цікава логіка. Якщо я правильно розумію частину гофри, ви якимось чином зміщуєте перші шість знаків, щоб вони вписалися в єдине, гігантське число (майже як хеш), яке через те, що стек є малопомітним, в кінцевому підсумку стає "google", але назад ( 0x656c676f6f67= elgoog). Я думаю, що ця відповідь потребує пояснення для тих із нас, хто цінує цей різновид шалених матеріалів низького рівня.
Бреден Кращий

Ви в основному це маєте. Він просто закидає пам'ять, що зберігає рядок, у 64-бітове число. Endianness робить це "назад" для x86 архітектур. Текст займає лише 7 байт, тому маска просто приховує все, що може бути наступним у пам'яті. Це прикольний трюк, але я думаю, що "!! strcmp (s," google ")" насправді коротше.
AShelly

1
У будь-якому разі, +1. Безумовно. Крім того, я думаю, ви можете скоротити його, видаливши int , це 4 символи.
Бреден Кращий

Після деякого набору тексту я зрозумів це! Якщо char *, з одиницями 8-bits, перекидається на long *одиниці 64-bits, не будучи належним чином перерозподіленими, дані в цих 8 байтах купи простору пошкоджуються і трактуються як єдине число ( 8*8 = 64). Ось чому ви отримуєте перші 6 символів, + NUL + сміття. Це дуже розумно. Небезпечні теж. Цікаво, чому це не segfault. Той байт 8-го сміття поза межами, ні?
Бреден Кращий

Я переглянув ваш аналіз. Ви маєте рацію, зміна повинна була бути 56, а не 54. Крім того, я б не вживав слова зіпсований. Пам'ять однакова, біти просто інтерпретуються по-різному. Технічно доступ до байта сміття є невизначеною поведінкою і насправді може бути за замовчуванням. Практично цей байт майже напевно знаходиться в тому ж самому блоці правової пам'яті, що і решта рядка, і зазвичай ці блоки (купа, стек, константи) розподіляються як мінімум у розмірах одиниць слова. Тож пам'ять належить програмі, вона просто містить щось інше, ніж рядок.
AShelly

6

Рубін, 29 байт

Я спершу придумав щось дуже схоже на першу спробу @ Борсунго, але моя була трохи довшою, і він розмістив його ще до того, як я закінчив. Придумав це до редагування його 30 байт :)

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

Приклади використання:

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

редагувати: Через два роки та деякі версії Ruby пізніше

Рубін , 25 байт

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

Замінено String#sizeновим одинарним плюсом. Спробуйте в Інтернеті!


Акуратно, я не міг змусити це працювати (я не придумав виїжджати ^за межі матчу).
Борсуньо

@Borsunho Я повинен визнати, що я просто "грубо змусив" регулярний вираз, поки я не отримав результат, який я хотів :) Я думаю, що .*в кінці - це те, що змушує його працювати.
daniero

Порушує, якщо вхідний рядок має кілька рядків і містить google у власному рядку. Я думаю, /\A(?!google\Z).*/mвиправляє це (хоча ціною в три байти). ^і $відповідати початок і кінець рядка, в той час як \Aі \Zвідповідати початок і кінець рядка в цілому.
гістократ

@histocrat, але я не думаю, що ви можете наводити рядки в Google за допомогою декількох рядків;)
daniero

4

> <>, 55 байт

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

Думав, я б хотів це піти, не моя найкраща спроба чи алгоритм з гольфу. Сама по собі не функція, але я думаю, що це все одно має бути кваліфікованим. Я побачу, чи зможу я редагувати в кращій версії.

Якщо вам дозволено друкувати довжину, а потім помилку, ось 46-байтне рішення:

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

49 байт попереднього рішення такого характеру:

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

Я радий викласти пояснення, якщо є якийсь інтерес, і, будь ласка, повідомте мене, чи є щось не так у моїй відповіді або якщо у вас є пропозиції щодо гольфу.


4

Javascript ES6, 51 27 25 байт

Привіт, я новачок в коді гольфу, щоб, можливо, це було набагато більше, але ось це:

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

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

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

і деякий тест:

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

Редагувати: Додано? замінити, якщо і замінити помилку на невизначений об'єкт.

Редагувати 2: Я зрозумів, що кількість байтів помиляється, і видалив g =


4

GolfScript, 14 16 символів

{.,\'google'=!/}

Як і багато інших, просто порівнюється вхід 'google'і ділить довжину на обернений результат.

Приклади програм:

  • З'bing' (вихід: 4)
  • З'google' (вихід: Помилка: Спроба розділити на нуль. )

@Dennis Я бачу вашу думку. У своєму первісному вигляді його не можна було використовувати повторно (ви не могли, скажімо, застосувати код до списку). Також я не усвідомлював, що ви написали практично однакову відповідь у CJam задовго до того, як я розмістив це (насправді я лише невиразно знав CJam як мову). +1 також для вашого рішення.
pswg

4

Застряг , 16 байт

s_l1u"google"=-/

Дотримуючись аналогічного методу для більшості людей, виклик помилки при поділі на 0 при введенні "google".


4

Пакет Windows, 118 символів

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

Вихід -% stringlength%.

Повний код:

@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

Змінено з відповіді Джошуа Хоніга тут .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.