'Додайте' літери в слово


17

Мій тато - викладач у відставці, і він використовував комбіновані вікторини з написання орфографії та математики, де учень писав слово, а потім «забивав» слово, додаючи літери, де a = 1, b = 2 тощо. (наприклад, кішка = 3 + 1 + 20 = 24). Це полегшило класифікацію вікторини, оскільки йому просто доведеться перевірити наявність неправильних «балів», а не неправильно написаних слів, і отримав додаткову перевагу тестування 2 навичок одночасно.

Він найняв мого друга, щоб він написав програму, яка б набирала слова для нього, щоб він міг генерувати тривалі клавіші відповідей без помилок. Ця проблема натхненна цією програмою.

Вимоги:

  1. Прийміть будь-яке слово з великих і малих літер
  2. Поверніть помилку для будь-яких спеціальних символів, тобто пробілів, дефісів, @ ^% # і т.д.
  3. a = 1, b = 2, ... і A = 1, B = 2, ...
  4. Роздрукуйте рахунок слова
  5. (Необов’язково) перевірте, чи є слово в словнику після озвучення, і надрукуйте попередження, якщо воно не є.
  6. Немає імпорту словника зовнішніх літер-> цифр. Ви повинні створити його самостійно.

Будь-яка мова є прийнятною. Це схоже на " цифровий кореневий бій ", але набагато простіше.


2
Це повинен бути гольф з кодом?
Пітер Тейлор

2
@Zach Використання code-golfтегу.
Lowjacker

2
Ваш батько навіть турбував навчати правилу "Я перед Е, крім С"?
Натан Меррілл

2
Так, лише перевірка балів? Я б написав кота як aaaaaaaaaaaaaaaaaaaaaaaa. Тато: Оцінка 24? Це вірно!
ericw31415

3
@ ericw31415 Кожна функція хешування має зіткнення ;-). Досі ніхто з його учнів не спробував цей вектор нападу
Зак

Відповіді:


8

Гольфскрипт - 23 символи

