Пошук значення слів!


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
Зачекайте, гроші - це папір ?? Я завжди думав, що це або блискучі металеві диски, або якась магія, яку викликають, перетягуючи священну карту.
Геобіц

2
Навіть банкноти в США насправді виготовлені з бавовни та білизни. Але я думаю, люди [Вставити тут круте ім'я] ще не думали про це.
jcai

Чи дозволено проходження нулів? Наприклад, друк 7.0замість 7?
kirbyfan64sos

@ kirbyfan64sos Тривалі 0-х дозволені.
Ніко А

А як із просторами?
молодшийРубіїст

Відповіді:


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один раз. Решта досить прямо вперед.

Редагувати: Поголив декілька байтів, використовуючи покажчики.


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, які можуть допомогти вам покращити свій рахунок. Можна почати зі зменшення кількості пробілів.
Алекс А.

У вашому другому списку розуміння, чому б не замінити (ord (l.lower ()) - 96) * 1.5 на 1,5 * ord (l) -96. Ви знаєте, що l верхній, так що просто працюйте з цим і помножте на вилучення паронів (64 * 1,5 = 96).
vladar501

Ви також можете видалити простір між закриваючим паролем і forв розуміннях.
Олексій А.

Якщо я не помиляюся, ви можете зробити це ще коротше, просто зробивши його лямбда з eпараметром, який повертає результат.
Олексій А.

У «розумінні»?
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

Тут досить декількох креативних використань булевих значень як цілих чисел.

23-байтна версія:

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

Демонстраційні демонстраційні та тестові приклади.


Це виводить неправильну річ .( для всіх не алфавітних символів повинно бути значення 1.)
Лінн

1
@Mauris Виправлено !!
kirbyfan64sos

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 байт

Так, так, я знаю, 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

К, 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

Заповніть будь-які нульові значення 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 "Кабіна")


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

Perl 5, 77 байт

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

Випробуваний на v5.20.2.


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)? Насправді, це може бути коротше ...
ETHproductions

Ви можете зберегти кілька байт, перейшовши рекурсивно і використовуючи 2/3, коли parseInt поверне NaN: ([c,...t])=>c?(parseInt(c,36)-9||2/3)*(c>'Z'||1.5)+f(t):0
Rick Hitchcock,


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потім aі zта підраховані відповідно.


0

PowerShell, 108 байт

Гідно конкурентоспроможний, я якось здивований. Не надто пошарпаний, щоб не мати компактного термінального оператора.

Код:

$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" <{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

Пролог (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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.