구글 "구글"하지 마십시오


158

Google은 "google"이라는 단어를 Google에서 사용하면 인터넷이 손상 될 수 있음을 알고 있습니다.

당신의 임무는 가능한 한 가장 적은 유니 코드 문자로 하나의 문자열을 허용하고 길이를 반환하는 함수를 만드는 것입니다.

그러나 주어진 문자열이 google(소문자)이면 오류가 발생합니다.

예를 들어, g('bing')반환 4되지만 g('google')오류가 발생합니다.

사용 예와 가능한 경우 오류를 알려주십시오.


122
나는 구글을 봤고 구글은 구글을 ​​구글 에서 찾았다. 신화가 파열되었다.
Geobits

86
@Geobits 그것은 구글 구글 여부를 확인하는 테스트입니다. : D
rybo111

7
함수는 대소 문자를 구분해야합니까? 주어진 'gOOgle'을 던져야합니까?
AXMIM

2
나는 구글 (크롬에 검색 창)에 구글 입력하면 메시지가 내가 갈 싶은지 묻는왔다 구글 . 이제는 tld이므로 com.google 작동합니다. 클릭하여 dns 조회 오류가 발생했습니다. 인터넷 : 깨졌습니다!
Craig Craig

4
나는 이것을 다시 열기로 투표하고 있습니다. 나는이 도전에 대한 오류가 무엇인지에 대한 질문을 보지 않았으며 이미 154 개의 답변이 있으므로 사양을 변경하는 것이 공정하다고 생각하지 않습니다. 이것은 좋은 질문의 예는 아니지만 충분합니다. 실제로 특정 출력이 오류인지 아닌지에 대한 답이 나오면 어쨌든 많은 투표 결과를 얻지 못할 것입니다.
Poke

답변:


228

파이썬 2, 29

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

ZeroDivisionErroron을 "google", 그렇지 않으면 길이를 제공합니다 . 이것은 파이썬의 부울 이등분 0과를 활용 1합니다.


2
+1. 당신은 설정해야합니다 g당신을 lambda생각, 또는 입력을 익명으로 호출합니다.
Zach Gates

4
재미를 위해 JavaScript ES6으로이 기술을 사용해 보았습니다. 그것은 25에서 끝났다, 그러나 반환 Infinity에 대한이 ... 대신 오류를 던지는 "구글"
ETHproductions

18
@ZachGates 메타에 대한 합의 는 특별히 허용되지 않는 한 익명 함수가 허용된다는 것입니다. 질문이 이와 같은 것을 암시하는 것처럼 보이지만 (아직 명시 적으로 허용하지는 않음) OP에 대해 문의해야합니다.
FryAmTheEggman

3
@Kevin 당신이 return사용 했다면 필요합니다def
FryAmTheEggman

3
흥미롭게도, 이것은 Pyth로 번역되어 내 최고의 Pyth 솔루션보다 우수합니다. 그것은이다 L/lbnb"google, 13 바이트.
isaacg

107

엑셀, 23 자

이것을 A1 이외의 셀에 붙여 넣고 검색어를 A1에 입력하십시오.

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

예를 들면 다음과 같습니다.

구글 구글


9
Excel 사용에 대한 일반적인 합의는 무엇입니까?
Beta Decay

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 #은 꼬리 재귀를 지원 하므로이 함수는 절대로 throw되지 않습니다 StackOverflowException. 실제로는 반환되지 않습니다 (으로 작동 while(true){}).
NightElfik

2
@DLeh Tail 재귀 호출은 약간 까다 롭습니다. x64 JIT에서 디버거없이 실행해야합니다 (디버거가 연결되어 있으면 꼬리 재귀가 명백한 이유로 작동하지 않습니다). 다음은 증명으로 내 프로그램입니다 : imgur.com/ErNl8LJ 및 꼬리 재귀에 대한 약간의 읽기 : blogs.msdn.com/b/davbr/archive/2007/06/20/… ;)
NightElfik

