Не гуглите «гугл»


158

Мы все знаем, что если вы Google Google слово «Google», это сломает Интернет.

Ваша задача - создать функцию, которая принимает одну строку и возвращает ее длину в наименьшем количестве символов Unicode.

Однако, если заданная строка google(строчная), это приведет к ошибке.

Например, g('bing')вернется, 4но g('google')вызовет ошибку.

Пожалуйста, предоставьте пример использования и ошибку, если это возможно.


122
Я погуглил Google , и Google нашел Google в Google. Миф разрушен.
Geobits

86
@Geobits Это просто тест, чтобы увидеть, буду ли я Google Google, что я не буду. : D
rybo111 28.09.15

7
Должна ли функция быть чувствительной к регистру? Должен ли он бросить данный «гугл»?
AXMIM

2
Когда я набираю Google в Google (панель поиска на Chrome), появляется сообщение с вопросом, хочу ли я перейти на Google . (Теперь, когда это tld, это имеет смысл, т.е. com.google работает). Я щелкнул по нему и получил ошибку поиска DNS. Интернет: сломана!
Крейг

4
Я голосую, чтобы открыть это. Я не видел вопросов о том, что является ошибкой для этого задания, и у него уже есть 154 ответа, поэтому я не думаю, что было бы справедливо менять спецификацию. Возможно, это не пример хорошего вопроса, но он достаточно ясен. Если ответ действительно сводится к тому, является ли определенный вывод ошибкой, то, скорее всего, он просто не получит столько голосов.
Ткните

Ответы:


228

Python 2, 29

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

Дает ZeroDivisionErrorна "google", а длина в противном случае. Это использует булево выравнивание Python 0и 1.


2
+1. Вы должны установить gсвой lambdaили анонимно позвонить с вводом, хотя.
Зак Гейтс

4
Просто для удовольствия, я попробовал эту технику с JavaScript ES6. Это закончилось в 25, но возвращается Infinityдля "google" вместо того, чтобы
выдать

18
@ZachGates Консенсус в отношении мета заключается в том, что анонимные функции разрешены, если они специально не запрещены. Поскольку вопрос, похоже, подразумевает что-то подобное (но пока явно не запрещает), вы должны спросить об этом ОП.
FryAmTheEggman

3
@Kevin тебе бы понадобился, returnесли бы ты использовалdef
FryAmTheEggman

3
Забавно, но это переведено на Pyth лучше, чем мое предыдущее лучшее решение Pyth. Это L/lbnb"google13 байтов.
Исаак

107

Excel, 23 символа

Вставьте это в ячейку, отличную от A1, и введите поисковый запрос в A1.

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

Например:

GoogleGoogle


9
Каково общее мнение об использовании Excel?
бета-распад

52
@BetaDecay. Творческий, необычный, кажется, работает. Не будет применимо ко всем головоломкам CG, но это здесь!
kdbanman

119
Менеджеры любят это!
Lkraider

18
Так эффективно, пользователи компьютерной графики будут ненавидеть вас за это. Но ждать. 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
Ха-ха: г (строка) ... Я посмотрю себя ...
gregsdennis

1
@DLeh ох, нет, я могу сопоставить ваши 43 байта, но не побить его. :) int g (string s) => s! = "google"? s.Length: s [9];
Ли

57

Pyth, 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

Вам не нужна заключительная цитата.
Maltysen

48
" Определяет именованную функцию y. " Но yв вашем коде нет !?
AL

46
@AL Это правильно. Встроенный Lпереопределяет функцию y.
Деннис

90
Я не уверен, но я думаю, что ненавижу Пита.
мистер Листер

40

MATLAB, 63 41 40 38 36 байт

Спасибо Тому Карпентеру за то, что он сбрил 1 байт!

Спасибо Stewie Griffin за то, что он сбрил 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 байт!

Спасибо Stewie Griffin за то, что он сбрил 2 байта!

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

