Contagem alfanumérica de linhas e curvas

10

Dada uma sequência de entrada, escreva um programa que produz o número total de linhas e curvas que possui.

O desafio

  • Receber entrada de STDIN, ou qualquer outro método de entrada.
  • Saída para STDOUT, ou qualquer outro método de saída, o número total de linhas e curvas contidas na sequência, nessa ordem , com base na tabela abaixo no trecho de código.
  • Quaisquer caracteres não alfanuméricos devem ser ignorados.
  • As brechas padrão são proibidas.
  • Isso é , então o código mais curto vence.

Esclarecimentos

  • As linhas e curvas são determinadas pela fonte usada no Stackexchange for code blocks.
  • Círculos (como O, o, 0) e pontos (i, j ) são considerados 1 curva cada.
  • A entrada pode ser uma sequência, lista de caracteres, fluxo de caracteres, bytecodes etc.
  • A saída pode ser uma matriz de números inteiros, tuplo de números inteiros, cadeia separados por vírgulas, etc. Os dois números tem de ser separado, por isso 104não é válido, mas 10,4, 10 4, 10\n4, [10,4], (10, 4), e assim por diante é.
  • O espaço em branco à direita e à direita é perfeitamente aceitável.

Entrada e Saída de Amostra

# 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

Tabela de caracteres

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
fonte
2
O que conta como uma linha e curva? São s2 curvas ou 1? O caule está na jlinha e na curva? Seria melhor se você pudesse listar os valores necessários para todas as letras.
Ad Hoc Garf Hunter
4
Eu realmente não entendo os votos negativos deste. Para mim, esse é um desafio bem especificado, com bons casos de teste, uma implementação de referência e uma tabela de quais valores são esperados (se eles são tecnicamente corretos ou usados, é uma questão de opinião pessoal, mas nada a ver com o desafio). saída são flexíveis. Se alguém puder explicar o que há de errado nisso, ficaria muito grato.
ElPedro 16/07/19
3
Você pode fornecer os valores para cada caractere em um formato que possamos copiar com mais facilidade; o snippet é totalmente desnecessário.
Shaggy
4
odeve ser 0 linhas, 1 curva
Giuseppe
2
Continuando de cima ... Votos negativos sem feedback dão ao OP pouca chance de melhorar seus desafios no futuro.
ElPedro 17/07/19

Respostas:

8

Haskell, 214 199 188 175 bytes

 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)

Experimente online!

Os números de linhas e curvas são os dígitos dos números da base 5 e armazenados como números da base 16. A função é gconvertida de volta na base 5.

Editar: -13 bytes graças a @cole.

nimi
fonte
11
169 bytes, se você puder obter uma lista de códigos. Indo explorar portando isso para a variante de seqüência de caracteres…
cole
11
175 bytes se você precisar usar strings (excluído meu comentário anterior desde que joguei um trivial de 3 bytes).
cole
@ cole: obrigado pelas melhorias. Ir com uma lista de números inteiros parece trapaça, porque o desafio é marcado como "string". Por outro lado, as regras permitem "bytecodes" como um formato de entrada válido. No entanto, muitas outras respostas também usam algum tipo de conversão char -> integer. Não sei o que fazer.
nimi
6

05AB1E , 78 69 65 bytes

-4 bytes graças a Kevin Cruijssen, vá e confira sua ainda melhor resposta 05AB1E

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

Experimente online!

Saídas como [Curva, Linha]

Eu sou muito ruim no 05AB1E que acabei de descobrir. Definitivamente, posso salvar mais bytes se eu conseguir que 05AB1E faça èna minha lista de listas


Explicação

ž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
Dados expirados
fonte
11
Sua saída é revertida. Deveria ser line curve, não curve line.
Bigyihsuan 16/07/19
11
A saída pode ser um array de inteiros, tupla de inteiros, corda, separados por vírgulas, etc. Os dois números devem ser separados @bigyihsuan eles estão separados, não vejo qual é o problema
Expirado Dados
11
Regras dizem Output to STDOUT, or any other output method, the total number of lines and curves contained in the string, in that order. Observe o in that order, então line curve.
Bigyihsuan 16/07/19
2
Eu concordo com @ExpiredData neste. Talvez especifique no desafio que a ordem deve ser declarada na resposta. Isso seria suficiente para sobreviver.
ElPedro 16/07/19
11
53 bytes (e com [Line, Curve]a ordem de saída, embora isso seja coincidente e não intencional).
Kevin Cruijssen
5

Gelatina , 45 bytes

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

Um link monádico que aceita uma lista de caracteres que produz uma lista de (dois) números inteiros.

Experimente online! Ou veja a suíte de testes .

Como?

Ø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
Jonathan Allan
fonte
5

Scala , 235 bytes

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

Experimente online!

Não é tão pequeno, provavelmente pode ser jogado ainda mais.
Nota: A literal de cadeia de 52 caracteres é como um dicionário que mapeia um caractere para outro caractere que indica o número de linhas e curvas de acordo com a tabela a seguir:

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
fonte
5

Python 2 , 159 154 bytes

Para qualquer personagem lines*4 + curves dê um valor de 0 a 16. A Base-36 é usada para codificar esses valores (1 caractere = 1 valor).

