Kelimelerin Değerini Bulmak!


13

Giriş

[Buraya havalı bir isim girin] ülkesinde insanlar para ile bir şeyler satın almazlar, çünkü herkesin kağıda ciddi bir alerjisi vardır. Birbirleriyle kelimeler öderler! Ama bu nasıl? Her harf numarası değerini veriyorlar:

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

(Daha sonra açıklanacak bazı özel kurallarla)

Bu meydan okumada, göreviniz cümlelerin değerini hesaplamak olacaktır.

Meydan okuma

Bir cümle olacak bir girdi alacaksınız. Girdinin yeni satırları veya sondaki boşlukları olmadığını varsayabilirsiniz. Zorluk şu kuralları kullanarak cümlenin değerini hesaplamak olacaktır:

a=1,b=2,c=3,etc.  
  • Büyük harf karşılık gelen küçük harfin 1,5 katı değerindedir

H=h*1.5

Yani, kelime

cab

Yapmaya değer c+a+b = 3+1+2 = 6

Ama Cabbüyük c ile kelime değer olurdu (c*1.5)+a+b = 4.5+1+2 = 7.5 Yani program girişiniz "Kabin" olsaydı programınız 7.5 çıktı

  • Alfabetik olmayan tüm karakterler 1 değerindedir.

Bu kod golf, bayt en kısa cevap kazanır. İyi şanslar!


4
Bekle, para kağıt mı ?? Her zaman ya parlak metal diskler ya da kutsal kartı kaydırarak bir tür sihir olduğunu düşündüm.
Geobits

2
ABD banknotları bile aslında pamuk ve keten yapılmış ... ama sanırım [Buraya serin isim girin] insanlar henüz düşünmemişti.
jcai

Sondaki sıfırlara izin veriliyor mu? Örneğin, baskı 7.0yerine 7?
kirbyfan64sos

@ kirbyfan64sos Sondaki 0'lara izin verilir.
Nico A

Alanlar ne olacak?
juniorRubyist

Yanıtlar:


13

Python 3, 71 65 61 bayt

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

Olağanüstü bir tesadüfle (ord(s)-64)*1.5eşittir ord(s)*1.5-96, bu yüzden sadece bir -96kez yazmak zorundayız . Gerisi oldukça düz.

Edit: Exponentiation shenanigans kullanarak bazı baytlar traş.


5

Piton 2, 120 102 bayt

Düzenle:

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()])

İlk teslim, çok golfy değil ama bir yerden başlamak zorunda.

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())

Programlama Bulmacaları ve Kod Golf hoş geldiniz! Bu yazı , puanınızı daha iyi bulmanıza yardımcı olabilecek Python'da kod golfü için bazı ipuçları içerir. Boşluk miktarını azaltarak başlayabilirsiniz.
Alex

İkinci liste kavrayışınızda neden (ord (l.lower ()) - 96) * 1.5'i 1.5 * ord (l) -96 ile değiştirmeyin. L'nin üst olduğunu biliyorsunuz, sadece bununla çalışın ve parensleri çıkarmak için çarpın (64 * 1.5 = 96).
ruler501

Ayrıca kapanış alanı forve kavramalar arasındaki boşluğu da kaldırabilirsiniz .
Alex

Yanılmıyorsam, esonucu döndüren bir parametre olarak lambda yaparak bunu daha da kısaltabilirsiniz .
Alex A.

"Anlayış" bir?
Baart

5

Pyth, 23 20 bayt

sm|*hxGrdZ|}dG1.5 1z

Canlı demo ve test senaryoları.

açıklama

 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

Burada tam sayı olarak booleans değerlerinin birkaç yaratıcı kullanımı.

23 baytlık sürüm:

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

Canlı demo ve test senaryoları.


Bu, .(alfabetik olmayan tüm karakterler 1 değerinde olmalıdır) için yanlış bir şey
Lynn

1
@Mauris Sabit !!
kirbyfan64sos

4

Julia, 63 bayt

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

Bu, yalnızca giriş dizesindeki karakterlerin üzerinden geçen ve kod noktalarında aritmetik gerçekleştiren bir anlama yoluyla oluşturulan bir diziyi toplar.

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