0\{.31&.(.26%=@64///+}/

Переконайтесь, що немає нових вхідних рядків (наприклад, використання echo -n).


У нас новий переможець!
Зак

Як правило, зовнішня фільтрація повинна якось включатися в число символів (Ctrl-f зовнішнє фільтрування.), Хоча я припускаю, що без цього лише два зайвих символи.
Джессі Мілікан

2
@Jesse: echo -nнасправді не вважається зовнішньою фільтрацією - насправді відповідь, яку ви зв'язали, пропонує це як правильну форму для введення.
Набб

10

Brainf *** (100)

>+[>,---------]<[<]>>
[--------------------
---------------------
-------------->]<[[[<
]>+[>]<->]<<]>-.

Я маю визнати, хоча це не зовсім відповідає всім вимогам. По-перше, він приймає лише великі літери, а слово має закінчуватися вкладкою. Він має невизначену поведінку для недійсних символів і не видає помилки. Він відображає суму літер як символ ASCII. Наприклад, якщо слово "HELLO", (8 + 5 + 12 + 12 + 15 = 52), воно відобразить символ "4", що є символом ASCII для 52. Це також означає, що програма вироджується, коли сума більше 255.

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


Навіщо закінчувати слово на вкладці замість нового рядка?
Lowjacker

@Lowjacker Тому що я припустив TAB простіший , ніж турбуватися про те \nчи \r\nабо \n\r. І якби я використовував новий рядок, я б не мав гарного круглого числа, як 100, як кількість символів.
Пітер Олсон

Що буде, якби ви отримали велику дозу?
Mateen Ulhaq

8

Пітон ( 65 64)

print sum(['',ord(i)-64]['@'<i<'[']for i in raw_input().upper())

Це спричиняє помилку, якщо слово містить небуквені символи, але не корисні чи інформативні. (Редагувати: кінчик капелюха до st0le для індексу індексу.)


1
print sum(['',ord(i)-64]['@'<i<'[']for i in raw_input().upper())поголив пару символів.
st0le

Насправді лише одна табличка. : - \
st0le

Збережіть 4 символи за допомогою input; змушує користувача ставити лапки навколо вхідних рядків, але "зручний" і "не небезпечний" немає у специфікації!
jscs

Ну просто поміняйте його на Python 3! raw_inputinput
Олег Припін

print sum([i,ord(i)-64]['@'<i<'[']for i in raw_input().upper()) ще один байт поголений
Олександр Нігль

8

Рубі, 43 символи

$_=gets.upcase;p~/[^A-Z]/?_: $_.sum-64*~/$/

Повідомлення про помилку, яке це створює, не зовсім корисне. Обидва рішення, розміщені тут, передбачають, що на вході немає кінцевої лінії, тому для тестування їх використовуйте echo -n.

Рубін, 76 символів зі словниковою перевіркою

l=STDIN.gets;$_=l.upcase;p~/[^A-Z]/?_: $_.sum-64*~/$/;[*$<].index(l)||$><<?W

Попереджувальне повідомлення складається з одного символу "W". Шлях до словника повинен надаватися через ARGV. Приклад використання:

$ echo -n asd | ruby addletters.rb /usr/share/dict/words
24
W
$ echo -n cat | ruby addletters.rb /usr/share/dict/words
24

2
Ви можете нарізати 9 символів у версії перевірки словника, зробивши повідомлення про помилку знаком оклику.
Пітер Олсон

Ви отримуєте розраду на втіху за найкоротший запис із чеком словника. Шлях!
Зак

Чому була запропонована перевірка словника, якщо вона не дає тобі реального переваги (навпаки, вона просто роздула код)?
Хелперний метод

5

Python 2.6 (72 символи) Без перевірки словника

print sum(map(" abcdefghijklmnopqrstuvwxyz".index, raw_input().lower()))

Python 2.6 (178 символів *) За допомогою перевірки словника

w=raw_input().lower()
print sum(map(" abcdefghijklmnopqrstuvwxyz".index, w))
if w not in open('/usr/share/dict/american-english').read().split():
 print('Word not in dictionary')

* Можна знизити до 156 за допомогою менш корисного повідомлення про помилку. :-)

Дякуємо всім коментаторам за допомогу в покращенні цього.


Ви можете розглянути можливість використання sumвбудованого з виразом генератора, а не forциклу. Це дозволить вам обрізати кілька символів (~ 17).

@jloy: Дякую, що вказав на це.
Джон

круглі дужки при друку можна усунути
st0le

здається, ви використовуєте aлише один раз, тому використовуйте сам літерал ... "0abc....z".index(i)буде працювати однаково .
st0le

У 0вашому масиві оцінок розумний, але це також означає, що cat0його приймають без помилок, що невірно, я думаю. Що занадто погано, оскільки це дозволить вам перейти map(a.index,w)до sumцього (заміняючи буквальне значення, aяк пропонує st0le).

4

Perl (52) (48)

golfed ще більше завдяки Timwi

perl -lpe "($w=uc)=~/[^A-Z]/&&die;$w=~s/./$_-=64-ord$&/ge"


Ви пропустите -eпрапор там.
Lowjacker

1
Ви повинні принаймні включити прапори pта lінтерпретатори до числа персонажів. Дивіться цю дискусію на мета.
Вентеро

syntax error at -e line 1, near "(=" Execution of -e aborted due to compilation errors.Що я роблю неправильно?
користувач невідомий

якщо ви працюєте на Unix, змініть подвійні котирування на одиничні
китайський perl goth

@Timwi: "Прийміть будь-яке слово з великих і малих літер" перейшов до неправильної теми, вибачте. Я її зараз видалив. @chinese: Так, дякую, з одинарними цитатами це нормально. Поки я обмежую себе входом ascii. :)
користувач невідомий

4

Пітон (80)

w=raw_input().lower()
s=0
for l in w:s+=range(97,123).index(ord(l))+1
print s

