これは有効な変数名ですか?


23

目的

変数名が有効と出力1である場合、またはチェックそのプログラムまたは機能を記述しTrue、それが有効である場合0.5、それが有効であるが、下線(_)で始まり、0または場合はFalse、それが有効でない場合。

ルール

  • ほとんどの言語の変数名は、アンダースコアまたは文字(az、AZ、_)で始まり、残りの文字がアンダースコア、文字、または数字の場合に有効です。(az、AZ、0-9、_)
  • 出力1またはTrue変数名が有効なFalse場合は0、無効な場合は0 。
  • ただし、変数をアンダースコアで開始することはお勧めできません。したがって、変数がアンダースコアで始まり、名前が有効な場合は0.5を返します。

テストケース

入力

abcdefghijklmnop

出力

1

入力

_test_

出力

0.5 (アンダースコアで始まります)

入力

123abc

出力

0 (数字で始まる)

入力

A_b1C_23

出力

1

入力

_!

出力

0 (有効ではないため0.5ではありません)

入力

magical pony1

出力

0 (場所がない)

標準の抜け穴が適用されます。

これはなので、最短のコードが優先されます。

ボーナス:プログラム/関数が0空の文字列("")を出力する場合、-10%。


1
真実/偽/何かを出力できますか?
電卓

5
Pythonでは、アンダースコアがよく使用されることに注意してください。クラスには初期化関数が必要です。クラス内のヘルパー関数は、アンダースコアで始まる場合があります。
Rɪᴋᴇʀ

1
@EasterlyIrkはミニマークダウンに注意してください。あなたが意味した__init__; また、いいえ、クラスはありません必要__init__はなく、通常、1匹の持っている

6
入力が空でないと仮定できますか?(現在の回答のほとんどは、空の入力に対して失敗するようです。)
デニス

1
そのボーナスは切り上げられますか、切り下げられますか?アップしている場合、現在の回答セットに実際に値することはありません
ブルー

回答:


13

JavaScript(ES6)、37-10%= 33.3バイト

@ edc65のおかげで4バイト節約

@Mateonのおかげで5.6バイト節約

s=>!/^\d|\W|^$/.test(s)/-~(s[0]=='_')

3
これはperlではないことを絶対に確信していますか?
seequ

8

05AB1E25 24 20 19バイト

コード:

¬D'_Qsa·+¹žj-""Q*2/

説明:

¬                     # Push input and also push the first character.
 D                    # Duplicate the first character.
  '_Q                 # Check if it is equal to an underscore character.
     sa               # Swap and check the duplicate if it's an alphabetic character.
       ·              # Double the value.
        +             # Add both values up
         ¹            # Take the first input.
          žj-         # žj is short for [a-zA-Z0-9_]. This will be substracted from the
                        initial string. 
             ""Q      # Check if the string is empty.
                *     # Multiply this with the first value.
                 2/   # Halve it, resulting into 0.0, 0.5, or 1.0.

つまり、s擬似コードの文字列の式は次のとおりです。

((s[0] == '_' + s.isalpha() × 2) × (s.remove([a-zA-Z0-9_]) == "")) / 2

オンラインでお試しください!

CP-1252エンコードを使用します。


6

PHP(50-10%= 45)

-2のSchismに感謝します:)

preg_match('/^[a-z_]\w*$/i',$s)?$s[0]=='_'?.5:1:0;

golflangの回答と競合することはありませんが、とにかくやってみようと思いました。

preg_match('/^[a-z_]\w*$/i', $s) # Matches every a-zA-Z0-9_ string that doesnt start with a number
?   $s[0] == '_'                   # Then, if it starts with an _
    ?   .5                         # give 0.5 points
    :   1                          # If it doesn't, give 1
:   0;                             # If it didn't match the regex, give 0

注意すべき点は、PHPでは/u修飾子なしで\wASCII文字のみを選択することです。他のいくつかの言語/正規表現のフレーバーでは、このパターンは機能しません。

編集:非ASCII文字と数字も含む言語を使用するとき、多くの人が回答に\ wと\ dを使用しているのを見ます。それはパズルではありません。彼らは間違ってる。(まだ投票/コメントできません。このように伝える必要があります。)


プログラミングパズルとCode Golf Stack Exchangeへようこそ。これは素晴らしい答えです。多くの場合、コードゴルフの課題は言語内および言語間で発生します。このソリューションの+1を提供します!よくやった。
wizzwizz4

1
で2つの文字を削ることができ[a-z].../iます。
分裂

@Schismありがとうございます。どうやってそれを忘れたのかわからない、通常私はこの種の正規表現パズルが得意だ:)
Xesau

