การค้นหาคุณค่าของคำศัพท์!


13

บทนำ

ในดินแดนของ [ใส่ชื่อที่น่าสนใจที่นี่] ผู้คนไม่ซื้อของด้วยเงินเพราะทุกคนมีอาการแพ้กระดาษอย่างรุนแรง พวกเขาจ่ายให้แต่ละคนด้วยคำพูด! แต่นั่นเป็นอย่างไร พวกมันให้ค่าตัวอักษรแต่ละตัว:

a=1,b=2,c=3,etc. 

(พร้อมกฎพิเศษอื่น ๆ ที่จะอธิบายในภายหลัง)

ในการท้าทายนี้งานของคุณคือการคำนวณค่าของประโยค

ท้าทาย

คุณจะรับอินพุตซึ่งจะเป็นประโยค คุณอาจสันนิษฐานว่าอินพุตไม่มีบรรทัดใหม่หรือช่องว่างต่อท้าย ความท้าทายคือการคำนวณมูลค่าของประโยคโดยใช้กฎเหล่านี้:

a=1,b=2,c=3,etc.  
  • อักษรตัวใหญ่มีค่า 1.5 เท่าเป็นอักษรตัวพิมพ์เล็กที่สอดคล้องกัน

H=h*1.5

ดังนั้นคำว่า

cab

จะคุ้มค่า c+a+b = 3+1+2 = 6

แต่คำที่Cabมีตัวอักษร c จะคุ้มค่า(c*1.5)+a+b = 4.5+1+2 = 7.5 ดังนั้นถ้าโปรแกรมที่คุณป้อนคือ "Cab" โปรแกรมของคุณจะให้ผลลัพธ์ 7.5

  • อักขระที่ไม่ใช่ตัวอักษรทั้งหมดมีค่า 1

นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุดจึงจะชนะ โชคดี!


4
เดี๋ยวก่อนเงินเป็นกระดาษ? ฉันมักจะคิดว่ามันเป็นแผ่นโลหะมันวาวหรือเวทมนตร์ที่ถูกเรียกโดยการรูดบัตรศักดิ์สิทธิ์
Geobits

2
แม้แต่ธนบัตรของสหรัฐฯก็ทำมาจากผ้าฝ้ายและผ้าลินิน ... แต่ฉันเดาว่าคนที่ [ใส่ชื่อเท่ ๆ นี่] ยังไม่ได้คิด
jcai

อนุญาตเลขศูนย์ต่อท้ายหรือไม่ เช่นการพิมพ์7.0แทน7?
kirbyfan64sos

@ kirbyfan64sos อนุญาต 0s ที่ตามมา
นิโก้

แล้วช่องว่างล่ะ
juniorRubyist

คำตอบ:


13

Python 3, 71 65 61 ไบต์

lambda z:sum((ord(s)*1.5**(s<'_')-96)**s.isalpha()for s in z)

โดยบังเอิญเป็นพิเศษ(ord(s)-64)*1.5เท่ากับord(s)*1.5-96เราจึงต้องเขียน-96เพียงครั้งเดียว ที่เหลือค่อนข้างตรงไปตรงมา

แก้ไข: ลบบาง bytes โดยใช้ shenanigans การยกกำลัง


5

Python 2, 120 102 ไบต์

แก้ไข:

e=raw_input()
print sum([ord(l)-96for l in e if not l.isupper()]+[1.5*ord(l)-96for l in e if l.isupper()])

การส่งครั้งแรกไม่ใช่เรื่องกอล์ฟ แต่ต้องเริ่มต้นที่ไหนสักแห่ง

def s2(p):
 c=0
 for l in p:
  if l.isupper():
   c+=(ord(l.lower())-96)*1.5
  else:
   c+=ord(l)-96
 return c
print s(raw_input())

ยินดีต้อนรับสู่การเขียนโปรแกรมปริศนาและรหัสกอล์ฟ! โพสต์นี้มีเคล็ดลับในการตีกอล์ฟใน Python ที่อาจช่วยให้คุณได้คะแนนดีขึ้น คุณสามารถเริ่มต้นด้วยการลดจำนวนของพื้นที่ว่าง
Alex A.

