Буквенно-цифровой подсчет линий и кривых

10

Учитывая входную строку, напишите программу, которая выводит общее количество линий и кривых, которые она имеет.

Соревнование

  • Возьмите ввод STDINили любой другой метод ввода.
  • Вывести в STDOUTили любой другой метод вывода общее количество линий и кривых, содержащихся в строке, в указанном порядке на основе приведенной ниже таблицы в фрагменте кода.
  • Любые не алфавитно-цифровые символы следует игнорировать.
  • Стандартные лазейки запрещены.
  • Это , поэтому самый короткий код выигрывает.

Разъяснения

  • Линии и кривые определяются шрифтом, используемым в Stackexchange для code blocks.
  • Круги (как O, o, 0) и точки ( i, j), считаются 1 кривой каждый.
  • Входными данными могут быть строка, список символов, поток символов, байт-коды и т. Д.
  • Выход может быть массивом целых чисел, набор целых чисел, разделенных запятыми строки и т.д. Эти два числа должны быть разделены, так что 104не является действительным, но 10,4, 10 4, 10\n4, [10,4], (10, 4), и так далее есть.
  • Заголовок и конечный пробел вполне приемлемы.

Пример ввода и вывода

# Format: str -> line, curve
hi -> 4, 2
HELLO WORLD -> 20, 4
l33+ 5pEak -> 13, 8
+=-_!...?~`g@#$%^ -> 1, 2
9001 -> 5, 3
O o O o O o -> 0, 6

Таблица символов

Char | Lines | Curves
0    | 1     | 1
1    | 3     | 0
2    | 1     | 1
3    | 0     | 2
4    | 3     | 0
5    | 2     | 1
6    | 0     | 1
7    | 2     | 0
8    | 0     | 2
9    | 0     | 1
A    | 3     | 0
B    | 1     | 2
C    | 0     | 1
D    | 1     | 1
E    | 4     | 0
F    | 3     | 0
G    | 2     | 1
H    | 3     | 0
I    | 3     | 0
J    | 1     | 1
K    | 3     | 0
L    | 2     | 0
M    | 4     | 0
N    | 3     | 0
O    | 0     | 1
P    | 1     | 1
Q    | 0     | 2
R    | 2     | 1
S    | 0     | 1
T    | 2     | 0
U    | 0     | 1
V    | 2     | 0
W    | 4     | 0
X    | 4     | 0
Y    | 3     | 0
Z    | 3     | 0
a    | 0     | 2
b    | 1     | 1
c    | 0     | 1
d    | 1     | 1
e    | 1     | 1
f    | 1     | 1
g    | 1     | 2
h    | 1     | 1
i    | 3     | 1
j    | 1     | 2
k    | 3     | 0
l    | 3     | 0
m    | 3     | 2
n    | 2     | 1
o    | 0     | 1
p    | 1     | 1
q    | 1     | 1
r    | 1     | 1
s    | 0     | 1
t    | 1     | 1
u    | 1     | 1
v    | 2     | 0
w    | 4     | 0
x    | 4     | 0
y    | 1     | 1
z    | 3     | 0
bigyihsuan
источник
2
Что считается как линия и кривая? Это s2 кривых или 1? Является ли ствол в jлинии и кривой? Было бы лучше, если бы вы могли просто перечислить необходимые значения для всех букв.
Специальный охотник за
4
Я действительно не понимаю отрицательных голосов по этому вопросу. Для меня это хорошо определенная задача с хорошими контрольными примерами, эталонной реализацией и таблицей ожидаемых значений (являются ли они технически правильными или рабочие - это вопрос личного мнения, но не имеет ничего общего с задачей). выход гибок. Если кто-то может объяснить, что с этим не так, я был бы очень признателен.
ElPedro
3
Можете ли вы предоставить значения для каждого символа в формате, который мы можем легче скопировать; Отрывок совершенно не нужен.
Лохматый
4
oдолжно быть 0 линий, 1 кривая
Джузеппе
2
Продолжение сверху ... Пониженные отзывы без обратной связи дают ОП мало шансов улучшить свои проблемы в будущем.
ElPedro

Ответы:

8

Haskell, 214 199 188 175 байтов

 g 0=[]
 g n=mod n 5:g(div n 5)
 d#s=sum[n|c<-d,(i,n)<-zip['0'..]$g s,c==i]
 f s=(s#0x300BBD37F30B5C234DE4A308D077AC8EF7FB328355A6,s#0x2D5E73A8E3D345386593A829D63104FED5552D080CA)

Попробуйте онлайн!

Числа линий и кривых являются цифрами чисел основания-5 и хранятся в виде чисел основания-16. функцияg переводит обратно в базу-5.

Изменить: -13 байт благодаря @cole.

Ними
источник
1
169 байт, если вы можете взять список кодов. Собираюсь изучить портирование этого на строковый вариант…
Коул
1
175 байт, если вам нужно использовать строки (удалил мой предыдущий комментарий, так как я проиграл тривиальные байты).
Коул
@cole: спасибо за улучшения. Переход со списком целых чисел напоминает читерство, потому что задача помечена как «строка». С другой стороны, правила допускают использование «байт-кодов» в качестве допустимого формата ввода. Однако во многих других ответах также используется какое-то преобразование char -> integer. Не знаю что делать.
Ними
6

05AB1E , 78 69 65 байт

-4 байта благодаря Кевину Круйссену, пойди и проверь его еще лучше 05AB1E ответ

žKÃÇ48-©•7ć_qýÊΣŸßαŽ_ì¡vFÛ–ÄÔ™”súyån!₁ζB?òrβÂ@µk₆¼×¬°•5в2ä`®èrè‚O