1
編集について:より具体的にすることができます-どの言語ですか?javascriptでは、\dとまったく同じ[0-9]です。\wexactllyと同じである[A-Za-z0-9_] developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/...
edc65

言語が使用するコードページは無関係です。正規表現がASCIIを適切に処理する限り、有効です。私の知る限り、現在の正規表現ベースの回答はすべて機能します。あなたはあなたの言語の変数名と一致させようとはしていません。むしろ、チャレンジのルールに基づいて変数名を一致させようとしています。
Mego

5

網膜、30-10 %= 27 28-10%= 25.2 29-10%= 26.1バイト

どちらのバージョンも、空の入力(出力0)を正しく処理するため、ボーナスの対象となります

.NET正規表現機能の1つに起因するバグを修正する必要がありました。これは、一部の(多くの)Unicode文字を「単語」文字と見なします。幸いなことに、これには両方のバージョンで1バイトしかかかりませんでした。正規表現に一致する動作をECMAScript標準に準拠させるために修飾子を追加するだけでした。詳細はこちら

@MartinBüttnerが作成した新しい28 29バイトバージョン。ありがとう!

^ _
$_¶_
Mme` ^(?!\ d)\ w + $
2
0.5

説明

まず、入力がアンダースコアで始まるかどうかを確認します。存在する場合、入力は複製され、間に改行が入ります。例:_test_-> _test_\n_test_、ここ\nで改行です。その後、我々は数字で始まっていないものを、一致させようが、「言葉」の文字(任意の数が続いているa-zA-Z、数字、およびアンダースコア)、各ライン上。入力がアンダースコアで始まり、2行に置き換えられた場合、これは両方の行に一致することに注意してください。次に、2つの一致があるかどうかを確認し、それらをに置き換えます0.5。空の行または無効な行は常に0個の一致を生成し、有効な変数名は常に1個の一致を生成します。


私自身の30 31バイトバージョン

Ae` ^ \ d | \ W
^ _。*
0.5
^ \ D. *
1
^ $
0

説明

入力数字で始まるか非単語文字(以外含まれている場合、まず第一に、我々はチェックしa-zA-Z数字とアンダースコアを)。無効な場合、破棄されます。次に、アンダースコアで始まるかどうかを確認します。存在する場合、に置き換えられ0.5ます。それは数字以外の文字で始まる(この時点で最初の文字のいずれかであるならば、我々はチェック0a-zまたはA-Z。のみa-zA-Z明らかに、非数字です)。存在する場合は、に置き換えられ1ます。次に、空の文字列を確認し、それをに置き換え0ます。

オンラインでお試しください!
オンラインでお試しください!古いバージョン


ウェイトウェイトウェイト。で^\D.*、ステージでは0で開始することができますか?それは変だ。
電卓

@CatsAreFluffyで始まり_、で置き換えられた場合、可能0.5です。その後、0から始まります。
daavko

これは、入力に対して誤って1を与えますΨ
AdmBorkBork

@TimmyD興味深い。なぜそうなのかわかりません。クイックチェックでは、それは示して\w(私はそれを与えることを試みたことはやるべきでない、非ASCII文字を一致さƜƝƞƟƠᎳᎴᎵᎶᎷᎸᎹ入力など)。これについては後で調べます。考えられる解決策はに置き換え\wられて[a-zA-Z\d_]いるようです。
-daavko

3

MATL、27バイト

1)95=2/8M3Y2m+G7M95h4Y2hmA*

これは、言語の現在のバージョン(15.0.0)で機能します。

入力は単一引用符付きの文字列です。

オンラインでお試しください!

説明

1)      % take input implicitly. Get its first element
95=     % true if it equals 95 (underscore)
2/      % divide by 2: gives 0.5 if underscore, 0 if not
8M      % push first element of input again
3Y2     % predefined literal: string with all letters
m       % true if it's a letter
+       % add. Gives 1 if letter, 0.5 if underscore
G       % push input again
7M      % push string with all letters again
95h     % concatenate underscore
4Y2h    % predefined literal: string with all digits. Concatenate
mA      % true if all input chars belong to that concatenated string
*       % multiply. Display implicitly

3

Pyke、21バイト

(非競合、追加された文字列の減算、さまざまな文字列定数)