Вышеуказанное не является официальным представлением, но в нем немного веселее. Злоупотребление evalвнутри анонимных функций, код выполняет то, что проверяет, равна ли входная строка'google' ... и если это так, то это открывает встроенный веб-браузер MATLAB и показывает страницу ошибки Google 404, пытающуюся получить доступ к подстраница, расположенная там, 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

Выдает ошибку ReferenceE Δдля Google.


10
Вы можете использовать троичный оператор для сохранения двух байтов.
Конрад Боровски,

2
Да, это именно то, что я только что получил. Если вы хотите проявить фантазию, используйте символ, который люди никогда не используют, вместо g, чтобы убедиться, что он не будет существовать как глобальная переменная. Δ делает хорошее имя переменной :)
Domino

1
Вы можете использовать #это ошибки в JS afaik
хлоп

7
Δ Google Иллюминаты подтвердили
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

ОШИБКА: я думал подстроки. Пожалуйста, прости меня.
Конор О'Брайен,

1
@ThomasKwa Я не видел твой комментарий с кодом. Так уж сложилось, что мы оба наткнулись на одно и то же решение. Однако, если вы считаете, что заслуживаете кредит, этот кредит будет вашим. ^ _ ^ ( РЕДАКТИРОВАТЬ Если вы читаете код, это не совсем то же самое.)
Конор О'Брайен

@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"=!/. Разрабатывал его до того, как увидел этот пост. Обратите внимание, что для этого требуется весь ввод (который вы в любом случае воспринимаете как аргумент функции). К сожалению, вы не можете использовать его, так как это требует функции :(
Эрик Outgolfer

15

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

Я знаю, что это дольше, чем решение Matlab (которое будет работать и в Octave), но это особенно плохо. Я делаю анонимную функцию (зло), используя литералы массива ячеек (зло), содержащие дескрипторы функций, зависящие от функции обратного вызова (сама по себе рекурсивная, зло), которая должна передаваться через аргумент. Затем я создаю еще один аноним, который в основном сводит функцию к строковому аргументу и фиксирует второй аргумент fкакf (очень злой). Любой здравомыслящий человек никогда бы этого не сделал, потому что он почти так же нечитаем, как Perl или regex (или cjam / pyth / любой другой esolang).

Поэтому, если строка не является «google», будет вызван второй аргумент массива ячеек, который выводит длину строки. В противном случае будет вызвана первая функция, которая передается в качестве обратного вызова (и сама передается в качестве обратного вызова для себя), которая позже является самой функцией. Ошибка в основном является некоторой максимальной ошибкой глубины рекурсии.

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

2
Эти вещи не являются злом в большинстве языков. И это есть код для гольфа, некоторые из наиболее нечитаемого кода на планете существует здесь :). Крутая ручка, кстати.
BAR

9
Я только скучаю по некоторым evalздесь, чтобы сделать это действительно ЗЛОЙ :-)
Луис Мендо

12

JavaScript, 25 байт

Хороший и простой пример JavaScript:

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

Если введен «Google», то он проходит ReferenceError

пример

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


2
Вау, спасибо за сообщение, что в javascript есть ламда-функции.
Томаш Зато

3
@ TomášZato Предостережение: они совершенно новые в 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

Я никогда ничего не добавлял к параметру «no» оператора ifelse, поэтому он вызовет ошибку, если этот параметр вызывается.


10
Вот немного короче:g=function(x)nchar(x)[[x!="google"]]
flodel

9

Perl, 31 29 байт

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

-2б благодаря манатворке

Использование:

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

Если бы я мог сойти с рук с помощью программы, а не функции, следующее было бы допустимо только с 20 байтами (+1 байт командной строки)

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

Ошибка деление на ноль.

Объяснение:

y///cвозвращает длину, а затем !/^google$/вернет 0, если входные совпадения "Google".

Использование:

perl -p entry.pl input.txt

2
Вы можете сделать это анонимную функцию: sub{…}. (Тогда вы называете это как sub{…}->("google").)
Манатворк