ในความเข้าใจในรายการที่สองของคุณทำไมไม่เปลี่ยน (ord (l.lower ()) - 96) * 1.5 ด้วย 1.5 * ord (l) -96 คุณรู้ว่า l อยู่ด้านบนดังนั้นเพียงแค่ทำงานกับมันและคูณออกเพื่อลบ parens (64 * 1.5 = 96)
ไม้บรรทัด 501

นอกจากนี้คุณยังสามารถลบช่องว่างระหว่าง paren ปิดและforในความเข้าใจ
Alex A.

หากฉันไม่เข้าใจผิดคุณสามารถทำให้สั้นลงได้โดยการทำให้แลมบ์ดาeเป็นพารามิเตอร์ที่ส่งคืนผลลัพธ์
Alex A.

ใน "ความเข้าใจ" อย่างใดอย่างหนึ่ง?
Baart

5

Pyth, 23 20 ไบต์

sm|*hxGrdZ|}dG1.5 1z

กรณีสาธิตและการทดสอบสด

คำอธิบาย

 m                 z    For each input character
    hxGrdZ              Get the value of it's lowercase form, or 0 for non-alphabetic characters
   *      |}dG1.5       Multiply it by 1 if it's lowercase, 1.5 if uppercase
  |               1     If it's still zero, it's a non-alphabetic character, so use 1 as its value
s                       Sum of all the values

มีการใช้โฆษณา booleans เป็นจำนวนเต็มในที่นี้

รุ่น 23 ไบต์:

sm+*hxGJrdZ|}dG1.5!}JGz

กรณีสาธิตและการทดสอบสด


สิ่งนี้ให้ผลที่ผิดสำหรับ.(อักขระที่ไม่ใช่ตัวอักษรทั้งหมดควรมีค่าเท่ากับ 1)
ลินน์

1
@Mauris แก้ไข !!
kirbyfan64sos

4

Julia, 63 ไบต์

s->sum(c->isalpha(c)?(64<c<91?1.5:1)*(c-(64<c<91?'@':'`')):1,s)

นี่เป็นเพียงผลรวมของอาร์เรย์ที่สร้างผ่านความเข้าใจที่วนรอบอักขระในสตริงอินพุตและดำเนินการทางคณิตศาสตร์บน codepoint ของพวกเขา

Ungolfed:

function char_score(c::Char)
    (64 < c < 91 ? 1.5 : 1) * (c - (64 < c < 91 ? '@' : '`')) : 1
end

function sentence_value(s::String)
    sum(char_score, s)
end

ขอบคุณ Glen O สำหรับการแก้ไขวิธีการ


2

ติดอยู่ , 85 43 ไบต์

ใช่ฉันรู้แล้ว Python สั้นกว่า .. : Pฉันใช้ตรรกะแบบเดียวกับ Tryth ตอนนี้เป็นส่วนใหญ่

s_"str.isalpha"fgl;l-|0Gc"_91<1.5;^*96-":++

คำอธิบาย:

s_                                            # Take input & duplicate
  "str.isalpha"fg                             # Filter for only alpha chars, save
                 l;l-|                        # Determine number of symbols in start string
                      0Gc                     # Get saved string, convert to char array
                         "_91<1.5;^*96-":     # Logic to find score for each letter
                                         ++   # Sum the list of nums, add to # of symbols


1

CJam, 30 ไบต์

q:i91,64fm1.5f*32,5f-+1fe>f=:+

มันทำงานอย่างไร (ว้าวฉันไม่เคยทำหนึ่งในนั้นเลย):

   91,64fm1.5f*32,5f-+1fe>      Construct an array so that a[i] == score for chr(i)
q:i                             Read STDIN and convert to ASCII codes
                          f=    Index each from the array
                            :+  Sum the result

1

F #, 168 ไบต์

ยังไม่ได้เล่นกอล์ฟจริงๆ แต่เป็นการเริ่มต้น:

fun(w:string)->w|>Seq.map(fun c->if Char.IsLetter c then (if Char.IsUpper(c) then (float)(Math.Abs(64-(int)c))*1.5 else (float)(Math.Abs(96-(int)c))) else 1.0)|>Seq.sum

นี่เป็นรุ่นที่อ่านเพิ่มเติมได้:

let calc (w : string) =
    w
    |> Seq.map (fun c -> if Char.IsLetter c then (if Char.IsUpper(c) then (float)(Math.Abs(64 - (int)c)) * 1.5 else (float)(Math.Abs (96 - (int)c))) else 1.0)
    |> Seq.sum