12
하하 : g (문자열) ... 나 ... 나 자신을 볼 수는
gregsdennis

1
@DLeh 아 잠깐만 나는 당신의 43 바이트를 일치시킬 수 있지만 그것을 이길 수는 없습니다. :) int g (string s) => s! = "google"? s.Length : s [9];
lee

57

Pyth, 14 13 자

L/lbnb"google

명명 된 함수를 정의합니다 y.

문자열이 Google 이 아닌 경우 길이를 1로 나누고 그렇지 않으면 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.
Dennis

90
확실하지 않지만 Pyth를 싫어하는 것 같습니다.
Mr Lister

40

MATLAB, 63 41 40 38 36 바이트

1 바이트를 면도 해 준 Tom Carpenter에게 감사합니다!

2 바이트를 줄여준 Stewie Griffin에게 감사드립니다!

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

다른 더 우아한 솔루션과 달리 MATLAB에서 0으로 나누기 연산을 수행하면 오류가 아니라 오히려 발생 Inf합니다. 이 솔루션은로 문자열의 길이를 찾습니다 nnz. 생성되는 문자열은 문자열의 시작 부분에서 끝 부분까지 색인을 생성하는 방식으로, 이는 본질적으로 문자열의 복사본입니다. 그러나 중요한 것은 입력이와 같은지 여부를 확인하여 문자열에 액세스 할 수있는 시작 부분이 생성된다는 것 'google'입니다. 그렇지 않은 경우 시작 인덱스 1이 생성되고 MATLAB이 1에서 인덱스를 시작하기 때문에 문자열에 정상적으로 인덱스합니다. 같으면 생성 된 인덱스는 0이고 MATLAB은 인덱스 오류를 발생시킵니다. 인덱스는 양의 정수 여야합니다. 여분의+동등성 검사의 출력이 Boolean /이 아닌 숫자인지 확인하는 것 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 바이트를 면도 해 준 Tom Carpenter에게 감사합니다!

2 바이트를 줄여준 Stewie Griffin에게 감사드립니다!

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

위의 내용은 공식 제출물이 아니지만 실행하기가 좀 더 재미 있습니다. 남용 eval익명 함수 내에서, 어떤 코드가하는 것은 입력 문자열이 동일한 경우를 확인한다는 것입니다 'google'...하고 있는지,이 MATLAB에 내장 된 웹 브라우저를 열고되고 액세스를 시도하는 구글의 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보다 2 바이트 짧습니다 numel. 몇 년 전에 내 투표를했다 :-)
Stewie Griffin

31

JavaScript ES6, 34 27 25 자

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

ΔGoogle 에 대해 ReferenceError를 발생 시킵니다.


10
삼항 연산자를 사용하여 2 바이트를 절약 할 수 있습니다.
Konrad Borowski

2
예, 정확히 내가 방금 얻은 것입니다. 화려하고 싶다면 g 대신 글로벌 변수로 존재하지 않도록 g 대신 사용하지 않는 기호를 사용하십시오. Δ는 좋은 변수 이름을 만듭니다 :)
Domino

1
#JS afaik에서 오류를 사용할 수 있습니다 .
clap

7
Δ Google 일루미나티 확인
DynamiteReed

2
난 그냥이 여기 떠날거야 github.com/Rabrennie/anything.js
sagiksp

26

TI-BASIC, 15 바이트

도대체 우리가 여기있는 동안 TI-BASIC 답변을 얻을 수도 있습니다.

입력 형식은 "string":prgmNAME입니다. 에 신용 토마스 콰 먼저 찾는!

