Recuento alfanumérico de líneas y curvas

10

Dada una cadena de entrada, escriba un programa que genere el número total de líneas y curvas que tiene.

El reto

  • Tomar entrada de STDIN, o cualquier otro método de entrada.
  • Salida a STDOUT, o cualquier otro método de salida, el número total de líneas y curvas contenidas en la cadena, en ese orden , según la tabla siguiente en el fragmento de código.
  • Cualquier carácter no alfanumérico debe ser ignorado.
  • Las lagunas estándar están prohibidas.
  • Este es el , por lo que gana el código más corto.

Aclaraciones

  • Las líneas y curvas están determinadas por la fuente utilizada en Stackexchange para code blocks.
  • Se considera que los círculos (como O, o, 0) y los puntos ( i, j) son 1 curva cada uno.
  • La entrada puede ser una cadena, una lista de caracteres, una secuencia de caracteres, códigos de bytes, etc.
  • La salida puede ser una matriz de enteros, tupla de números enteros, cadena separada por comas, etc. Los dos números deben ser separada, por lo que 104no es válido, pero 10,4, 10 4, 10\n4, [10,4], (10, 4), y así sucesivamente es.
  • El espacio en blanco al comienzo y al final es perfectamente aceptable.

Muestra de entrada y salida

# 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

Tabla 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
fuente
2
¿Qué cuenta como una línea y curva? ¿Son s2 curvas o 1? ¿Es el tallo jtanto en línea como en curva? Sería mejor si pudiera enumerar los valores requeridos para todas las letras.
Ad Hoc Garf Hunter
44
Realmente no entiendo los votos negativos en este caso. Para mí, este es un desafío bien especificado con buenos casos de prueba, una implementación de referencia y una tabla de los valores que se esperan (si son técnicamente correctos o correctos es una cuestión de opinión personal pero nada que ver con el desafío). La salida es flexible. Si alguien puede explicar lo que está mal con esto, estaría muy agradecido.
ElPedro
3
¿Puede proporcionar los valores para cada carácter en un formato que podamos copiar más fácilmente? El fragmento es completamente innecesario.
Shaggy
44
odebería ser 0 líneas, 1 curva
Giuseppe
2
Continúa desde arriba ... Los votos negativos sin comentarios le dan a OP pocas posibilidades de mejorar sus desafíos en el futuro.
ElPedro

Respuestas:

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)

Pruébalo en línea!

Los números de líneas y curvas son los dígitos de los números de base 5 y se almacenan como números de base 16. La función se gtraduce de nuevo a base-5.

Editar: -13 bytes gracias a @cole.

nimi
fuente
1
169 bytes si puede tomar una lista de códigos de acceso. Vamos a explorar portar esto a la variante de cadena ...
cole
1
175 bytes si tiene que usar cadenas (eliminé mi comentario anterior ya que jugué 3 bytes triviales).
cole
@cole: gracias por las mejoras. Ir con una lista de enteros se siente como hacer trampa, porque el desafío está etiquetado como "cadena". Por otro lado, las reglas permiten "bytecodes" como formato de entrada válido. Sin embargo, muchas otras respuestas también usan algún tipo de conversión char -> integer. No se que hacer.
nimi
6

05AB1E , 78 69 65 bytes

-4 bytes gracias a Kevin Cruijssen, ve y mira su respuesta 05AB1E aún mejor

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

Pruébalo en línea!

Salidas como [Curva, Línea]

Soy realmente malo en 05AB1E. Me acabo de enterar. Definitivamente puedo guardar más bytes si puedo hacer que 05AB1E lo haga èen mi lista de listas


Explicación

ž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
Datos caducados
fuente
1
Su salida se invierte. Debería ser line curve, no curve line.
bigyihsuan
1
La salida puede ser una matriz de enteros, tuplas de enteros, cadenas separadas por comas, etc. Los dos números deben estar separados @bigyihsuan, están separados, no veo cuál es el problema
Datos
1
Las reglas lo dicen Output to STDOUT, or any other output method, the total number of lines and curves contained in the string, in that order. Tenga en cuenta el in that order, entonces line curve.
bigyihsuan
2
Estoy de acuerdo con @ExpiredData en este caso. Tal vez especifique en el desafío que el orden debe indicarse en la respuesta. Eso sería suficiente para sobrevivir.
ElPedro
1
53 bytes (y con [Line, Curve]un orden de salida, aunque sea coincidente y no intencional).
Kevin Cruijssen
5

Jalea , 45 bytes

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

Un enlace monádico que acepta una lista de caracteres que produce una lista de (dos) enteros.

Pruébalo en línea! O vea el conjunto de pruebas .

¿Cómo?

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

Pruébalo en línea!

No es tan pequeño, probablemente se pueda jugar más al golf.
Nota: El literal de cadena de 52 caracteres es como un diccionario que asigna un carácter a otro carácter que denota el número de líneas y curvas de acuerdo con la siguiente tabla:

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