Попробуйте онлайн!

Выходы как [Кривая, Линия]

Я действительно плох в 05AB1E, я только что узнал. Можно определенно сохранить больше байтов, если я смогу заставить 05AB1E делать èчерез мой список списков


объяснение

žKÃ                                    #Filter out non alpha-nums
    Ç48-                               #Convert to ascii and subtract 48 so "0" is 0 etc.
        ©                              #Store that for later
          •...•5в                      #De-compress compressed list 
                 2ä                    #Split into 2 chunks (lines + curves)
                   `                   #Separate them onto the stack 
                    ®                  #Get the value that we stored 
                     èrè               #Apply indexing to both lists
                        ‚              #Put our indexed values back into a list
                         O             #Sum our lists
Истекшие данные
источник
1
Ваш вывод полностью изменен. Должно быть line curve, нет curve line.
bigyihsuan
1
Выходные данные могут быть массивом целых чисел, кортежем целых чисел, разделенной запятыми строкой и т. Д. Два числа должны быть отдельными @bigyihsuan, они являются отдельными, я не вижу, в чем проблема
устаревшие данные
1
Правила говорят Output to STDOUT, or any other output method, the total number of lines and curves contained in the string, in that order. Обратите внимание in that order, так line curve.
bigyihsuan
2
Я согласен с @ExpiredData в этом. Может быть, указать в вызове, что порядок должен быть указан в ответе. Этого было бы достаточно, чтобы пройти.
ЭльПедро
1
53 байта (и с [Line, Curve]порядком вывода, хотя это совпадение, а не преднамеренное).
Кевин Круйссен
5

Желе , 45 байт

ØBċþSḋ“yƘ.ṪñF[)µṡṭɗḌyė$Ṫk“¢⁶KɱzV$QḂḥỵṙu’b5,3¤

Монадическая ссылка, принимающая список символов, который выдает список (двух) целых чисел.

Попробуйте онлайн! Или посмотрите набор тестов .

Как?

ØBċþSḋ“...“...’b5,3¤ - Link: list of characters, T
ØB                   - base-chars = "01...9A...Za...z'
   þ                 - outer product with T using:
  ċ                  -   count occurrences
    S                - sum -> [n(0), n(1), ..., n(9), n(A), ..., n(Z), n(a), ..., n(z)]'
                   ¤ - nilad followed by link(s) as a nilad:
      “...“...’      -   list of two large integers (encoded in base 250)
                5,3  -   five paired with three = [5,3]
               b     -   to base  -> [[Lines(0), Lines(1), ...], Curves(0), Curves(1), ...]
     ḋ               - dot-product
Джонатан Аллан
источник
5

Scala , 235 байт

val a=('0'to'9')++('A'to'Z')++('a'to'z')
def f(s:String)=s.filter(a.contains(_)).map(c=>"gdgkdhfckfdlfgedhddgdcedfgkhfcfceeddkgfggglgilddnhfgggfggceegd"(a.indexOf(c))-'a').map(x=>(x%5,x/5)).foldLeft((0,0))((x,y)=>(x._1+y._1,x._2+y._2))

Попробуйте онлайн!

Не такой маленький, наверное, дальше можно играть в гольф.
Примечание: строковый литерал из 52 символов похож на словарь, который отображает символ на другой символ, который обозначает количество линий и кривых в соответствии со следующей таблицей:

Curves|Lines
      |0 1 2 3 4
----------------
     0|a b c d e
     1|f g h i j
     2|k l m n o
trolley813
источник
5

Python 2 , 159 154 байта

Для любого персонажа lines*4 + curves дает значение от 0 до 16. Base-36 используется для кодирования этих значений (1 символ = 1 значение).

-5 байт благодаря @Chas Brown

lambda s:map(sum,zip(*(divmod(int("5c52c918210000000c615gc9cc5c8gc15291818ggcc00000025155565d6cce915551558gg5c"[ord(x)-48],36),4)for x in s if'/'<x<'{')))

Попробуйте онлайн!

Python 2 , 141 байт

Это порт моего решения Python3. Эта версия выводит список длинных целочисленных значений, поэтому он выглядит как [4L, 2L]вместо [4, 2].

lambda s:map(sum,zip(*(divmod(int("8BK5NLC8RS10XWUX12BG408C2UELUAFEOVARZKCHEEDDMXG09L48ZG",36)/13**(ord(x)-48)%13,3)for x in s if'/'<x<'{')))

Попробуйте онлайн!

Даниил Тутубалин
источник
2
154 байта, используя base36 и '/'<x<'{'вместо x.isalnum().
Час Браун
1
@Chas Браун спасибо! Я тоже думал об этом '/'<x<'{', но я попытался выразить это, чтобы избавиться и от этого if.
Даниил Тутубалин
4

Желе , 51 байт

ØBiⱮị“Æƭ&¶*ṪḳAøƬsøD<~²ṂvṠỤṣT3rdʠ¬⁻ÇṆṇ.ÑƑaȮż’b5¤s2¤S

Попробуйте онлайн!

Монадическая ссылка, которая принимает строку в качестве входных данных и возвращает список целых чисел в виде [lines, curves]

Ник Кеннеди
источник
4

Сетчатка 0.8.2 , 160 байт

$
¶$`
T`dLl`13103202003101432331324301020202443301011111313332011101124413`^.*
T`dLl`10120110210211001001000011211010000021111121120021111111100010`.*$
.
$*
%`1

Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Объяснение:

$
¶$`