1

K, 30

+/1^(,/1 1.5*(.Q`a`A)!\:1+!26)

.

k)+/1^(,/1 1.5*(.Q`a`A)!\:1+!26)"Programming Puzzles & Code Golf"
349f

มันทำงานอย่างไร:

.Q`a`A สร้างรายการที่สองของตัวพิมพ์เล็กและตัวพิมพ์ใหญ่

k).Q`a`A
"abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"

!:1+til 26แมปตัวอักษรแต่ละตัวในแต่ละรายการจาก 1 ถึง 26

k)(.Q`a`A)!\:1+!26
"abcdefghijklmnopqrstuvwxyz"!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

คูณรายชื่อแรกด้วย 1 สุดท้าย 1.5

k)1 1.5*(.Q`a`A)!\:1+!26
"abcdefghijklmnopqrstuvwxyz"!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26f
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"!1.5 3 4.5 6 7.5 9 10.5 12 13.5 15 16.5 18 19.5 21 22.5 24 25.5 27 28.5 30 31.5 33 34.5 36 37.5 39

ทำลายเป็นพจนานุกรมเดียวโดยใช้ ,/

k)(,/1 1.5*(.Q`a`A)!\:1+!26)
a| 1
b| 2
c| 3
d| 4
..

แม็พอักขระในสตริงอินพุตเข้ากับคะแนนที่เกี่ยวข้อง

k)(,/1 1.5*(.Q`a`A)!\:1+!26)"Programming Puzzles & Code Golf"
24 18 15 7 18 1 13 13 9 14 7 0n 24 21 26 26 12 5 19 0n 0n 0n 4.5 15 4 5 0n 10.5 15 12 6

เติมค่า Null ด้วย 1

k)1^(,/1 1.5*(.Q`a`A)!\:1+!26)"Programming Puzzles & Code Golf"
24 18 15 7 18 1 13 13 9 14 7 1 24 21 26 26 12 5 19 1 1 1 4.5 15 4 5 1 10.5 15 12 6

รวม

k)+/1^(,/1 1.5*(.Q`a`A)!\:1+!26)"Programming Puzzles & Code Golf"
349f

1

JavaScript, 121 ไบต์

l=process.argv[2].split(""),r=0;for(k in l)c=l[k],o=c.toLowerCase(),r+=(o.charCodeAt(0)-96)*(o===c?1:1.5);console.log(r);

เรียกไฟล์ js พร้อมโหนด (node ​​index.js "Cab")


1

MATLAB, 68 ไบต์

สิ่งนี้ใช้ประโยชน์จากข้อเท็จจริงที่ว่าตัวละครนั้นถูกส่งไปเป็นจำนวนเต็มโดยอัตโนมัติและค่าบูลีนนั้นสามารถรวมเป็นจำนวนเต็มได้

sum([t(t>96&t<132)-96,(t(t>64&t<91)-64)*1.5,t<65|(t>90&t<97)|t>122])


1

Javascript (ES6), 85 82 80 67 ไบต์

ฉันชอบความท้าทายที่ง่ายและรวดเร็วเช่นนี้ :)

t=>[...t].map(c=>u+=(v=parseInt(c,36)-9)>0?v*(c>'Z'||1.5):1,u=0)&&u

มันทำงานได้โดยการตีความตัวอักษรแต่ละตัวเป็นตัวเลขฐาน -36 คูณมันด้วย 1 หรือ 1.5 ถ้ามันมากกว่า 9 ( a-zหรือA-Z) และให้ 1 แทนถ้าไม่ใช่ เช่นเคยข้อเสนอแนะยินดีต้อนรับ!


1
0 ใน charCodeAt นั้นจำเป็นสำหรับบอท
Downgoat

@vihan ไม่ทราบว่า; ขอบคุณสำหรับทิป!
ETHproductions

ทำไมไม่ใช้toString(36)
l4m2

@ l4m2 ฉันไม่แน่ใจว่า.toString(36)จะใช้งานที่นี่ได้อย่างไร คุณหมายถึงบางอย่างเช่นparseInt(c,36)? ที่จริงแล้วอาจสั้นกว่านี้ ...
ผลิตภัณฑ์ ETH