length(Ans)+log(Ans≠"GOOGLE

(가이드 : 대문자 1 개를 대체하여 각 소문자 1 바이트를 추가하십시오 s/GOOGLE/google/g => +6 bytes.)

아아 테스트 케이스!

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

20 바이트 : length(Ans)/(Ans≠"google. 당신은 또한 사건이 잘못되었습니다; 대문자가 허용되면 14 바이트입니다. 그건 그렇고, Ans를 통해 인수를 전달하는 것이 유효합니다.
lirtosiast

AGOOGLE7, 맞아야합니까? 그리고 코드 크기에서 프로그램 헤더를 계산해서는 안되므로 10 바이트를 빼십시오.
lirtosiast

오류 : 하위 문자열을 생각하고있었습니다. 친절하게 용서하십시오.
Conor O'Brien

1
@ThomasKwa 나는 코드에 대한 귀하의 의견을 보지 못했습니다. 우리는 동일한 솔루션을 우연히 발견했습니다. 그러나 귀하가 크레딧을받을 자격이 있다고 생각되면 크레딧이 귀하의 것이됩니다. ^ _ ^ ( 편집 코드를 읽으면 정확히 같은 것은 아닙니다.)
Conor O'Brien

@lirtosiast length(는 2 바이트이므로 숫자는 21 바이트와 15 바이트입니다.
Timtech

23

APL (14)

(⍴÷'google'∘≢)

설명:

  • : 길이
  • ÷: 로 나눈
  • 'google∘≢: 인수가 'google'와 같지 않습니다 .

문자열의 길이를 제공합니다. 문자열이 같지 않으면 google(길이가 변경되지 않은 경우) 1로, 문자열 같으면 google(오류 제공) 0 으로 나눕니다 .


11
나는 변수없이 변수에 할당 될 수 있기 때문에 Parens를 계산할 필요가 없다고 생각합니다.
jimmy23013

단일 문자 인수에서 종류가 실패합니다. 로 교체 하여 수정하십시오 . 또한의 피연산자를 교체하여 더 멋지게 만들 수 있습니다 . 오, 파 렌스를 제거하는 것을 잊지 마십시오. 올인원 :≢÷≢∘'google'
Adám

21

파이썬 3, 30 바이트

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

술어가 (= 1) 인 IndexError경우 1 요소 기능 목록을 인덱싱합니다 . 그런 기능.u=='google'True

많은 변종. 와:

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

도전이 거꾸로 된 경우 ( 'google'이 아닌 모든 항목에 오류가 있음 ) 문자를 저장할 수 있습니다.

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

그러나 이미 길이를 알고 있으므로 하드 코딩하십시오.


파이썬 2.7에서도 작동
Noodle9

어떤 이유로 든, 나는이 솔루션을 좋아합니다.
foslock

19

하스켈, 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"=!/}

문자열이 Google 이 아닌 경우 길이를 1로 나누고 그렇지 않으면 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 바이트

나는 그것이 Octlab에서도 작동하는 Matlab 솔루션보다 길다는 것을 알고 있지만 특히 악합니다. 인수를 통해 전달 해야하는 콜백 함수 (자체적으로 재귀 적, 악의적 인)에 의존하는 함수 핸들을 포함하는 셀 배열 (이블) 리터럴 (이블)을 사용하여 익명 함수 (이블)를 만들고 있습니다. 그런 다음 기본적으로 함수를 문자열 인수로 줄이고 두 번째 인수 ff(매우 악한) 수정하는 다른 익명을 만듭니다 . 제정신의 인간은 Perl이나 regex (또는 cjam / pyth / 다른 esolang)처럼 거의 읽을 수 없기 때문에이 작업을 수행하지 않습니다.

따라서 문자열이 'google'이 아닌 경우 셀 길이의 두 번째 인수가 호출되어 문자열의 길이를 출력합니다. 그렇지 않으면 첫 번째 함수가 호출되며,이 함수는 나중에 함수 자체 인 콜백으로 전달됩니다. 오류는 기본적으로 최대 재귀 깊이 오류입니다.

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

2
그러한 것들은 대부분의 언어에서 악하지 않습니다. 그리고 이것은 이다 코드 골프, 지구상에서 가장 읽을 수없는 코드의 일부는 여기에 존재 :). 쿨 핸들 btw.
BAR

9
나는 일부 누락 eval여기가 진짜로 악 :-) 만들기 위해
루이스 Mendo

12

자바 스크립트, 25 바이트

훌륭하고 간단한 JavaScript 예제 :

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

"google"을 입력하면 ReferenceError

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


2
와우, 자바 스크립트에 lamda 함수에 대한 속기가 있다는 것을 알려 주셔서 감사합니다!
Tomáš Zato

3
@ TomášZato Caveat : ES2015의 새로운 기능이므로 지원은 여전히 ​​다양합니다.
Anko

11

APL, 19 17 바이트

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

입력이 인 경우 구문 오류를 발생시키는 명명되지 않은 monadic 함수입니다 google. 이것은 자연의 대수를 취하려고 시도함으로써 달성됩니다.

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

온라인으로 사용해보십시오

Dennis 덕분에 2 바이트를 절약했습니다!


비공식적으로 "스 플랫"으로 알려져 있습니다. 이 사용법에 매우 적합한 이름입니다.
Adám

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 문의 "no"매개 변수에 대해서는 아무것도 추가하지 않았으므로이 매개 변수가 호출되면 오류가 리턴됩니다.


10
다음은 약간 더 짧은 것입니다.g=function(x)nchar(x)[[x!="google"]]
flodel

9

펄, 31 29 바이트

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

manatwork 덕분에 -2b

용법:

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

함수가 아닌 프로그램으로 도망 갈 수 있다면 다음은 20 바이트 (+ 1 바이트 명령 줄)에서만 유효합니다.

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

오류는 0으로 나누기입니다.

설명:

y///c길이를 반환 한 다음 !/^google$/입력이 'google'과 일치하면 0을 반환합니다.

용법:

perl -p entry.pl input.txt

2
익명 함수로 만들 수 sub{…}있습니다.. (그러면 당신은 그것을 그렇게 부르십시오 sub{…}->("google").)
manatwork

사용하여 1 바이트를 저장 $_!=google하는 대신!/^google$/
가브리엘 Benamy

@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

파이썬 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

자바 7:53 52 바이트

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

위의 코드는 ArithmeticException0으로 나누지 않고 String이외의 다른 경우 에는 throw 됩니다 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 둘 다 문자 인 경우 문자열 풀에서 참조되는 것과 동일한 개체이므로 작동합니다. 스펙은 리터럴을 제공하며 여기서는 리터럴이므로 작동합니다.
Yassin Hajaj

2
@YassinHajaj 나는 스펙이 그것을 리터럴로 제공한다는 것에 동의하지만 그것은 단지 예일 뿐이다. stdin에서 입력을 받았거나 함수가 별도로 컴파일 된 다른 클래스에서 호출 된 경우 함수는 아마도 동일하게 수행되어야합니다. 어쨌든 컴파일러 최적화 (문자열 인턴)에 의존하는 것은 좋지 않은 생각입니다.
gengkev

7

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

글쎄, 0으로 나누는 것은 정의되지 않은 행동이며, 나는 오류를 부르지 않을 것입니다. 그래서 내 접근 방식.

#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::stringauto. std::string대신 실제 값을 전달해야 합니다 const char*.
isanae

@isanae 나는 몰랐다는 std::string있다 size(), 그것에 대해 감사 방법. C ++ 14의 일반적인 람다에 대해 알고 있지만 "string"is const char*및 not 때문에 어떻게 도움이되는지 모르겠습니다 std::string.
Zereges

1
@Zereges은 std::string가지고 size()length()그것 때문에 용기와 문자열 모두 . 에 관해서는 대신에 auto람다를 호출합니다 . 질문은 "문자열"이 무엇인지 지정하지 않고 "1 문자열 만 허용"이라고 말합니다. (std::string("google"))("google")
isanae

@isanae C ++ 14는 :) "google"s을 생성해야합니다.std::string
Quentin