Python v2 (65, але char `буде прийнято)

print sum(map(range(96,123).index,map(ord,raw_input().lower())))

v3 (60 символів, @ буде прийнято, але не буде враховано, спасибі jloy)

print sum(map(range(64,91).index,map(ord,input().upper())))

Підказка: Є спосіб зняти одну більш детальну з ваших рішень. :)

2
@jloy Що корисний натяк. ;)
Mateen Ulhaq

4

Scala: 59 знаків, 7 з них корисна навантаження, без диктату:

(0/:"Payload".map(c=>if(c.isLetter)(c-'A')%32 else-999))(_+_)
67

Поки що жодного словника. Негативний результат означає: Негативний!

(0/:"Pay!wall?".map(c=>if(c.isLetter)(c-'A')%32 else-999))(_+_)   
-1915

До речі, витончено поводиться з німецьким Umlaute:

(0/:"Müllrößchen".map(c=>if(c.isLetter)(c-'A')%32 else-999))(_+_)
155

Нічого собі, менше знаків, ніж версія Perl (і ще читабельніше).
Хелперний метод

Я спробував SHiNKiROUs та chinesis-Perl-рішення, але мені це не вийшло. Зберегли їх як alpha.plі розпочали perl alpha.pl. Вони просто справляються з Ассієм? Ну - у Perl такий старий звір ... :)
користувач невідомий

Perl і Unicode - це великий безлад. Можливо, вам доведеться запускати їх як- perl -M5.010 alpha.plнебудь подібне.
Пітер Тейлор

Я чув, що мені потрібні одиничні лапки замість подвійних лапок на Linux, і це спрацювало, дякую.
користувач невідомий

4

Бібліотеки Java + Google Guava, 347 символів, за допомогою словника

Нечитабельна 1 довга версія рядка :-)

import java.io.*;import com.google.common.base.*;import com.google.common.io.*;class C{public static void main(String[]a)throws Exception{int s=0;for(int c:a[0].toUpperCase().toCharArray()){assert(c>64&&c<91);s+=c-64;}String d=Files.toString(new File(a[1]),Charsets.UTF_8);if(StringUtils.containsIgnoreCase(d,a[0]))System.out.println("w");System.out.println(s);}}

Прочитана людиною версія (сорт :-))

import java.io.*;

import com.google.common.base.*;
import com.google.common.io.*;

class C {
    public static void main(String[] a) throws Exception {
        int s=0;

        for(int c : a[0].toUpperCase().toCharArray()) {
            System.out.println(c);
            assert(c > 64 && c < 91);
            s += c - 64;
        }

        String d = Files.toString(new File(a[1]), Charsets.UTF_8);

        if (d.contains(a[0])) System.out.println("w");

        System.out.println(s);
    }
}

Шлях до словника тепер передається через a[1], для тверджень для роботи вам потрібно використовувати -eaпрапор (+3 більше символів). Що стосується словника, то використовується dict /usr/share/dict/words(має бути доступним у більшості * nix систем).


Наразі ви єдиний, хто перевірив словник, тому +1
Зак

один рядок? це не особливо читано таким чином, хоча я гадаю, що це рятує символи
Нейт Коппенгавер

Я додам більш читабельне рішення (а також коротше рішення, яке використовує Google Guava для зменшення кодового коду).
Хелперний метод

Ви просто дозволяєте ascii, але використовуєте Charset.UTF-8?
користувач невідомий

1
Тому що струна UTF-8коротша, ніж інші шаблони :-).
Хелперний метод

4

Python 3, 95 символів зі словником

d=input().lower()
print(d in open("d").read()and sum(['',ord(c)-96]['`'<c<'{']for c in d)or'f')

Словник повинен бути у файлі, який називається d.

Python 3, 61 без словника, але вкрадена ідея

print(sum(['',ord(c)-96]['`'<c<'{']for c in input().lower()))


3

VB.NET, 84 82 73 71

Console.Write(Console.ReadLine.Sum(Function(c)Asc(Char.ToUpper(c))-64))


Правка: З валідацією є:

Dim r=Console.ReadLine
Console.Write(If(r.All(AddressOf Char.IsLetter),r.Sum(Function(c)Asc(Char.ToUpper(c))-64),"Invalid input."))

129 символів. У якому випадку:

C #, 118

var r=Console.ReadLine();Console.Write(r.All(char.IsLetter)?r.Sum(c=>char.ToUpper(c)-64).ToString():"Invalid input.");

1
Це не підтверджує введення даних.
Lowjacker

На жаль! Зачекайте секунду ...
Ри-

3
Я думаю, ви повинні забезпечити повноцінні програми. Ваше рішення C # не компілюється; вам потрібно розмістити його в методі Main всередині декларації класу та підрахувати всі символи.
Тімві

1
Ні, тому що цей код нічого не робить, і це не справедливо для людей, що не мають вподобань об'єктно-орієнтованих мов. Це дійсно C # / VB.NET у будь-якому випадку.
Ри-

3

Трохи покращуючи відповідь Джона: Python (90)

s=0
for i in raw_input().lower():
 s+=("abcdefghijklmnopqrstuvwxyz".index(i)+1)
print(s)

2
додавання манекена char в рядку початку коротше ... круглі дужки можна видалити
st0le


3

Гольфскрипт - 39 символів

n%~{.96>{96}{64}if-..26>\0<|{0/}*}%{+}*

Помилка, яку він викидає, не зовсім найкраща, але ей, вона припиняє виконання.


Я нічого не знаю про golfscript, тому я припускаю, що це відповідає вимогам і оголошу вас переможцем!
Зак

Ой, ви били! Я думаю, 2 дні не досить довго, щоб чекати на питання про гольф з кодом?
Зак

3

PYTHON 62 68 * Персонажі

print sum(map(chr,range(65,91)).index(c)+1 for c in input().upper())

Потрібен користувач для введення рядків, використовуючи лапки, і не є безпечним ( inputвиконує код), але, як я вже сказав у коментарі до іншої публікації, "полегшений користувачеві" та "не ризик для безпеки" немає в специфікації!


* Я забув print, чорт.


Відповідь jloy все ще коротша, власне, через input/ raw_inputрізницю.
jscs

2

Рубін 1,9, 69

w=gets.chop.upcase
w[/[^A-Z]/]&&fail
p w.bytes.inject(0){|s,b|s+b-64}

Обробляє лише символи ascii. Я думав, Рубі з нашого століття? :)
користувач невідомий

@user невідомо: Spec не каже, що це повинно. Робити це було б досить складно ...
Lowjacker

2

GolfScript, 50 (53)

Помилка поганих символів, але не дуже хороша (50 символів):

);[{""123,97>+91,65>+?}/].-1?0<{{26%1+}%{+}*}{@}if

