Comptage alphanumérique de lignes et de courbes

10

Étant donné une chaîne d'entrée, écrivez un programme qui génère le nombre total de lignes et de courbes qu'il possède.

Le défi

  • Prendre des entrées à partir de STDIN, ou toute autre méthode d'entrée.
  • Sortie vers STDOUT, ou toute autre méthode de sortie, le nombre total de lignes et de courbes contenues dans la chaîne, dans cet ordre , en fonction du tableau ci-dessous dans l'extrait de code.
  • Tous les caractères non alphanumériques doivent être ignorés.
  • Les failles standard sont interdites.
  • C'est le , donc le code le plus court l'emporte.

Clarifications

  • Les lignes et les courbes sont déterminées par la police utilisée sur Stackexchange pour code blocks.
  • Les cercles (comme O, o, 0) et les points ( i, j) sont considérés comme une courbe chacun.
  • L'entrée peut être une chaîne, une liste de caractères, un flux de caractères, des bytecodes, etc.
  • La sortie peut être un tableau d'entiers, tuple d'entiers, chaîne séparés par des virgules, etc. Les deux numéros doivent être séparés, donc 104n'est pas valable, mais 10,4, 10 4, 10\n4, [10,4], (10, 4), etc. est.
  • L'espace de tête et de fuite est parfaitement acceptable.

Exemple d'entrée et de sortie

# 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

Table de caractères

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
la source
2
Qu'est-ce qui compte comme une ligne et une courbe? Est-ce que s2 courbes ou 1? La tige est-elle à la jfois en ligne et en courbe? Il serait préférable de simplement lister les valeurs requises pour toutes les lettres.
Ad Hoc Garf Hunter
4
Je ne comprends vraiment pas les downvotes sur celui-ci. Pour moi, c'est un défi bien spécifié avec de bons cas de test, une implémentation de référence et un tableau des valeurs attendues (qu'elles soient techniquement correctes ou usées) est une question d'opinion personnelle mais n'a rien à voir avec le défi). les sorties sont flexibles. Si quelqu'un peut expliquer ce qui ne va pas, je vous en serais très reconnaissant.
ElPedro
3
Pouvez-vous s'il vous plaît fournir les valeurs de chaque caractère dans un format que nous pouvons copier plus facilement; l'extrait de code est totalement inutile.
Shaggy
4
odevrait être 0 lignes, 1 courbe
Giuseppe
2
Suite d'en haut ... Les votes négatifs sans rétroaction donnent à OP peu de chances d'améliorer ses défis à l'avenir.
ElPedro

Réponses:

8

Haskell, 214 199 188 175 octets

 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)

Essayez-le en ligne!

Les nombres de lignes et de courbes sont les chiffres des nombres en base 5 et stockés en tant que nombres en base 16. La fonction se gtraduit en base-5.

Edit: -13 octets grâce à @cole.

