「グーグル」という言葉をグーグルで検索すると、インターネットが切断されることは周知の事実です。
あなたの仕事は、1つの文字列を受け入れ、その長さを可能な限り少ないUnicode文字で返す関数を作成することです。
ただし、指定された文字列がgoogle
(小文字)の場合、エラーが発生します。
たとえば、g('bing')
返されます4
が、g('google')
エラーが発生します。
使用例と、可能であればエラーを提供してください。
「グーグル」という言葉をグーグルで検索すると、インターネットが切断されることは周知の事実です。
あなたの仕事は、1つの文字列を受け入れ、その長さを可能な限り少ないUnicode文字で返す関数を作成することです。
ただし、指定された文字列がgoogle
(小文字)の場合、エラーが発生します。
たとえば、g('bing')
返されます4
が、g('google')
エラーが発生します。
使用例と、可能であればエラーを提供してください。
回答:
lambda x:len(x)/(x!='google')
ZeroDivisionError
onを与え、"google"
そうでなければ長さを与えます。これは、とに等しいPythonのブール値を利用0
し1
ます。
g
するlambda
か、入力を使用して匿名で呼び出す必要があります。
Infinity
、エラーをスローする代わりに「google」に戻ります
return
場合def
L/lbnb"google
、13バイト。
サラ・アラミの答えに対する改善。「google」の提供時にスタックオーバーフロー例外をスローする再帰
int g(string s)=>s!="google"?s.Length:g(s);
StackOverflowException
。実際には、戻りません(として動作しますwhile(true){}
)。
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)
;
、明らかにここに
y
。」しかしy
、あなたのコードにはありません!?
L
関数は、関数を再定義しますy
。
@(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))
@(x)eval('if strcmp(''google'',x),web([x ''.com/i'']);else nnz(x),end');
上記は公式の提出物ではありませんが、実行するのが少し楽しいものです。eval
匿名関数内での悪用、コードが行うことは、入力文字列が'google'
...と等しいかどうかを確認することです。そうであれば、MATLABの組み込みWebブラウザーが開き、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'
により、次の画面が表示されます。
strcmp
代わりにを使用してバイトを保存できますisequal
。
strcmp
しましたがisequal
、何らかの理由で使用することになりました。
nnz
は、より2バイト短いですnumel
。数年前に私の投票がありました:
#
、JS afaikでエラーを使用することができます
ヘック、私たちがそれをしている間に、ここでTI-BASICの答えを得るかもしれません。
入力形式は"string":prgmNAME
です。最初に見つけたのはThomas Kwaの功績です!
length(Ans)+log(Ans≠"GOOGLE
(ガイド:大文字を置き換えるために小文字ごとに1バイトを追加しますs/GOOGLE/google/g => +6 bytes
。
"GOGGLE":prgmG
6
"BING":prgmG
4
"GOOGLE":prgmG
Error
length(Ans)/(Ans≠"google
。ケースも間違っています。大文字が許可されている場合、14バイトです。ところで、Ansを介して引数を渡すことは有効です。
AGOOGLE
7、正しいはずですか?また、コードサイズでプログラムヘッダーをカウントするべきではないため、10バイトを減算します。
length(
は2バイトです。これにより、数値は21バイトと15バイトになります。
(⍴÷'google'∘≢)
説明:
⍴
: 長さ÷
: で割った'google∘≢
:引数が'google
' と等しくない。⍴
文字列の長さを指定します。これは、文字列が等しくない場合は1で除算されgoogle
(長さが変更されずに戻る)、文字列が等しい場合は0で除算されgoogle
ます(エラーが発生します)。
⍴
て修正し≢
ます。また、のオペランドを交換することで、見栄えを良くすることができます∘
。ああ、かっこを削除することを忘れないでください。オールインオール:≢÷≢∘'google'
lambda u:[len][u=='google'](u)
1要素関数リストのインデックスを作成しIndexError
、u=='google'
述語がTrue
(= 1)である場合に上げます。そのような機能。
多くのバリエーション。ワオ:
lambda u:[len(u)][u=='google']
lambda u:len([u][u=='google'])
チャレンジが反転した場合には(すべてのエラーをいない文字を救うことができる、「グーグル」):
lambda u:{'google':len}[u](u)
ただし、長さはすでにわかっているので、ハードコーディングするだけです。
{_,\"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.
q_,\"google"=!/
。この投稿を見る前にそれを開発しました。これは入力全体をとることに注意してください(とにかく関数の引数として受け取るようです)。残念ながら、これは関数を要求するため使用できません:(
Matlabソリューション(Octaveでも動作します)よりも長いことは知っていますが、特に悪です。引数を介して渡さなければならないコールバック関数(それ自体、したがって再帰的、悪)に依存する関数ハンドルを含むセル配列(悪)リテラル(悪)を使用して、匿名関数(悪)を作成しています。次に、基本的に関数を文字列引数に減らし、f
asの2番目の引数を修正する別の匿名を作成しますf
(非常に悪い)。健全な人間は、Perlや正規表現(またはcjam / pyth /その他のesolang)とほぼ同じくらい読みにくいため、これを行うことはありません。
したがって、文字列が「google」でない場合、セル配列の2番目の引数が呼び出され、文字列の長さが出力されます。それ以外の場合、最初の関数が呼び出され、それはコールバックとして渡されます(そして、それ自体もコールバックとして渡されます)。このエラーは、基本的には最大の再帰深度エラーです。
f=@(s,f){@()f(s,f),numel(s)}{2-strcmp(s,'google')}();@(s)f(s,f)
eval
本当にそれを邪魔するためにここにいくつか欠けています:
{⍵≡'google':⍟⋄≢⍵}
これは、入力がの場合に構文エラーをスローする名前のないモナド関数ですgoogle
。これは、何もない自然対数をとろうとすることで達成されます。
{
⍵≡'google': ⍝ If the right argument is "google"...
⍟⋄ ⍝ Compute log(<nothing>), which brings only sadness
≢⍵ ⍝ Otherwise compute the length
}
デニスのおかげで2バイト節約できました!
⍟
非公式には「スプラット」として知られています。この用途に非常に適切な名前。
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」パラメーターには何も追加しなかったため、このパラメーターが呼び出されるとエラーが返されます。
g=function(x)nchar(x)[[x!="google"]]
sub{$_=pop;y///c/!/^google$/}
-2bマナトワークのおかげ
使用法:
sub{$_=pop;y///c/!/^google$/}->("google")
関数ではなくプログラムで逃げることができれば、20バイト(+1バイトのコマンドライン)で以下が有効になります。
$_=y///c/!/^google$/
エラーはゼロによる除算です。
説明:
y///c
長さを返し、!/^google$/
入力が「google」と一致する場合は0を返します。
使用法:
perl -p entry.pl input.txt
sub{…}
。(それからあなたはそれのように呼びますsub{…}->("google")
。)
$_!=google
代わりに!/^google$/
!=
文字列を比較するために動作しないのではないかと心配しています...
lambda n:len(n)if n!='google'else d
(lambda n:len(n)*(n!='google')or d)('')
int g(String _){return"google"==_?0/0:_.length();}
上記のコードはArithmeticException
、ゼロによる除算とString
それ以外の場合にスローされますgoogle
。==
参照を比較し、String
オブジェクトでは機能しないことに注意してください。
(以下のコメントに示された提案に基づいて)
s->s=="google"?0/0:s.length()
s->(s.equals("google")?null:s).length();
==
、Javaでの文字列の比較は一般に機能しません(文字列のインターンに頼っている場合を除き、それは悪いことです)。おそらくあなたはJavaScriptと混同されたのでしょうか?
さて、ゼロによる除算は未定義の動作であり、エラーとは呼びません。だから私のアプローチ。
#include<ios>
[](std::string s){return s!="google"?s.size():throw;};
使用法
[](std::string s){return s!="google"?s.size():throw;}("google");
size()
2バイトを節約するために呼び出すことができます。C ++ 14では、あなたはまた、一般的なラムダを使用して置き換えることができますstd::string
によってauto
。のstd::string
代わりに実際に渡す必要がありconst char*
ます。
std::string
持っているsize()
方法、そのためのおかげで。私はC ++ 14の汎用ラムダを知っていますが、"string"
is const char*
とnot であるため、どのように役立つかわかりませんstd::string
。
std::string
ありsize()
かつlength()
それはだから、コンテナと文字列の両方。についてはauto
、の(std::string("google"))
代わりにlambdaを呼び出します("google")
。質問は、「文字列」が何であるかを指定せずに、「1文字列を受け入れる」だけです。
"google"s
を構築する必要がありstd::string
ます
throw;
トリガーすることができますstd::terminate()
(現在の例外がないため)。
g(s) q $S(s'="google":$L(s))
使用法:
>w $$g^MYROUTINE("bing")
4
>w $$g^MYROUTINE("google")
<SELECT>g^MYROUTINE
どうして?まあ、$S[ELECT]
ほとんどHaskellのか錆のような言語では、パターンマッチのような-基本的にコンパクトなマルチ節のif-else文です。ただし、HaskellやRustとは異なり、パターンの網羅性はチェックされません。「コンパイル時の安全性」という概念はMUMPSに完全に当てはまらないためです。入力があなたが説明しなかったパターンである場合、あなたはと呼ばれる素敵なランタイムエラーを取得します<SELECT>
。
素敵でシンプル。
編集:ルールに準拠するようになりました
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
。
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");}
0x656c676f6f67
= elgoog
)。この答えには、この種のクレイジーな低レベルのものに感謝する私たちの説明が必要だと思います。
int
4文字のを削除することで短縮できると思います。
私は最初に@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>'
->s{+s[/^(?!google$).*/]}
String#size
新しい単項プラスに置き換えられます。オンラインでお試しください!
^
マッチグループの外に出ることに思いつきませんでした)。
.*
最後にそれが機能するものだと思います。
/\A(?!google\Z).*/m
修正すると思います(ただし、3バイトのコストがかかります)。^
そして$
、行の先頭と末尾に一致し、while \A
と\Z
文字列全体の先頭と末尾に一致します。
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
興味があれば説明させていただきます。私の答えに何か問題がある場合や、ゴルフの提案がある場合はお知らせください。
こんにちは、私はゴルフをコーディングするのは初めてなので、これはおそらくもっと多くのゴルフをすることができますが、ここにそれがあります:
_=>_=="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 =を削除しました
{.,\'google'=!/}
他の多くの場合と同様に、単に入力を比較し'google'
、結果の逆数で長さを除算します。
サンプルプログラム:
'bing'
(出力:4
)'google'
(出力:エラー:ゼロで除算しようとしました。)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
ジョシュア・ホニグの回答を修正しました。