Qh~u{Q~J\_+-|!Qh\_qh/

説明:

Qh~u{                 - Check first char isn't a digit
     Q~J\_+-          - Is the input alphanumeric + "_"
            |!        - Combine
              Qh\_q   - Is the first char an "_"
                   h/ - Combine

3

Python 3、36バイト

lambda s:s.isidentifier()/-~(s[:1]=='_')

コードの長さは40バイトで、-10%ボーナスの対象となります。

これは、非ASCII文字/数字を持たないコードページでのみ正しく機能することに注意してください。



2

ゴッホ、29バイト

÷"[^\W\d]\w*"g¦"_.*"g+÷2=0.5¿

次を使用して実行:

$ ./gogh no '÷"[^\W\d]\w*"g¦"_.*"g+÷2=0.5¿' "_test"

説明

                   “ Implicit input                               ”
÷                  “ Duplicate the TOS                            ”
"[^\W\d]\w*"g      “ Fully match the STOS against the TOS (regex) ”
¦                  “ Swap the STOS and TOS                        ”
"_.*"g             “ Fully match the STOS against the TOS (regex) ”
+                  “ Add the TOS to the STOS                      ”
÷                  “ Duplicate the TOS                            ”
2=                 “ Determine if the TOS is equal to 2           ”
0.5¿               “ Leave the correct output on the stack        ”
                   “ Implicit output                              ”

2

Perl、21バイト

$_=!/\W|^\d//2**/^_/

スコアには、スイッチの+1バイトが含まれます-pIdeoneで試してみてください。


-$_||$_=...空の答えを説明するために言うことができますか?(perlのnoopである-ため使用+
Ven

いいえ、それは実行時エラーです。しかし、それが機能したとしても、私のスコアは悪化します。
デニス

最小限のテストしか行っていないので、信頼します。フェア21バイトの10%が..あまりないことを
ヴェン

2

Pyth、19バイト

c!:z"\W|^\d"0h!xz\_

Pyth Compilerで試してください。

これは、非ASCII文字/数字を持たないコードページでのみ正しく機能することに注意してください。

使い方

c!:z"\W|^\d"0h!xz\_  (implicit) Save the input in z.

  :z        0        Test if z matches the following regex:
    "\W|^\d"           A non-word character or a digit at the beginning.
                     This returns True iff z is an invalid name.
 !                   Apply logical NOT to yield True iff z is a valid name.
               xz\_  Find the first index of the underscore in z.
                     This yields 0 iff z begins with an underscore.
             h!      Apply logical NOT and increment.
                     This yields 2 if z begins with an underscore, 1 otherwise.
c                    Divide the two results.

2

係数、84 * 0.9 = 76.5

USE: regexp
[ R/ [_a-zA-Z]\w*/ R/ _.*/ [ matches? 1 0 ? ] bi-curry@ bi 0 = 1 2 ? / ]

リスナー(repl)で実行し、文字列を受け取って{0 | 1/2 | 1}。

単語として定義すると、97文字です。

USE: regexp
: v ( s -- n ) R/ [_a-zA-Z]\w*/ R/ _.*/ [ matches? 1 0 ? ] bi-curry@ bi 0 = 1 2 ? / ;

仕組み:

R/ [_a-zA-Z]\w*/ R/ _.*/2つの正規表現を定義します。各正規表現にbi-curry@部分的に引用符[ matches? 1 0 ? ]を適用し、スタックにカリー化された2つの引用符を残します。bi引数文字列に各引用符を適用します。

それらのそれぞれ(カリー化された引用)は、一致したかどうかに応じて1または0を残します。最初の名前は整形式の名前に一致し、2番目の名前はアンダースコアで始まります。

0 = 1 2 ? / 最後の値は、0の場合は1に、1の場合は2に置き換えられます。その後、最初の値(1または0、有効かどうか)が2番目の値(2または1で、アンダースコアで始まるかどうかで除算されます) 。

これはすごい!もう少し感謝する縮小へのポインタ...

そして、私は正規表現が嫌いです!

PS。

{ 0 } [ "" v ] unit-test
{ 0 } [ "" v ] unit-test
{ 0 } [ "1" v ] unit-test
{ 0 } [ "1var" v ] unit-test
{ 0 } [ "var$" v ] unit-test
{ 0 } [ "foo var" v ] unit-test
{ 1 } [ "v" v ] unit-test
{ 1 } [ "var" v ] unit-test
{ 1 } [ "var_i_able" v ] unit-test
{ 1 } [ "v4r14bl3" v ] unit-test
{ 1/2 } [ "_" v ] unit-test
{ 1/2 } [ "_v" v ] unit-test
{ 1/2 } [ "_var" v ] unit-test
{ 1/2 } [ "_var_i_able" v ] unit-test
{ 1/2 } [ "_v4r14bl3" v ] unit-test

すべてのテストパス;)


ただ疑問に思って、空白は本当に必要ですか?私は言語がわからないか、通訳がないので、はっきりと言うことはできません。
ママファンロール

@MamaFunRollええ、最高のゴルフ言語ではありません!Forthの伝統では、区切り文字のみが空白文字です。
フェデ

ああなるほど。ここで、賛成票を持っています。
ママファンロール

イェーイ!今、私のコメント-どこでも特権で大混乱を壊します!
フェデ

2

Dyalog APL、19バイト-10%= 17.1

{(0≤⎕NC⍵)÷1+'_'=⊃⍵}

{... ... }右引数が表され匿名関数
⊃⍵の最初の文字(空の場合はスペースを与える)
'_'=「アンダーバー、0に等しい場合1はそうでない
1+最初のアンダーバー、1つのそれ以外の場合は2と評価された
⎕NC⍵ 名前のクラス。無効な名前の場合は-1、未定義の場合は0(有効な名前)、定義されている場合は2-9(したがって有効)


1

Mathematica、93バイト

If[#~StringMatchQ~RegularExpression@"[A-Za-z_][0-9A-Za-z_]*",If[#~StringTake~1=="_",.5,1],0]&

これさらにゴルフできるかどうかは正直わかりません。


1

Perl、34 + 1 = 35バイト

$_=/^([^\W\d])\w*$//(($1 eq"_")+1)

-pフラグを使用します。

説明

$_=/^([^\W\d])\w*$//(($1 eq"_")+1)
   /^([^\W\d])\w*$/                 matches any string that starts with an underscore or a letter of the alphabet followed by 0 or more alphanumeric + underscore characters. The first character is stored in a capture group
                   /                divide result by
                    (($1 eq"_")+1)  (capture == "_") + 1. This is 1 if the first character was not an underscore and 2 if it was.
$_=                                 assign to $_ and implicitly print

[_a-zA-Z]-> [^\W\d]perlがJavaScriptと同じように機能する場合、あなたもやらなければならないと思います\w*
-Downgoat

@Downgoatは正常に動作するよう\w+です。
spaghetto

falseに一致a
-Downgoat

@Downgoatああ、そうです。そうですか。
spaghetto

1

Python、84 -10%= 76バイト

lambda x:[0,[[.5,1][x[0]>'z'],0][x[0]<'A']][x.replace('_','a').isalnum()]if x else 0

0

JavaScript ES7、37バイト

x=>!x.match(/\W|^\d/)/2**/^_/.test(x)

オンラインで試す

使い方:

x=>                                   // Fat arrow function
   !x.match(/\W|^\d/)                 // Gives false if contains non word or starting 
                                      //   with a digit. Booleans in numeric context will 
                                      //   be 0 or 1
                      2**             // 2 to the power of...
                         /^_/.test(x) // gives true if starting with '_'. 
                                      //   true -> 1 -> 2**1 -> 2
                                      //   false -> 0 -> 2**0 -> 1
                     /                // Devide the lValue boolean with the numeric rValue:
                                      // lValue = 0 or 1
                                      // rValue = 2 or 1

@DennisのPerl回答のポート


0

ルビー、44バイト

->(s){s=~/^(_|\d)?\w*$/?$1?$1==?_?0.5:0:1:0}

あなたがstabbyラムダのパラメータの周りの括弧は必要ありません
未チャールズことを

また、その余分な3成分をドロップする方法を考え出すことができれば、おそらくいくつかのバイトを節約できます。たぶん/^([a-z_]).../i代わりに/^(_|\d)?.../
チャールズ

@NotthatCharles D'oh ...その通りです。機会があれば詳しく見ていきます
-Flambino

0

ルビー、57-10%= 51.3バイト

->(s){case s
when'',/^\d/,/\W/
0
when/^_/
0.5
else
1
end}

かなりナイーブなアプローチ


51.3バイトです。:)
Xesau

@Xesau whoops-恥ずかしい。今すぐ修正:)
フランビーノ

あなたが三元チェーンを使用する場合には、バイトの膨大な量を保存します->(s){s=~/^$|^\d|\W/?0:s=~/^_/?0.5:1}
バリューインク

@KevinLau True-私はその静脈に別のルビーの答えをすでに追加しました(どちらも素晴らしいことではありませんが)
フランビーノ

0

ルア、82-10%= 73.8

v=function(s)return(s:match("^[_%a]+[_%w]*$")and 1or 0)*(s:match("_")and.5or 1)end

テストケース:

print(v("a") == 1) -- true
print(v("1") == 0) -- true
print(v("_") == 0.5) -- true
print(v("") == 0) -- true
print(v("1a") == 0) -- true
print(v("a1") == 1) -- true
print(v("_1") == 0.5) -- true
print(v("_a") == 0.5) -- true
print(v("1_") == 0) -- true
print(v("a_") == 0.5) -- true

STDINを使用して少なくとも10バイトを食べることができると思います。
リーキー修道女

0

Lua、68 * .9 = 61.2バイト

s=arg[1]print(s:find("^[%a_][%w_]*$")and(s:find("^_")and.5or 1)or 0)

コマンドラインで引数を取る

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.