Буквально-цифрові лінії та підрахунок кривих


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

2
Що вважається лінією та кривою? Є s2 криві або 1? Чи стовбур jі в прямій, і в кривій? Було б найкраще, якби ви могли просто перерахувати необхідні значення для всіх букв.
Ad Hoc Hunter Hunter

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

3
Чи можете ви надати значення для кожного символу у форматі, який ми можемо легше скопіювати; Знімок зовсім непотрібний.
Shaggy

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 байт, якщо ви можете взяти список штрихкодів.
cole

1
175 байт, якщо вам доведеться використовувати рядки (видалено мій попередній коментар, оскільки я переграв тривіальний 3 байти).
cole

@cole: дякую за покращення. Якщо перейти зі списком цілих чисел, це схоже на обман, тому що виклик позначений як "рядок". З іншого боку, правила дозволяють "байтинговим кодам" як дійсний формат введення. Однак багато інших відповідей також використовують якусь конверсію char -> цілих чисел. Не знаю, що робити.
Ними

6

05AB1E , 78 69 65 байт

-4 байти завдяки Kevin Cruijssen, зайдіть і перевірте його ще кращу відповідь 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 щодо цього. Можливо, уточнюйте у виклику, що у відповіді слід вказати наказ. Цього було б достатньо, щоб обійтись.
ElPedro

1
53 байти[Line, Curve]як вихідний порядок, хоча це збіг і не навмисний).
Kevin Cruijssen

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

5

Пітон 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<'{')))

Спробуйте в Інтернеті!

Пітон 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().
Chas Brown

1
@Chas Браун дякую! Я також думав про це '/'<x<'{', але я намагався викласти це, щоб позбутися ifтакож.
Даніїл Тутубалін



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.


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

Завдяки @Chas Brown за чудові поради.

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

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

Спробуйте в Інтернеті!



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

Спробуйте в Інтернеті!

Аналогічний підхід до впровадження еталону, але дещо коротший.



2
Думав про це, поки я мав дуже потрібне пиво в Біргартен після роботи, але це було занадто багато роботи, щоб переформатувати на моїй
руці

1
@HermanL Не соромтеся публікувати як власну відповідь. У мене немає часу оновлювати цю напередодні.
ElPedro

2
265 байт з трохи більше гольфу ...
Chas Brown



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

Пітон 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

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

Спробуйте в Інтернеті!


1
Чому не змагаються? Мені добре виглядає.
ElPedro

1
Чому голос без коментарів?
ElPedro

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