@ 현재 예외가 없기 때문에 간단 throw;하게 트리거 할 수 있습니다 std::terminate().
Quentin

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}

Old : 다른 아이디어와 비슷합니다. 올릴 ArgumentErrorx는 '구글'인 경우.


2
왜 괄호입니까? x=='google'?t: x.size
manatwork

6

자바 스크립트, 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"))


기술적으로 이것은 OP의 사양을 충족하지 않습니다. 이 함수는 길이를 경고하지만을 반환합니다 undefined.
Bungle

@Bungle 지금 어때요?
Beta Decay

1
@Bungle 알겠습니다. 반품이 필요하다는 것을 잊었습니다
Beta Decay

1
ES6의 화살표 기능과 삼항 연산자 (if 대신)를 사용하면 좀 더 짜낼 수 있습니다.
Carles Alcolea

1
@BetaDecay 독창성; 나는 그걸 존경한다.
Carles Alcolea

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). 이 답변에는 이런 저급한 것들을 좋아하는 사람들에게 설명이 필요하다고 생각합니다.
Braden Best

기본적으로 가지고 있습니다. 단순히 문자열을 저장하는 메모리를 64 비트 숫자로 캐스팅합니다. 엔디안은 x86 아키텍처에서 '뒤로'만듭니다. 텍스트는 7 바이트 만 차지하므로 마스크는 메모리에서 다음에있을 수있는 모든 것을 숨 깁니다. 재미있는 트릭이지만 '!! strcmp (s, "google")'은 실제로 더 짧습니다.
AShelly