Сохраните 1 байт, используя $_!=googleвместо!/^google$/
Габриэль Бенами

@GabrielBenamy Боюсь !=, не сработает, чтобы сравнить строки ...
Dada

7

Хаскель - 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
CHS

7

Python 3, 35 байт

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

1
@FryAmTheEggman на самом деле на 16 бит короче. XD
DiegoDD

1
@FryAmTheEggman: хороший трюк, но id не работает с пустой строкой:(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объектов.

Java 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 Если они оба являются литералами, это будет работать, поскольку это один и тот же объект, на который ссылаются в пуле строк. Спецификация дает буквальный, а вот буквальный, так что он будет работать.
Яссин Хаджай

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 Я не знал, std::stringесть size()метод, спасибо за это. Мне известны общие лямбды в C ++ 14, но я не знаю, как это мне поможет, поскольку "string"есть const char*и нет std::string.
Zereges

1
@Zereges std::stringимеет size()и length()потому, что это и контейнер, и строка . Что касается auto, вы бы назвали лямбда с (std::string("google"))вместо ("google"). Вопрос только говорит «принимает 1 строку» без указания, что такое «строка».
Исана

@isanae C ++ 14 также должен "google"sсоздать std::string:)
Квентин

@Zereges вы можете просто throw;вызвать std::terminate()(потому что здесь нет текущего исключения).
Квентин

6

MUMPS, 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если х "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.
Banggle

@ Bungle Как это сейчас?
Бета-распад

1
@ Я понимаю, что Я забыл, что нужно возвращение
бета-распад

1
Используя функции стрелок ES6 и троичный оператор (вместо if), вы можете сжать это немного больше :)
Carles Alcolea

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

6

С, 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. Кроме того, я бы не использовал слово «испорченный». Память одинакова, биты просто по-разному интерпретируются. Технически, доступ к байту мусора является неопределенным поведением, и может фактически привести к segfault. Практически этот байт почти наверняка находится в том же допустимом блоке памяти, что и остальная часть строки, и обычно эти блоки (куча, стек, константы) выделяются как минимум в единицах размера слова. Таким образом, память принадлежит программе, она просто содержит что-то, кроме строки.
AShelly

6

Рубин, 29 байт

Сначала я придумал что-то очень похожее на первую попытку @ Borsunho, но моя была немного длиннее, и он опубликовал свою, прежде чем я закончил. Придумал это до того, как его 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,

@ Borsunho Я должен признать, что я просто "грубо насиловал" регулярное выражение, пока не получил желаемый результат :) Я думаю, что .*в конце концов это то, что заставляет его работать.
Даньеро

Разрывается, если входная строка имеет несколько строк и содержит Google в отдельной строке. Я думаю, что /\A(?!google\Z).*/mэто исправляет (хотя за счет трех байтов). ^и $соответствует началу и концу строк, а также \Aи \Zсоответствует началу и концу строки в целом.
гистократ

@histocrat, но я не думаю, что вы можете Google строки с несколькими строками;)
Даньеро

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

Редактировать: Добавлено? заменить if и заменить Error неопределенным объектом.

Редактировать 2: я понял, что мой счетчик байтов был неправильным, и удалил g =


4

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

{.,\'google'=!/}

Как и многие другие, просто сравнивает входные данные 'google'и делит длину на обратную величину результата.

Примеры программ:

  • С'bing' (выход: 4)
  • С'google' (выход: ошибка: попытка деления на ноль. )

@ Денис, я понимаю вашу точку зрения. В своем первоначальном виде он не был полностью пригоден для повторного использования (скажем, нельзя применить код над списком). Кроме того, я не осознавал, что вы написали практически идентичный ответ в CJam задолго до того, как я его опубликовал (на самом деле до сих пор я только смутно знал о CJam как о языке). +1 за ваше решение тоже.
PSWG

4

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

s_l1u"google"=-/

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


4

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

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

Вывод% длины строки%.

Полный код:

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