nimi
la source
1
169 octets si vous pouvez prendre une liste de charcodes. Je vais explorer le portage de ceci vers la variante de chaîne…
cole
1
175 octets si vous devez utiliser des chaînes (supprimé mon commentaire précédent depuis que j'ai joué à 3 octets triviaux).
cole
@cole: merci pour les améliorations. Aller avec une liste d'entiers, c'est comme tricher, parce que le défi est étiqueté comme "chaîne". D'un autre côté, les règles autorisent les "bytecodes" comme format d'entrée valide. Cependant, de nombreuses autres réponses utilisent également une sorte de conversion char -> integer. Je ne sais pas quoi faire.
nimi
6

05AB1E , 78 69 65 octets

-4 octets grâce à Kevin Cruijssen, allez voir sa meilleure réponse 05AB1E

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

Essayez-le en ligne!

Sorties comme [Courbe, Ligne]

Je suis vraiment mauvais à 05AB1E, je viens de le découvrir. Peut certainement économiser plus d'octets si je peux obtenir 05AB1E à faire èdans ma liste de listes


Explication

ž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
Données expirées
la source
1
Votre sortie est inversée. Ça devrait l'être line curve, non curve line.
bigyihsuan
1
La sortie peut être un tableau d'entiers, tuple d'entiers, chaîne séparés par des virgules, etc. Les deux numéros doivent être séparés @bigyihsuan ils sont séparés, je ne vois pas quel est le problème
données expiré
1
Les règles le disent Output to STDOUT, or any other output method, the total number of lines and curves contained in the string, in that order. Notez le in that order, donc line curve.
bigyihsuan
2
Je serais d'accord avec @ExpiredData sur celui-ci. Peut-être spécifier dans le défi que l'ordre doit être indiqué dans la réponse. Ce serait suffisant pour s'en sortir.
ElPedro
1
53 octets (et avec [Line, Curve]comme ordre de sortie, bien que ce soit une coïncidence et non intentionnelle).
Kevin Cruijssen
5

Gelée , 45 octets

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

Un lien monadique acceptant une liste de caractères qui donne une liste de (deux) entiers.

Essayez-le en ligne! Ou consultez la suite de tests .

Comment?

Ø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
la source
5

Scala , 235 octets

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

Essayez-le en ligne!

Pas si petit, peut probablement être joué plus loin.
Remarque: Le littéral de chaîne de 52 caractères est comme un dictionnaire qui mappe un caractère à un autre caractère qui dénote le nombre de lignes et de courbes selon le tableau suivant:

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
chariot813
la source
5

Python 2 , 159 154 octets

Pour tout caractère lines*4 + curvesdonne une valeur de 0 à 16. La base-36 est utilisée pour coder ces valeurs (1 caractère = 1 valeur).

-5 octets grâce à @Chas Brown

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

Essayez-le en ligne!

Python 2 , 141 octets

Il s'agit d'un portage de ma solution Python3. Cette version affiche une liste de longs caractères, donc elle ressemble à la [4L, 2L]place de [4, 2].

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

Essayez-le en ligne!

Daniil Tutubalin
la source
2
154 octets utilisant base36 et '/'<x<'{'au lieu de x.isalnum().
Chas Brown
1
@Chas Brown merci! J'y pensais aussi '/'<x<'{', mais j'ai essayé de l'exprimer pour m'en débarrasser ifaussi.
Daniil Tutubalin
4

Gelée , 51 octets

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

Essayez-le en ligne!

Un lien monadique qui prend une chaîne en entrée et renvoie une liste d'entiers comme [lines, curves]

Nick Kennedy
la source
4

JavaScript (Node.js) , 251 219 217 octets

-34 octets de @Expired Data : 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]

Essayez-le en ligne!

Luis felipe De jesus Munoz
la source
2
217 octets en fait
Données expirées le
4

Retina 0.8.2 , 160 octets

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

Essayez-le en ligne! Le lien inclut des cas de test. Explication:

$
¶$`

Dupliquez la chaîne d'entrée.

T`dLl`13103202003101432331324301020202443301011111313332011101124413`^.*

Comptez les lignes de chaque personnage sur la première ligne.

T`dLl`10120110210211001001000011211010000021111121120021111111100010`.*$

Comptez les courbes de chaque personnage sur la deuxième ligne.

.
$*
%`1

Additionnez les chiffres séparément sur chaque ligne.

Neil
la source
4

R , 164 153 octets

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




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

Essayez-le en ligne!

J'ai eu la même idée que la réponse de Nimi en utilisant une base 5 encodage mais code sous forme de caractères ASCII au lieu de la base 16. Les utilisations nomatch = 0en matchéliminer les caractères non-alphanumériques.

Retours curves lines.

Giuseppe
la source
4

Charbon de bois , 60 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

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

Il s'agit d'un tableau de deux chaînes 13103202000101111131333201110112441331014323313243010202024433et 10120110212111112112002111111110001002110010010000112110100000. Les chaînes sont ensuite mappées.

Φθ№⭆ι⍘ξφλ

Les éléments de l'entrée sont filtrés pour savoir s'ils sont contenus dans les (62) caractères de l'alphabet de conversion de base par défaut.

⭆...§ι⍘λφ

Les éléments qui restent sont ensuite convertis à partir de la base (62) et ceci est ensuite indexé dans la chaîne mappée.

I...Σ...

Les chiffres sont additionnés et convertis en chaîne pour une impression implicite.

Neil
la source
4

Python 3 , 165 159 148 146 octets

Pour tout caractère (y compris non alphanumérique) lines*3 + curvesdonne une valeur de 0 à 12, nous pouvons donc utiliser un long numéro de base 13 pour coder les données. Pour le raccourcir, il est converti en base-36.

Merci à @Chas Brown pour ses bons conseils.

-2 octets en convertissant lambda en programme.

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

Essayez-le en ligne!

Daniil Tutubalin
la source
4

Python 2 , 179 166 165 163 octets

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

Essayez-le en ligne!

Renvoie une liste [curves, lines].

Chas Brown
la source
3

Python 2 , 525 octets

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

Essayez-le en ligne!

Approche similaire à l'implémentation de référence mais un peu plus courte.

ElPedro
la source
3
283 octets
Herman L
2
J'y ai pensé pendant que je
buvais une bière bien méritée
1
@HermanL N'hésitez pas à publier votre propre réponse. Je n'ai pas le temps de mettre à jour cette veille.
ElPedro
2
265 octets avec un peu plus de golf ...
Chas Brown
2
231 octets
wilkben
2

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

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

Essayez-le en ligne!

Xcali
la source
2

05AB1E , 53 octets

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

Essayez-le en ligne ou vérifiez tous les cas de test .

Explication:

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)

Voir cette astuce 05AB1E (sections Comment compresser les grands entiers? Et Comment compresser les listes d'entiers? ) Pour comprendre pourquoi •xþ¢*>ÌŸÑå#÷AUI'@æýXÁи<¥èå–ΘηžÎà₅åǚĕest 101629259357674935528492544214548347273909568347978482331029666966024823518105773925160et •xþ¢*>ÌŸÑå#÷AUI'@æýXÁи<¥èå–ΘηžÎà₅åǚĕ5вest [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
la source
1

Python 3 , 697 octets

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

Une première tentative simple. J'ai mis la table dans un dictionnaire, parcouru la chaîne, incrémenté certains compteurs et renvoyé un tuple. L'entrée est une chaîne.

Essayez-le en ligne!

bigyihsuan
la source
1
Pourquoi ne pas concurrencer? Ça me va bien.
ElPedro
1
Pourquoi le downvote sans commentaire?
ElPedro