Python 2 , 159154 bytes

Para cualquier carácter lines*4 + curvesda un valor de 0 a 16. Base-36 se usa para codificar estos valores (1 carácter = 1 valor).

-5 bytes gracias a @Chas Brown

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

Pruébalo en línea!

Python 2 , 141 bytes

Este es un puerto de mi solución Python3. Esta versión genera una lista de entradas largas, por lo que parece en [4L, 2L]lugar de [4, 2].

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

Pruébalo en línea!

Daniil Tutubalin
fuente
2
154 bytes usando base36 y en '/'<x<'{'lugar de x.isalnum().
Chas Brown
1
@Chas Brown gracias! También estaba pensando '/'<x<'{', pero traté de expresarlo para deshacerme de él iftambién.
Daniil Tutubalin
4

Jalea , 51 bytes

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

Pruébalo en línea!

Un enlace monádico que toma una cadena como entrada y devuelve una lista de enteros como [lines, curves]

Nick Kennedy
fuente
4

JavaScript (Node.js) , 251 219 217 bytes

-34 bytes de datos @ 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]

Pruébalo en línea!

Luis felipe De jesus Munoz
fuente
4

Retina 0.8.2 , 160 bytes

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

Pruébalo en línea! El enlace incluye casos de prueba. Explicación:

$
¶$`

Duplicar la cadena de entrada.

T`dLl`13103202003101432331324301020202443301011111313332011101124413`^.*

Cuente las líneas de cada personaje en la primera línea.

T`dLl`10120110210211001001000011211010000021111121120021111111100010`.*$

Cuenta las curvas de cada personaje en la segunda línea.

.
$*
%`1

Suma los dígitos por separado en cada línea.

Neil
fuente
4

R , 164153 bytes

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




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

Pruébalo en línea!

Yo tenía la misma idea que la respuesta de Nombre del modelo utilizando una codificación de base 5, pero codifica como caracteres ASCII en lugar de la base 16. Usos nomatch = 0en matcheliminar caracteres no alfanuméricos.

Las devoluciones curves lines.

Giuseppe
fuente
4

Carbón , 60 bytes

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

Pruébalo en línea!El enlace es a la versión detallada del código. Explicación:

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

Esta es una matriz de dos cadenas 13103202000101111131333201110112441331014323313243010202024433y10120110212111112112002111111110001002110010010000112110100000 . Las cadenas se asignan a continuación.

Φθ№⭆ι⍘ξφλ

Los elementos de la entrada se filtran sobre si están contenidos dentro de los (62) caracteres del alfabeto de conversión base predeterminado.

⭆...§ι⍘λφ

Los elementos que quedan se convierten de la base (62) y luego se indexa en la cadena asignada.

I...Σ...

Los dígitos se suman y vuelven a la cadena para la impresión implícita.

Neil
fuente
4

Python 3 , 165 159 148 146 bytes

Para cualquier carácter (incluidos los no alfanuméricos) lines*3 + curves obtiene un valor de 0 a 12, por lo que podemos usar un número largo de base 13 para codificar datos. Para acortarlo, se convierte a base-36.

Gracias a @Chas Brown por sus buenos consejos.

-2 bytes al convertir lambda a programa.

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

Pruébalo en línea!

Daniil Tutubalin
fuente
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']

Pruébalo en línea!

Devuelve una lista [curves, lines].

Chas Brown
fuente
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

Pruébalo en línea!

Enfoque similar a la implementación de referencia pero algo más corto.

ElPedro
fuente
3
283 bytes
Herman L
2
Pensé en eso mientras
tomaba
1
@HermanL Siéntase libre de publicar como su propia respuesta. No tengo tiempo para actualizar esta víspera.
ElPedro
2
265 bytes con un poco más de golf ...
Chas Brown
2
231 bytes
wilkben
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

Pruébalo en línea!

Xcali
fuente
2

05AB1E , 53 bytes

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

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

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)

Vea esta sugerencia mía 05AB1E (secciones ¿Cómo comprimir enteros grandes? Y ¿Cómo comprimir listas enteras? ) Para comprender por qué •xþ¢*>ÌŸÑå#÷AUI'@æýXÁи<¥èå–ΘηžÎà₅åǚĕes 101629259357674935528492544214548347273909568347978482331029666966024823518105773925160y •xþ¢*>ÌŸÑå#÷AUI'@æýXÁи<¥èå–ΘηžÎà₅åǚĕ5вes [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
fuente
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

Un simple primer intento. Puse la mesa en un diccionario, recorrí la cadena, incrementé algunos contadores y devolví una tupla. La entrada es una cadena.

Pruébalo en línea!

bigyihsuan
fuente
1
¿Por qué no competir? Luce bien para mi.
ElPedro
1
¿Por qué el voto negativo sin un comentario?
ElPedro