-5 bytes graças a @Chas Brown

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

Experimente online!

Python 2 , 141 bytes

Esta é uma porta da minha solução Python3. Esta versão gera uma lista de entradas longas, pelo que parece em [4L, 2L]vez de [4, 2].

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

Experimente online!

Daniil Tutubalin
fonte
2
154 bytes usando base36 e em '/'<x<'{'vez de x.isalnum().
Chas Brown
11
@Chas Brown obrigado! Eu também estava pensando '/'<x<'{', mas tentei expressá-lo para me livrar iftambém.
Daniil Tutubalin
4

Geléia , 51 bytes

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

Experimente online!

Um link monádico que recebe uma string como entrada e retorna uma lista de números inteiros como [lines, curves]

Nick Kennedy
fonte
4

JavaScript (Node.js) , 251 219 217 bytes

-34 bytes de @ Dados expirados : o

_=>_.map(a=>(p+=~~"13103202003101432331324301020202443301011111313332011101124413"[(x=a.charCodeAt()-48)>16?(x-=7)>41?x-=6:x:x])&(o+=~~"10120110210211001001000011211010000021111121120021111111100010"[x]),p=o=0)&&[p,o]

Experimente online!

Luis felipe De jesus Munoz
fonte
2
217 bytes, na verdade
Dados expirados
4

Retina 0.8.2 , 160 bytes

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

Experimente online! O link inclui casos de teste. Explicação:

$
¶$`

Duplique a sequência de entrada.

T`dLl`13103202003101432331324301020202443301011111313332011101124413`^.*

Conte as linhas de cada personagem na primeira linha.

T`dLl`10120110210211001001000011211010000021111121120021111111100010`.*$

Conte as curvas de cada personagem na segunda linha.

.
$*
%`1

Soma os dígitos separadamente em cada linha.

Neil
fonte
4

R , 164 153 bytes

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




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

Experimente online!

Eu tive a mesma idéia que a resposta de nimi usando uma codificação de base 5, mas codifica como caracteres ASCII em vez de base 16. Usos nomatch = 0em matcheliminar caracteres não alfanuméricos.

Retorna curves lines.

Giuseppe
fonte
4

Carvão , 60 bytes

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

Experimente online! Link é a versão detalhada do código. Explicação:

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

Esta é uma matriz de duas strings 13103202000101111131333201110112441331014323313243010202024433e 10120110212111112112002111111110001002110010010000112110100000. As seqüências de caracteres são mapeadas.

Φθ№⭆ι⍘ξφλ

Os elementos da entrada são filtrados sobre se estão contidos nos (62) caracteres do alfabeto de conversão base padrão.

⭆...§ι⍘λφ

Os elementos que permanecem são então convertidos da base (62) e isso é indexado na cadeia mapeada.

I...Σ...

Os dígitos são somados e convertidos de volta na sequência para impressão implícita.

Neil
fonte
4

Python 3 , 165 159 148 146 bytes

Para qualquer caractere (incluindo não alfanumérico), o lines*3 + curvesvalor é de 0 a 12, para que possamos usar o número base 13 longo para codificar os dados. Para torná-lo mais curto, é convertido em base-36.

Agradecemos a @Chas Brown por ótimos conselhos.

-2 bytes convertendo lambda em programa.

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

Experimente online!

Daniil Tutubalin
fonte
4

Python 2 , 179 166 165 163 bytes

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

Experimente online!

Retorna uma lista [curves, lines].

Chas Brown
fonte
3

Python 2 , 525 bytes

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

Experimente online!

Abordagem semelhante à implementação de referência, mas um pouco mais curta.

ElPedro
fonte
3
283 bytes
Herman L
2
Pensei sobre isso enquanto eu estava tomando uma cerveja muito necessária no Biergarten depois do trabalho mas foi muito trabalho para reformatar na minha mão :)
ElPedro
11
@HermanL Sinta-se à vontade para postar como sua própria resposta. Não tenho tempo para atualizar esta véspera.
ElPedro 16/07/19
2
265 bytes com um pouco mais de golfe ...
Chas Brown 16/07/19
2
231 bytes
wilkben 17/07/19
2

Perl 5 -MList::Util=sum -p , 180 bytes

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

Experimente online!

Xcali
fonte
2

05AB1E , 53 bytes

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

Experimente online ou verifique todos os casos de teste .

Explicaçã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)

Consulte esta dica 05AB1E (seções Como compactar números inteiros grandes? E Como compactar listas de números inteiros? ) Para entender por que •xþ¢*>ÌŸÑå#÷AUI'@æýXÁи<¥èå–ΘηžÎà₅åǚĕé 101629259357674935528492544214548347273909568347978482331029666966024823518105773925160e •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].

Kevin Cruijssen
fonte
1

Python 3 , 697 bytes

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

Uma primeira tentativa simples. Coloquei a tabela em um dicionário, passei pela string, incrementei alguns contadores e retornei uma tupla. Entrada é uma sequência.

Experimente online!

bigyihsuan
fonte
11
Por que não competir? Parece bom para mim.
ElPedro 16/07/19
11
Por que o voto negativo sem um comentário?
ElPedro 16/07/19