단어의 가치를 찾아서!


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

후행 0이 허용됩니까? 예, 인쇄 7.0대신 7?
kirbyfan64sos

@ kirbyfan64sos 후행 0이 허용됩니다.
Nico A

공백은 어떻습니까?
juniorRubyist 2018 년

답변:


13

파이썬 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한 번만 작성 하면됩니다. 나머지는 꽤 직설적입니다.

편집 : 지수 shenanigans를 사용하여 일부 바이트를 줄였습니다.


5

파이썬 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)를 제거하십시오.
ruler501

또한 닫는 패러와 for이해력 사이의 공간을 제거 할 수 있습니다 .
Alex A.

내가 실수하지 않으면 간단히 e결과를 반환하는 매개 변수로 람다를 만들어서 더 짧게 만들 수 있습니다.
Alex A.

"이해"에서?
바트

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

여기서 부울 값을 정수로 사용하는 몇 가지 창의적인 방법이 있습니다.

23 바이트 버전 :

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

라이브 데모 및 테스트 사례.


이것은 .(알파벳이 아닌 모든 문자는 1의 가치가 있어야합니다.)
Lynn

1
@Mauris 고정 !!
kirbyfan64sos 1

4

줄리아, 63 바이트

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

이것은 단순히 입력 문자열의 문자를 반복하고 코드 포인트에서 산술을 수행하는 이해를 통해 구성된 배열을 합산합니다.

언 골프 드 :

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 바이트

그래, 나도 알아, 파이썬은 더 짧아 .

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

2

파이썬 2, 101 바이트

v=0
for x in raw_input():v+=(ord(x.lower())-96)*(1.5 if ord(x)<96 else 1)if x.isalpha()else 1
print v

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 261에서 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

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

펄 5, 77 바이트

@_=split//,$ARGV[0];$i+=(ord)*(/[a-z]/||/[A-Z]/*1.5||96/ord)-96for@_;print$i

에 테스트했습니다 v5.20.2.


1

자바 스크립트 (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

이 9보다 큰 (만약 1 또는 1.5을 곱하여, 염기 번호 36로 각각의 문자를 해석함으로써이 일 a-z이상 A-Z) 및 1을 부여하지 않고있는 경우. 언제나 그렇듯이 제안은 환영합니다!


1
charCodeAt의 0은 봇이 필요합니다
Downgoat

@vihan 몰랐어요; 팁 고마워!
ETHproductions

왜 사용하지toString(36)
l4m2

@ l4m2 어떻게 .toString(36)적용 되는지 잘 모르겠습니다 . 당신은 같은 것을 의미 parseInt(c,36)합니까? 실제로, 그것은 더 짧을 수도 있습니다 ...
ETHproductions

:에서는 parseInt가 NaN 반환 할 때 재귀를 진행하고 2/3를 사용하여 몇 바이트를 저장할 수 있습니다 ([c,...t])=>c?(parseInt(c,36)-9||2/3)*(c>'Z'||1.5)+f(t):0
릭 히치콕


0

C # 81 바이트

decimal a(string i){return i.Sum(c=>c>64&&c<91?(c-64)*1.5m:c>96&&c<123?c-96:1m);}

(LinqPad)로 전화 :

a("Hello World").Dump();

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다음 az그에 따라 계산.


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이 함수에 의해 반환 된 부울 값이 보장되지 않기 때문에, 필요 01진정한 가치가 있었다, 1024참으로 내 시스템에!


0

캔디 , 26 22 바이트

(~ "a"<{A # 64-2 / ​​3 * | A # 96-} h) 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

프롤로그 (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

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