Yaklaşımı düzelttiği için Glen O'ya teşekkürler.


2

Sıkışmış , 85 43 Bayt

Evet, biliyorum, Python daha kısa ..: P Çoğunlukla Tryth ile aynı mantığı kullanıyorum.

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

Açıklama:

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

Python 2, 101 bayt

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 bayt

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

Bu nasıl çalışır (vay, bunlardan hiç yapmadım!):

   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 bayt

Henüz golf oynamadı, ama bir başlangıç:

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

İşte daha okunabilir bir sürüm:

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

Nasıl çalışır:

.Q`a`A iki küçük ve büyük harf listesi oluşturur

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

!:1+til 26her listedeki her harfi 1'den 26'ya eşler

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

İlk listeyi 1, son listeyi 1,5 ile çarpın

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

Kullanarak tek bir sözlüğe girin ,/

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

Giriş dizesindeki karakterleri ilgili puanlarla eşleştirin

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

Boş değerleri 1 ile doldurun

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

toplam

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

1

JavaScript, 121 bayt

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);

düğümü ile js dosyasını çağırın (düğüm index.js "Cab")


1

MATLAB, 68 bayt

Bu, karakterlerin otomatik olarak tamsayılara dökülmesinden ve boole değerlerinin tamsayı olarak toplanabilmesinden yararlanır.

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 bayt

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

Üzerinde test edildi v5.20.2.


1

Javascript (ES6), 85 82 80 67 bayt

Bunun gibi hızlı ve kolay zorlukları seviyorum. :)

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

Bu, her bir karakteri temel 36 sayısı olarak yorumlayarak, 9'dan ( a-zveya A-Z) büyükse 1 veya 1.5 ile çarparak ve değilse 1 yerine verir. Her zaman olduğu gibi, öneriler hoş geldiniz!


1
CharCodeAt içindeki 0 bot gereklidir
Downgoat

@vihan Bunu bilmiyordum; Bahşiş için teşekkürler!
ETHproductions

neden kullanmıyorsunuztoString(36)
l4m2

@ l4m2 .toString(36)Burada nasıl uygulanacağından emin değilim . Böyle bir şey mi demek istiyorsun parseInt(c,36)? Aslında, bu daha kısa olabilir ...
ETHproductions

ParseInt NaN döndürdüğünde özyinelemeli ve 2/3 kullanarak bazı baytlar kaydedebilirsiniz: ([c,...t])=>c?(parseInt(c,36)-9||2/3)*(c>'Z'||1.5)+f(t):0
Rick Hitchcock

0

Python 3: 86 85 Bayt

t=0
for c in input():k=ord(c)-64;t+=k*1.5if 0<k<27else k-32if 32<k<59else 1
print(t)

0

C # 81 Bayt

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

(LinqPad) ile arayın:

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

0

PHP, 102 bayt

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;

Kullanım örneği:

$ 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

Algoritmada özel bir şey yok. İlk program argüman her karakter ( $argv[1]) karşı kontrol edilir Ave Zdaha sonra ave zve buna göre sayılmıştır.


0

PowerShell, 108 Bayt

Oldukça rekabetçi, biraz şaşırdım. Kompakt bir Üçlü operatöre sahip olmadığı için çok perişan değil.

Kod:

$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çıklaması:

$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 bayt

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

!!Önce islowerve isupperbu fonksiyonların tarafından döndürülen boole değerleri olması garanti verilmediği için, gerekli olan 0ve 1gerçek değeri oldu, 1024gerçekten sistemimde!


0

Şeker , 26 22 bayt

(~ "A" <{A # 64-2 / ​​3 * | A # 96-} h) Z

@ Çarpanlara ayırma hilesi için teşekkürler!

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

Çağrı, -I bayrağıyla olduğu gibi, candy -I "Cab" -e $prg

Uzun biçimdeki kod:

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 bayt

Kod:

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).

Açıklaması:

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

Misal:

p(`Cab`).
7.5

0

PHP, 75 bayt

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

Pipo ile çalıştırın -nrveya çevrimiçi deneyin .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.