คุณสามารถบันทึกบางไบต์โดยจะเรียกซ้ำและใช้ 2/3 เมื่อ parseInt ส่งคืน NaN: ([c,...t])=>c?(parseInt(c,36)-9||2/3)*(c>'Z'||1.5)+f(t):0
Rick Hitchcock



0

PHP, 102 ไบต์

foreach(str_split($argv[1])as$c){$v=ord($c)-64;$s+=A<=$c&&$c<=Z?1.5*$v:(a<=$c&&$c<=z?$v-32:1);}echo$s;

ตัวอย่างการใช้งาน:

$ php -d error_reporting=0 value.php cab
6
$ php -d error_reporting=0 value.php Cab
7.5
$ php -d error_reporting=0 value.php 'Programming Puzzles & Code Golf'
349

ไม่มีอะไรพิเศษในอัลกอริทึม อักขระแต่ละตัวจากอาร์กิวเมนต์ของโปรแกรมแรก ( $argv[1]) จะถูกตรวจสอบกับAและZจากนั้นaและzและนับตาม


0

PowerShell, 108 ไบต์

การแข่งขันที่เหมาะสมฉันรู้สึกประหลาดใจ ไม่โทรมเกินไปเพราะไม่มีผู้ประกอบการ Ternary ขนาดกะทัดรัด

รหัส:

$a=[char[]]$args[0];$a|%{$b=$_-64;If($b-in(1..26)){$c+=$b*1.5}ElseIf($b-in(33..58)){$c+=$b-32}Else{$c++}};$c

อธิบาย:

$a=[char[]]$args[0]                # Take command-line input, cast as char array
$a|%{                              # For each letter in the array
  $b=$_-64                         # Set $b as the int value of the letter (implicit casting), minus offset
  If($b-in(1..26)){$c+=$b*1.5}     # If it's a capital, multiply by 1.5.
                         # Note that $c implicitly starts at 0 the first time through
  ElseIf($b-in(33..58)){$c+=$b-32} # Not a capital
  Else{$c++}                       # Not a letter
  }
$c                                 # Print out the sum

0

C, 85 ไบต์

float f(char*s){return(*s-96)*!!islower(*s)+1.5*(*s-64)*!!isupper(*s)+(*++s?f(s):0);}

!!ก่อนislowerและisupperมีความจำเป็นเพราะค่าบูลีนกลับโดยฟังก์ชั่นเหล่านี้จะไม่รับประกันว่าจะ0และ1มูลค่าที่แท้จริง1024ในระบบของฉันแน่นอน!


0

ขนมหวาน , 26 22 ไบต์

(~ "เป็น" <{A # 64-2 / ​​3 * | A # 96} เอช) Z

ขอบคุณ @Tryth สำหรับเคล็ดลับการแยกตัวประกอบ!

(~"a"<{A2/3*|A}#96-h)Z

การเรียกใช้อยู่กับแฟล็ก -I เช่นเดียวกับใน candy -I "Cab" -e $prg

รหัสในรูปแบบยาวคือ:

while     # loop while able to consume characters from stack
  peekA   # A gets stack to
  "a"
  less    # is pop() < "a"
  if
    pushA   # capitalized
    digit2
    div
    digit3
    mult
  else
    pushA   # lower case
  endif
  number
  digit9
  digit6
  sub
  popAddZ   # add pop() to counter register Z
endwhile
pushZ       # push Z onto stack as answer

0

Prolog (SWI) 101 ไบต์

รหัส:

X*Y:-X>64,X<91,Y is X*1.5-96;X>96,X<123,Y is X-96.
_*1.
p(L):-maplist(*,L,A),sumlist(A,B),write(B).

อธิบาย:

X*Y:-X>64,X<91,       % When X is upper case
     Y is X*1.5-96    %      Y is 1.5 times charvalue starting at 1
     ;X>96,X<123,     % OR when X is lower case
     Y is X-96.       %      Y is charvalue starting at 1
_*1.                  % ELSE Y is 1
p(L):-maplist(*,L,A), % Get list of charvalues for all chars in string
      sumlist(A,B),   % Take sum of list
      write(B).       % Print

ตัวอย่าง:

p(`Cab`).
7.5

0

PHP, 75 ไบต์

while(~$c=$argn[$i++])$r+=ctype_alpha($c)?ord($c)%32*(1+($c<a)/2):1;echo$r;

ทำงานเป็นท่อที่มี-nrหรือลองออนไลน์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.