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


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_input→input
— Олег Припін

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.