Дає замість помилки "E" (53 символи):

);[{""123,97>+91,65>+?}/].-1?0<{{26%1+}%{+}*}{;"E"}if

Фрагмент, що генерує алфавіт 123,97>+, викрадений у Вентеро.


2

J (55)

+/64-~-&32`]@.(<&97)`_:@.(<&65)`_:@.(>&122)"0,I.a.&e."0

Це задовольняє всі умови, крім словникової. Як умова помилки, вона повертає "нескінченність" (символ підкреслення в J) для слів, які містять що-небудь, крім букв.


2

Haskell (127)

(викликає помилку на дивних символах)
(також: пробіл між toUpper.і \xпотрібен, інакше він аналізує його як (toUpper) .\ (x))

import Char
main=getLine>>=putStrLn.show.sum.(map$(-65+).ord.toUpper. \x->if x`elem`['A'..'Z']++['a'..'z']then x else error"")

Хаскелл (70)

(не викликає помилку, але на 45% коротше)

import Char
main=getLine>>=putStrLn.show.sum.(map$(-65+).ord.toUpper)

2

C ++ ( 111 107)

void main(){int a=0;s8*b=new s8[99];for(cin>>b;*b;)if(isalpha(*b))a+=tolower(*b++)-96;else return;cout<<a;}

"Налаштування" / тощо:

#include <iostream>
#include <cstdio>
#include <cctype>

#ifdef _MSC_VER
    typedef __int8 s8;
#else
    typedef signed char s8;
#endif

"Не визначена" поведінка (Це більше "погана практика", ніж "невизначена", але так добре):

  • void main() Це все говорить.
  • Я використовую newбез delete.

1

JavaScript 1.8, 80 символів

Дивно читабельно!

alert(Array.reduce(prompt().toLowerCase(),function(a,b)a+b.charCodeAt(0)-96,0))

Для використання в Chrome I довелося перетворити його трохи: alert(prompt().toLowerCase().split("").reduce(function(a,b){return a+b.charCodeAt(0)-96},0)). Мені найбільше подобаються рішення JavaScript :)
pimvdb

Він не повертає помилку, коли ви робите недійсний символ ???
ericw31415

1

APL (34)

+/{⍵∊⍳26:⍵}¨{64-⍨A-32×96<A←⎕UCS⍵}⍞

Дає або бал, або а VALUE ERROR якщо у введенні є не алфавітні символи.

Пояснення:

  • : читати рядок введення
  • {...} : функція, застосована до кожного символу вводу
  • A←⎕UCS⍵: зберігає значення ASCII поточного символу в A
  • A-32×96<A: Зробити символом великі регістри: від Aвіднімається 32, якщо96<A (так, якщо це великі регістри), інакше 0
  • 64-⍨: відніміть 64 з цього, даючи A = 1, B = 2 ...
  • ¨: застосувати цю функцію до кожного символу:
  • ⍵∊⍳26: якщо персонаж між 1 і 26 ...
  • :⍵: тоді поверніть ⍵ (а оскільки немає іншого пункту, буде a, VALUE ERRORякщо його немає між 1 і 26)
  • +/: підсумовуйте всі значення разом (і це значення автоматично виводиться, оскільки це кінцевий результат).

1

JavaScript, 60 байт

s=>[...s.toUpperCase()].reduce((a,b)=>a+b.charCodeAt()-64,0)

If the program must return an error on invalid inputs, then 80 bytes:

s=>/[^a-z]/i.test(s)?_:[...s.toUpperCase()].reduce((a,b)=>a+b.charCodeAt()-64,0)

If an input is invalid, then the console will say that _ is not defined (there must not already be a variable defined called _).


1

Python 3, 58 55

print(sum(ord(x)%32for x in input()if x.isalpha()or z))

without dictionary or stolen idea but still unhelpful error ;)

thx @Eᴀsᴛᴇʀʟʏ

Test here.


I think you can save a byte by switching to python 2 and doing print<SPACE>sum(ord(......., removing the 2 parentheses around the expression.
Rɪᴋᴇʀ

@EᴀsᴛᴇʀʟʏIʀᴋ that is right but than the input has to be in parenthesis and I don't want to promote python 2 ;)
Alexander Nigl

PYTHON 2 IS LIFE!! and also, I don't think that would require the input to be parenthesized?
Rɪᴋᴇʀ

@EᴀsᴛᴇʀʟʏIʀᴋ sry i meant quoted. input() in python3 is raw_input() in python2
Alexander Nigl

oh, I forgot. Hm.
Rɪᴋᴇʀ

1

C, 98 bytes

 int a(char *s){int b=0;while(*s){if(!isalpha(*s))throw 1;b+=(toupper(*(s++))-64);}printf("%d",b);}


1

C# with validation: 108 chars (with 12 for error message):

var s=Console.ReadLine();Console.Write(s.All(Char.IsLetter)?s.Sum(x=>x&'_'-'@').ToString():"Invalid input");

C# without validation: 60 53 chars:

Console.Write(Console.ReadLine().Sum(x=>x&'_'-'@'));

1
In the second one without validation, you can reduce the characters even more by removing the s variable declaration and using Console.ReadLine() inline.
hermiod

1

Perl (42 31)

perl -F -pale '$c+=ord(uc$_)-64for@F;$_=$c'

I hope counting F, p, a and l as 1 character was correct.


1

JavaScript, 68 Bytes

This can almost certainly be golfed more

w=>[...w.toLowerCase()].map(v=>v.charCodeAt()-96).reduce((a,b)=>a+b)

With dictionary check (Node.js & Unix Descendants only) 195 Bytes

Uses /usr/share/dict/words, and can definitely be shortened (see the warn message)

w=>(require("fs").readFile("/usr/share/dict/words",(e,t)=>!(t+"").split`
`.includes(w=w.toLowerCase())&&console.warn(w+" not found in dict")),[...w].map(v=>v.charCodeAt()-96).reduce((a,b)=>a+b))

For an error message, you do console.error(), not console.warn().
ericw31415

But the challenge said to warn (5. (Optional) check that the word is in a dictionary after scoring, and print a warning if it is not.) Don't mean to be pedantic, but the challenge specified a warning
MayorMonty

@SpeedyNinja I think it still counts, that isn't really the point of the challenge...
Rɪᴋᴇʀ

@EᴀsᴛᴇʀʟʏIʀᴋ it is 1 character shorter ;)
MayorMonty

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