1
어쨌든 +1. 명확히. 또한 int 4 문자 인을 제거하여 줄일 수 있다고 생각합니다 .
Braden Best

타이핑 한 후 알아 냈습니다! 경우 char *의 단위로, 8-bits로 주조되는 long *단위와, 64-bits올바르게 재 할당되지 않고, 힙 공간 그 8 바이트의 데이터가 손상되고, 단일 숫자로서 취급 ( 8*8 = 64). 그래서 처음 6 자 + NUL + 쓰레기를 얻습니다. 그것은 매우 영리합니다. 위험합니다. 왜 segfault가 아닌지 궁금합니다. 그 8 번째 쓰레기 바이트가 한계를 벗어났습니다.
Braden Best

나는 당신의 분석을 보았다. 당신은 맞습니다, 교대는 54가 아닌 56이어야했습니다. 또한 저는 손상된 단어를 사용하지 않을 것입니다. 메모리는 동일하며 비트는 다르게 해석됩니다. 기술적으로 가비지 바이트에 액세스하는 것은 정의되지 않은 동작이며 실제로 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>'

편집 : 2 년 후 일부 루비 버전

루비 , 25 바이트

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

String#size새로운 단항 플러스 로 대체 되었습니다. 온라인으로 사용해보십시오!


깔끔하게, 나는 이것을 작동시킬 수 없었습니다 (나는 ^성냥 그룹 을 떠나는 것을 생각해 내지 못했습니다).
Borsunho

@ Borsunho 나는 내가 원하는 결과를 얻을 때까지 나는 정규 표현식을 "강제로 강요한다"는 것을 인정 .*해야한다.
daniero

입력 문자열에 여러 줄이 있고 자체 줄에 Google이 포함되어 있으면 중단됩니다. 나는 /\A(?!google\Z).*/m그것을 고친다 고 생각 한다 (3 바이트의 비용으로). ^그리고 $시작과 라인의 끝과 일치, 동안 \A\Z전체 문자열의 시작과 끝을 일치합니다.
histocrat

) @histocrat하지만 난 당신이 여러 줄 문자열을 구글 수 있다고 생각하지 않습니다
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

자바 스크립트 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'하고 결과의 역수로 길이를 나눕니다.

예제 프로그램 :


@ 데니스 당신의 요점을 참조하십시오. 원래 형식으로 정확하게 재사용 할 수 없었습니다 (목록에 코드를 적용 할 수는 없습니다). 또한 나는 당신이 이것을 게시하기 전에 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 )

출력은 % 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

여호수아 호니의 대답에서 수정 여기 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.