นี่เป็นชื่อตัวแปรที่ถูกต้องหรือไม่?


23

วัตถุประสงค์

เขียนโปรแกรมหรือฟังก์ชั่นที่ตรวจสอบว่าชื่อตัวแปรนั้นถูกต้องและเอาท์พุท 1 หรือTrueถ้ามันถูกต้อง 0.5 ถ้ามันถูกต้อง แต่เริ่มต้นด้วยขีดล่าง (_) และ 0 หรือFalseถ้ามันไม่ถูกต้อง

กฎระเบียบ

  • ชื่อตัวแปรในภาษาส่วนใหญ่จะใช้ได้หากเริ่มต้นด้วยเครื่องหมายขีดล่างหรือตัวอักษร (az, AZ, _) และอักขระที่เหลือเป็นตัวอักษรขีดล่างตัวอักษรหรือตัวเลข (az, AZ, 0-9, _)
  • เอาท์พุท 1 หรือTrueถ้าชื่อตัวแปรนั้นถูกต้องและ 0 หรือFalseถ้าไม่ถูกต้อง
  • อย่างไรก็ตามการเริ่มต้นตัวแปรด้วยเครื่องหมายขีดล่างไม่ใช่วิธีที่ดีดังนั้นให้ส่งคืน 0.5 หากเริ่มต้นด้วยเครื่องหมายขีดล่างและชื่อนั้นถูกต้อง

กรณีทดสอบ

อินพุต

abcdefghijklmnop

เอาท์พุต

1

อินพุต

_test_

เอาท์พุต

0.5 (เริ่มต้นด้วยเครื่องหมายขีดล่าง)

อินพุต

123abc

เอาท์พุต

0 (เริ่มต้นด้วยตัวเลข)

อินพุต

A_b1C_23

เอาท์พุต

1

อินพุต

_!

เอาท์พุต

0 (ไม่ใช่ 0.5 เพราะไม่ถูกต้อง)

อินพุต

magical pony1

เอาท์พุต

0 (ไม่มีช่องว่าง)

ช่องโหว่มาตรฐานใช้

นี่คือดังนั้นรหัสที่สั้นที่สุดจึงชนะ

โบนัส: -10% ถ้าโปรแกรม / ฟังก์ชั่นของคุณแสดงผล0เป็นสตริงว่างเปล่า ( "")


1
เราสามารถส่งออกความจริง / เท็จ / อะไร?
CalculatorFeline

5
เพียงสังเกตในหลามภายใต้คะแนนมักจะใช้ คลาสจำเป็นต้องมีฟังก์ชั่นinitบางครั้งฟังก์ชันตัวช่วยในคลาสบางครั้งก็เริ่มด้วยเครื่องหมายขีดล่าง
Rɪᴋᴇʀ

1
@EasterlyIrk ระวัง mini-markdown; คุณหมายถึง__init__; ยังไม่มีชั้นเรียนไม่จำเป็นต้องมี__init__แต่มักจะมีหนึ่ง
แมว

6
เราสามารถสมมติว่าอินพุตจะไม่ว่างเปล่าได้หรือไม่? (คำตอบปัจจุบันส่วนใหญ่ดูเหมือนจะล้มเหลวสำหรับการป้อนข้อมูลที่ว่างเปล่า)
เดนนิส

1
โบนัสนั้นปัดขึ้นหรือลง? ถ้าไม่เป็นเช่นนั้นมันก็ไม่คุ้มที่จะได้คำตอบชุดปัจจุบัน
Blue

คำตอบ:


13

JavaScript (ES6), 37 - 10% = 33.3 ไบต์

บันทึกแล้ว 4 ไบต์ขอบคุณ @ edc65

บันทึก 5.6 ไบต์ด้วย @Mateon

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

3
คุณแน่ใจหรือไม่ว่านี่ไม่ใช่ perl?
seequ

8

05AB1E , 25 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ใน pseudocode คือ:

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

ลองออนไลน์!

ใช้การเข้ารหัสCP-1252