Дублируйте входную строку.

T`dLl`13103202003101432331324301020202443301011111313332011101124413`^.*

Подсчитайте строки каждого персонажа в первой строке.

T`dLl`10120110210211001001000011211010000021111121120021111111100010`.*$

Подсчитайте кривые каждого персонажа во второй строке.

.
$*
%`1

Суммируйте цифры отдельно в каждой строке.

Нил
источник
4

R , 164 153 байт

function(s,`!`=utf8ToInt,x=(!"




")[match(!s,c(48:57,65:90,97:122),0)])c(sum(x%%5),sum(x%/%5))

Попробуйте онлайн!

У меня была та же идея, ответ Ними в использовании кодирования базы 5 , но кодирует как ASCII символов вместо основания 16. Использование nomatch = 0в matchустранить не буквенно-цифровые символы.

Возвращает curves lines.

Giuseppe
источник
4

Древесный уголь , 60 байт

IE⟦”)⊞∧cⅉ→ÞYγμ◧⊞¶u№¶⊘¶∕«⁸””)∨⧴|υ;↷dLτIüO¦:”⟧Σ⭆Φθ№⭆ι⍘ξφλ§ι⍘λφ

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

E⟦”)⊞∧cⅉ→ÞYγμ◧⊞¶u№¶⊘¶∕«⁸””)∨⧴|υ;↷dLτIüO¦:”⟧

Это массив из двух строк 13103202000101111131333201110112441331014323313243010202024433и 10120110212111112112002111111110001002110010010000112110100000. Затем строки сопоставляются.

Φθ№⭆ι⍘ξφλ

Элементы ввода фильтруются по тому, содержатся ли они в (62) символах базового алфавита преобразования по умолчанию.

⭆...§ι⍘λφ

Оставшиеся элементы затем преобразуются из базы (62), а затем индексируются в отображенную строку.

I...Σ...

Цифры суммируются и возвращаются в строку для неявной печати.

Нил
источник
4

Питон 3 , 165 159 148 146 байт

Для любого символа (включая не алфавитно-цифровой) lines*3 + curves дается значение от 0 до 12, поэтому мы можем использовать длинное число base-13 для кодирования данных. Чтобы сделать его короче, он конвертируется в base-36.

Спасибо @Chas Brown за отличные советы.

-2 байта путем преобразования лямбда в программу.

print(*map(sum,zip(*(divmod(int("8BK5NLC8RS10XWUX12BG408C2UELUAFEOVARZKCHEEDDMXG09L48ZG",36)//13**(ord(x)-48)%13,3)for x in input()if'/'<x<'{'))))

Попробуйте онлайн!

Даниил Тутубалин
источник
4

Python 2 , 179 166 165 163 байта

lambda s:[sum(p[:max(0,p.find(c))].count(',')for c in s)for p in',02BDJPbdefghjpqrtuy,57GLRTVnv,14AFHIKNYZiklmz,EMWXwx',',02569CDGJOPRSUbcdefhinopqrstuy,38BQagjm']

Попробуйте онлайн!

Возвращает список [curves, lines].

Час Браун
источник
3

Python 2 , 525 байт

l=c=0;e=[(1,1),(3,0),(1,2),(0,2),(3,0),(2,1),(0,1),(2,0),(0,2),(0,1),(3,0),(1,2),(0,1),(1,1),(4,0),(3,0),(2,1),(3,0),(3,0),(1,1),(3,0),(2,0),(4,0),(3,0),(0,1),(1,1),(0,2),(2,1),(0,1),(2,0),(0,1),(2,0),(4,0),(4,0),(3,0),(3,0),(0,2),(1,1),(0,1),(1,1),(1,1),(1,1),(1,2),(1,1),(3,1),(1,2),(3,0),(3,0),(3,2),(2,1),(0,1),(1,1),(1,1),(1,1),(0,1),(1,1),(1,1),(2,0),(4,0),(4,0),(1,1),(3,0)]
d='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
for i in input():
 if i in d:
  p=d.find(i);l+=e[p][0];c+=e[p][1];
print l,c

Попробуйте онлайн!

Аналогичный подход к эталонной реализации, но несколько короче.

ElPedro
источник
3
283 байта
Герман Л
2
Думал об этом, когда у меня было очень необходимое пиво в Биргартене после работы, но это было слишком много работы, чтобы переформатировать на моем
удобстве
1
@HermanL Не стесняйтесь размещать в качестве собственного ответа. У меня нет времени, чтобы обновить эту ночь.
ElPedro
2
265 байтов с немного большим количеством игры в гольф ...
Час Браун
2
231 байт
Уилкбен
2

Perl 5 -MList::Util=sum -p , 180 байт

say sum y/0-9A-Za-z/13103202003101432331324301020202443301011111313332011101124413/r=~/./g;$_=sum y/0-9A-Za-z/10120110210211001001000011211010000021111121120021111111100010/r=~/./g

Попробуйте онлайн!

Xcali
источник
2

05AB1E , 53 байта

•xþ¢*>ÌŸÑå#÷AUI'@æýXÁи<¥èå–ΘηžÎà₅åǚĕ5вR2ôžKISk®KèøO

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

xþ¢*>ÌŸÑå#÷AUI'@æýXÁи<¥èå–ΘηžÎà₅åǚĕ
                 '# Compressed integer 101629259357674935528492544214548347273909568347978482331029666966024823518105773925160
 5в               # Converted to base-5 as list: [1,0,2,0,0,2,1,0,1,2,0,3,2,0,1,1,0,3,1,1,0,3,0,3,0,4,0,4,0,2,1,0,0,2,1,0,1,2,2,0,1,1,1,0,0,3,0,4,0,2,0,3,1,1,0,3,0,3,1,2,0,3,0,4,1,1,1,0,2,1,0,3,0,3,1,1,0,4,0,4,0,2,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,2,2,3,0,3,0,3,2,1,1,3,1,1,2,1,1,1,1,1,1,1,1,0,1,1,2,0]
   R              # Reverse this list (due to the leading 0)
    2ô            # Split it into pairs: [[0,2],[1,1],[0,1],[1,1],[1,1],[1,1],[1,2],[1,1],[3,1],[1,2],[3,0],[3,0],[3,2],[2,1],[0,1],[1,1],[1,1],[1,1],[0,1],[1,1],[1,1],[2,0],[4,0],[4,0],[1,1],[3,0],[3,0],[1,2],[0,1],[1,1],[4,0],[3,0],[2,1],[3,0],[3,0],[1,1],[3,0],[2,0],[4,0],[3,0],[0,1],[1,1],[0,2],[2,1],[0,1],[2,0],[0,1],[2,0],[4,0],[4,0],[3,0],[3,0],[1,1],[3,0],[1,1],[0,2],[3,0],[2,1],[0,1],[2,0],[0,2],[0,1]]
      žK          # Push builtin string "abc...xyzABC...XYZ012...789"
        IS        # Push the input, split into characters
          k       # Get the index of each of these characters in the builtin-string
           ®K     # Remove all -1 for non-alphanumeric characters that were present
             è    # Use these indices to index into the earlier created pair-list
              ø   # Zip/transpose; swapping rows/columns
               O  # Sum both inner lists
                  # (after which the result is output implicitly)

Посмотрите этот мой совет 05AB1E (разделы Как сжимать большие целые числа? И Как сжимать целочисленные списки? ), Чтобы понять, почему •xþ¢*>ÌŸÑå#÷AUI'@æýXÁи<¥èå–ΘηžÎà₅åǚĕесть 101629259357674935528492544214548347273909568347978482331029666966024823518105773925160и •xþ¢*>ÌŸÑå#÷AUI'@æýXÁи<¥èå–ΘηžÎà₅åǚĕ5весть [1,0,2,0,0,2,1,0,1,2,0,3,2,0,1,1,0,3,1,1,0,3,0,3,0,4,0,4,0,2,1,0,0,2,1,0,1,2,2,0,1,1,1,0,0,3,0,4,0,2,0,3,1,1,0,3,0,3,1,2,0,3,0,4,1,1,1,0,2,1,0,3,0,3,1,1,0,4,0,4,0,2,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,2,2,3,0,3,0,3,2,1,1,3,1,1,2,1,1,1,1,1,1,1,1,0,1,1,2,0].

Кевин Круйссен
источник
1

Python 3 , 697 байт

def f(s):
    l=0;c=0;d={'0':(1,1),'1':(3,0),'2':(1,2),'3':(0,2),'4':(3,0),'5':(2,1),'6':(0,1),'7':(2,0),'8':(0,2),'9':(0,1),'A':(3,0),'B':(1,2),'C':(0,1),'D':(1,1),'E':(4,0),'F':(3,0),'G':(2,1),'H':(3,0),'J':(1,1),'K':(3,0),'L':(2,0),'M':(4,0),'N':(3,0),'O':(0,1),'P':(1,1),'Q':(0,2),'R':(2,1),'S':(0,1),'T':(2,0),'U':(0,1),'V':(2,0),'W':(4,0),'X':(4,0),'Y':(3,0),'Z':(3,0),'a':(0,2),'b':(1,1),'c':(0,1),'d':(1,1),'e':(1,1),'f':(1,1),'g':(1,2),'h':(1,1),'i':(3,1),'j':(1,2),'k':(3,0),'l':(3,0),'m':(3,2),'n':(2,1),'o':(0,1),'p':(1,1),'q':(1,1),'r':(1,1),'s':(0,1),'t':(1,1),'u':(1,1),'v':(2,0),'w':(4,0),'x':(4,0),'y':(1,1),'z':(3,0)};
    for i in s:
        if i in d:
            l+=d[i][0];c+=d[i][1];
    return l,c

Простая первая попытка. Я поместил таблицу в словарь, перебрал строку, увеличил некоторые счетчики и возвратил кортеж. Ввод - это строка.

Попробуйте онлайн!

bigyihsuan
источник
1
Почему не конкурирует? Выглядит хорошо для меня.
ElPedro
1
Почему даунвот без комментариев?
ElPedro