6

PHP (50 - 10% = 45)

ขอบคุณ Schism สำหรับ -2 :)

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ตัวแก้ไขให้\wเลือกเฉพาะตัวอักษร ASCII เท่านั้น ในภาษาอื่น ๆ / รสชาติ Regex รูปแบบนี้จะไม่ทำงาน

แก้ไข : ฉันเห็นคนจำนวนมากที่ใช้ \ w และ \ d ในคำตอบของพวกเขาเมื่อพวกเขาใช้ภาษาที่มีตัวอักษรและตัวเลขที่ไม่ใช่ ASCII ด้วย นั่นไม่ใช่ปริศนา พวกเขาผิด (ยังไม่สามารถลงคะแนน / แสดงความคิดเห็นได้ขออภัยต้องบอกด้วยวิธีนี้)


ยินดีต้อนรับสู่การเขียนโปรแกรมปริศนาและการแลกเปลี่ยนรหัสกองกอล์ฟ นี่คือคำตอบที่ดี บ่อยครั้งที่ความท้าทายของรหัส - กอล์ฟอยู่ในภาษาเช่นเดียวกับระหว่างพวกเขา ฉันให้ +1 สำหรับวิธีการแก้ปัญหานี้กับคุณ! ทำได้ดี.
wizzwizz4

1
[a-z].../iคุณสามารถโกนตัวละครทั้งสองด้วย
Schism

@Schism ขอบคุณ ไม่ทราบวิธีที่ฉันจัดการที่จะลืมว่ามักจะฉันดีที่ชนิดเหล่านี้ของจิ๊กซอ regex :)
Xesau

1
เกี่ยวกับการแก้ไขของคุณ: คุณสามารถเจาะจงมากขึ้น - ภาษาอะไรได้บ้าง ใน JavaScript เป็นเหมือนกับ\d เป็นอย่างแน่นอนเหมือนกันกับdeveloper.mozilla.org/en-US/docs/Web/JavaScript/Guide/…[0-9]\w[A-Za-z0-9_]
edc65

หน้ารหัสที่ภาษาใช้นั้นไม่เกี่ยวข้อง ตราบใดที่ regex จัดการ ASCII ได้อย่างถูกต้องมันก็ใช้ได้ คำตอบจาก regex ปัจจุบันทั้งหมดทำงานเพื่อความรู้ของฉัน คุณไม่ได้พยายามจับคู่ชื่อตัวแปรในภาษาของคุณ ค่อนข้างคุณกำลังพยายามจับคู่ชื่อตัวแปรตามกฎในการท้าทาย
Mego

5

เรติน่า30 - 10% = 27 28 - 10% = 25.2 29 - 10% = 26.1 ไบต์

ทั้งสองรุ่นมีคุณสมบัติรับโบนัสเนื่องจากมีการจัดการอินพุตว่างอย่างถูกต้อง (เอาต์พุต0)

ฉันต้องแก้ไขข้อผิดพลาดที่เกิดจากหนึ่งในคุณสมบัติของ. NET regex ซึ่งพิจารณาอักขระ Unicode บางตัว (อ่านได้มาก) เป็นตัวอักษร "word" โชคดีที่ค่าใช้จ่ายฉันเพียงไบต์เดียวในทั้งสองรุ่น มีเพียงการเพิ่มตัวแก้ไขเพื่อให้พฤติกรรมการจับคู่ regex ตรงตามมาตรฐาน ECMAScript เท่านั้น เพิ่มเติมเกี่ยวกับที่นี่

ใหม่28รุ่น 29 ไบต์ทำโดย @ MartinBüttner ขอบคุณ!

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

คำอธิบาย

ก่อนอื่นเราตรวจสอบว่าอินพุตเริ่มต้นด้วยการขีดเส้นใต้หรือไม่ หากเป็นเช่นนั้นอินพุตจะถูกทำซ้ำโดยมีการขึ้นบรรทัดใหม่ในระหว่าง ตัวอย่างเช่น: _test_-> _test_\n_test_ซึ่ง\nเป็นบรรทัดใหม่ จากนั้นเราก็พยายามให้ตรงกับสิ่งใดที่ไม่ได้เริ่มต้นด้วยตัวเลข แต่จะตามด้วยหมายเลขใด ๆ ของตัวละคร "คำ" ( a-z, A-Zตัวเลขและขีดล่าง) ในแต่ละบรรทัด โปรดทราบว่าหากอินพุตเริ่มต้นด้วยขีดล่างและถูกแทนที่เป็นสองบรรทัดสิ่งนี้จะจับคู่ทั้งสองบรรทัด จากนั้นเราจะตรวจสอบถ้าเรามี 2 0.5ขีดและแทนที่พวกเขาด้วย บรรทัดว่างหรือไม่ถูกต้องจะให้ผลการแข่งขัน 0 เสมอและชื่อตัวแปรที่ถูกต้องจะให้ผลเสมอ 1 รายการ


รุ่น30 31 ไบต์ของฉันเอง

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

คำอธิบาย

ครั้งแรกของทั้งหมดที่เราตรวจสอบถ้าใส่เริ่มต้นด้วยหลักหรือมีอักขระที่ไม่ใช่คำ (สิ่งอื่นที่ไม่ใช่a-z, A-Zตัวเลขและขีดเส้นใต้) ถ้าเป็นเช่นนั้นมันจะถูกทิ้งเพราะมันไม่ถูกต้อง จากนั้นเราตรวจสอบว่ามันเริ่มต้นด้วยการขีดเส้นใต้ 0.5ถ้าไม่ก็ถูกแทนที่ด้วย จากนั้นเราจะตรวจสอบถ้ามันเริ่มต้นด้วยตัวอักษรที่ไม่ใช่หลัก (ที่จุดนี้ตัวอักษรตัวแรกเป็นอย่างใดอย่างหนึ่ง0, a-zหรือA-Z. เท่านั้นa-zและA-Zไม่ใช่ตัวเลข, ชัด) 1ถ้าไม่ก็ถูกแทนที่ด้วย 0จากนั้นเราจะตรวจสอบสำหรับสตริงที่ว่างเปล่าและแทนที่ด้วย

ลองออนไลน์!
ลองออนไลน์! เวอร์ชั่นเก่า


Waitwaitwait ที่^\D.*จุดเริ่มต้นมันสามารถเริ่มต้นด้วย 0? แปลก.
CalculatorFeline

@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

Goghขนาด 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 ไบต์สำหรับ-pสวิทช์ ลองบนIdeone


คุณมีพูด-$_||$_=...กับบัญชีสำหรับคำตอบที่ว่างเปล่า? (ใช้-เพราะ+เป็น noop ใน perl)
Ven

ไม่นั่นเป็นข้อผิดพลาดรันไทม์ แต่ถึงแม้ว่ามันจะทำงานได้ก็จะทำให้คะแนนของฉันแย่ลง
Dennis

ฉันทำการทดสอบแบบเรียบง่ายเท่านั้นดังนั้นฉันจะเชื่อใจคุณ แฟร์ว่า 10% ของ 21 ไบต์ไม่มาก ..
Ven

2

Pyth, 19 ไบต์

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

ลองทดลองกับPyth คอมไพเลอร์

โปรดทราบว่านี่จะทำงานได้อย่างถูกต้องสำหรับหน้ารหัสที่ไม่มีตัวอักษร / ตัวเลขที่ไม่ใช่ 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 ? / ]

รันบน listener (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/ _.*/กำหนดสองนิพจน์ปกติ bi-curry@ใช้ใบเสนอราคาบางส่วนกับ[ matches? 1 0 ? ]แต่ละ regex โดยเหลือสองใบเสนอราคา curried บนสแต็ก biใช้แต่ละอัญประกาศกับสตริงของอาร์กิวเมนต์

แต่ละรายการ (ใบเสนอราคา curated) ปล่อยให้ 1 หรือ 0 ขึ้นอยู่กับว่าพวกเขาจับคู่ การแข่งขันครั้งแรกในชื่อที่มีรูปแบบที่ดีชื่อที่สองในชื่อที่ขึ้นต้นด้วยขีดล่าง

0 = 1 2 ? / ค่าสุดท้ายจะถูกแทนที่ด้วย 1 หากเป็น 0 หรือเป็น 2 หากเป็น 1 จากนั้นค่าแรก (1 หรือ 0 ที่ถูกต้องหรือไม่) จะถูกหารด้วยตัวที่สอง (2 หรือ 1 เริ่มต้นด้วยขีดล่างหรือไม่) .

นี่คือ loooong! พอยน์เตอร์ใด ๆ ที่จะลดขนาดชื่นชมมากขึ้น ...

และฉันเกลียด regexps!

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

ผ่านการทดสอบทั้งหมด)


แค่สงสัยว่าช่องว่างจำเป็นจริงๆหรือไม่? ฉันไม่สามารถพูดได้อย่างแน่นอนเพราะฉันไม่รู้ภาษาหรือมีล่าม
Mama Fun Roll

@MamaFunRoll ใช่ไม่ใช่ภาษากอล์ฟที่ดีที่สุด! ในประเพณีที่มาตัวคั่นเท่านั้นเป็นตัวอักษรช่องว่าง
fede s

อ้อเข้าใจแล้ว. ที่นี่มี upvote
Mama Fun Roll

เย้! ตอนนี้ทำลายความเสียหายด้วยความคิดเห็นส่วนตัวของฉันได้ทุกที่!
fede s

2

Dyalog APL , 19 ไบต์ - 10% = 17.1

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

{... ... }ฟังก์ชั่นที่ไม่ระบุชื่อที่โต้แย้งสิทธิเป็นตัวแทนจาก
⊃⍵ตัวอักษรตัวแรก (ให้พื้นที่ถ้าว่างเปล่า)
'_'=1 ถ้าเท่ากับ 'underbar, 0 มิฉะนั้น
1+จะประเมินถึง 2 ถ้า underbar เริ่มต้น 1 มิฉะนั้น
⎕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+ดูเหมือนว่าจะทำงานได้ดีกับ
สปาเก็ตตี้

ตรงกับเท็จสำหรับa
Downgoat

@Downgoat Ah ใช่ ฉันเห็น.
สปาเก็ตตี้


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

คำตอบ Perl ของพอร์ตของ @ Dennis


0

Ruby, 44 ไบต์

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

คุณไม่จำเป็นต้อง parens รอบ ๆ พารามิเตอร์สำหรับ stambby lambdas
ไม่ใช่ Charles

นอกจากนี้หากคุณสามารถหาวิธีที่จะลดจำนวนไตรภาคที่คุณอาจบันทึกไบต์ อาจจะ/^([a-z_]).../iแทนที่จะเป็น/^(_|\d)?.../
ไม่ใช่ว่า Charles

@NotthatCharles D'oh ... คุณพูดถูก ฉันจะให้มันดูใกล้ขึ้นเมื่อฉันมีโอกาส
Flambino

0

Ruby, 57 - 10% = 51.3 ไบต์

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

วิธีการที่ไร้เดียงสาสวย


51.3 ไบต์โปรดทราบ :)
Xesau

@ Xesau อ้าว - น่าอาย แก้ไขแล้ว :)
Flambino

คุณบันทึกไบต์จำนวนมากถ้าคุณใช้การเชื่อมโยงแบบไตรภาค:->(s){s=~/^$|^\d|\W/?0:s=~/^_/?0.5:1}
หมึกมูลค่า

@KevinLau True - ฉันได้เพิ่มคำตอบทับทิมอีกในหลอดเลือดดำที่แล้ว (แม้ว่ามันจะไม่ได้ดีอย่างใดอย่างหนึ่ง)
Flambino

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 ไบต์
Leun Nun

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.