Linea alfanumerica e conteggio delle curve


10

Data una stringa di input, scrivere un programma che emetta il numero totale di linee e curve che ha.

La sfida

  • Prendi input da STDINo qualsiasi altro metodo di input.
  • Output verso STDOUTo qualsiasi altro metodo di output, il numero totale di linee e curve contenute nella stringa, in quell'ordine , in base alla tabella seguente nello snippet di codice.
  • Qualsiasi carattere non alfanumerico deve essere ignorato.
  • Sono vietate le scappatoie standard .
  • Questo è , quindi vince il codice più corto.

chiarimenti

  • Le linee e le curve sono determinate dal font usato su Stackexchange per code blocks.
  • I cerchi (come O, o, 0) e i punti ( i, j), sono considerati come 1 curva ciascuno.
  • L'input può essere una stringa, un elenco di caratteri, un flusso di caratteri, bytecode ecc.
  • L'uscita può essere un array di interi, tupla di interi, stringhe separate da virgole, ecc I due numeri devono essere separati, quindi 104non è valida, ma 10,4, 10 4, 10\n4, [10,4], (10, 4), e così via è.
  • La direzione e il trailing degli spazi bianchi è perfettamente accettabile.

Ingresso e uscita campione

# 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

Tabella dei personaggi

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
Cosa conta come una linea e una curva? Sono s2 curve o 1? Lo stelo è jsia una linea che una curva? Sarebbe meglio se potessi semplicemente elencare i valori richiesti per tutte le lettere.
— Ad Hoc Garf Hunter,

4
Davvero non capisco i voti negativi su questo. Per me questa è una sfida ben specificata con buoni casi di test, un'implementazione di riferimento e una tabella di quali valori sono attesi (se sono tecnicamente giusti o logori è una questione di opinione personale ma nulla a che fare con la sfida). Input e l'output è flessibile. Se qualcuno può spiegare cosa c'è che non va in questo, sarei molto grato.
— ElPedro,

3
Potete per favore fornire i valori per ciascun personaggio in un formato che possiamo copiare più facilmente; lo snippet è del tutto inutile.
— Shaggy,

4
odovrebbe essere 0 righe, 1 curva
— Giuseppe

2
Continua dall'alto ... I downgrade senza feedback danno all'OP poche possibilità di migliorare le proprie sfide in futuro.
— ElPedro,

Risposte:


8

Haskell, 214 199 188 175 byte

 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)

Provalo online!

I numeri di linee e curve sono le cifre dei numeri di base 5 e memorizzati come numeri di base 16. La funzione si gtraduce in base-5.

Modifica: -13 byte grazie a @cole.


1
169 byte se è possibile prendere un elenco di codici caratteri. Esplorando il porting di questo alla variante di stringa ...
— Cole

1
175 byte se devi usare le stringhe (ho cancellato il mio commento precedente da quando ho giocato a 3 byte banali).
— Cole

@cole: grazie per i miglioramenti. Andare con un elenco di numeri interi è come imbrogliare, perché la sfida è taggata come "stringa". D'altra parte, le regole consentono "bytecodes" come formato di input valido. Tuttavia, molte altre risposte usano anche una sorta di conversione char -> integer. Non so cosa fare.
— nimi,

6

05AB1E , 78 69 65 byte

-4 byte grazie a Kevin Cruijssen, vai e dai un'occhiata alla sua risposta 05AB1E ancora migliore

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

Provalo online!

Output come [Curve, Line]

Sto davvero male a 05AB1E che ho appena scoperto. Posso sicuramente salvare più byte se riesco a fare 05AB1E da fare èattraverso il mio elenco di elenchi


Spiegazione

ž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
L'output è invertito. Dovrebbe essere line curve, no curve line.
— bigyihsuan,

1
L'output può essere una matrice di numeri interi, tupla di numeri interi, stringa separata da virgola, ecc. I due numeri devono essere separati @bigyihsuan sono separati, non vedo quale sia il problema
— Dati scaduti

1
Le regole dicono Output to STDOUT, or any other output method, the total number of lines and curves contained in the string, in that order. Nota in that ordercosì line curve.
— bigyihsuan,

2
Concordo con @ExpiredData su questo. Forse specificare nella sfida che l'ordine dovrebbe essere indicato nella risposta. Sarebbe abbastanza per cavarsela.
— ElPedro,

1
53 byte (e con [Line, Curve]come ordine di output, anche se coincidente e non intenzionale).
— Kevin Cruijssen,

5

Gelatina , 45 byte

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

Un collegamento monadico che accetta un elenco di caratteri che produce un elenco di (due) numeri interi.

Provalo online! Oppure vedi la suite di test .

Come?

Ø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 byte

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

Provalo online!

Non così piccolo, probabilmente può essere ulteriormente giocato a golf.
Nota: il valore letterale di stringa di 52 caratteri è come un dizionario che associa un carattere a un altro carattere che indica il numero di linee e curve secondo la seguente tabella:

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

Python 2 , 159 154 byte

Per ogni carattere viene lines*4 + curvesassegnato un valore compreso tra 0 e 16. Base-36 viene utilizzato per codificare questi valori (1 carattere = 1 valore).

-5 byte grazie a @Chas Brown

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

Provalo online!

Python 2 , 141 byte

Questa è una porta della mia soluzione Python3. Questa versione genera un elenco di long ints, quindi appare [4L, 2L]invece di [4, 2].

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

Provalo online!


2
154 byte usando base36 e '/'<x<'{'invece di x.isalnum().
— Chas Brown,

1
@Chas Brown grazie! Ci stavo anche pensando '/'<x<'{', ma ho cercato di esprimerlo per sbarazzarmi di me if.
— Daniil Tutubalin,

4

Gelatina , 51 byte

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

Provalo online!

Un collegamento monadico che accetta una stringa come input e restituisce un elenco di numeri interi come [lines, curves]



4

Retina 0.8.2 , 160 byte

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

Provalo online! Il link include casi di test. Spiegazione:

$
¶$`

Duplica la stringa di input.

T`dLl`13103202003101432331324301020202443301011111313332011101124413`^.*

Conta le linee di ogni personaggio sulla prima riga.

T`dLl`10120110210211001001000011211010000021111121120021111111100010`.*$

Conta le curve di ogni personaggio sulla seconda riga.

.
$*
%`1

Somma le cifre separatamente su ogni riga.


4

R , 164 153 byte

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




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

Provalo online!

Ho avuto la stessa idea, come risposta di Nome del modello utilizzando una codifica di base 5, ma codifica come caratteri ASCII invece di base 16. Usi nomatch = 0in matchquello di eliminare i caratteri non alfanumerici.

Ritorni curves lines.


4

Carbone , 60 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

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

Questa è una matrice di due stringhe 13103202000101111131333201110112441331014323313243010202024433e 10120110212111112112002111111110001002110010010000112110100000. Le stringhe vengono quindi mappate.

Φθ№⭆ι⍘ξφλ

Gli elementi dell'input vengono filtrati in base al fatto che siano contenuti all'interno dei (62) caratteri dell'alfabeto di conversione base predefinito.

⭆...§ι⍘λφ

Gli elementi rimasti vengono quindi convertiti dalla base (62) e questo viene quindi indicizzato nella stringa mappata.

I...Σ...

Le cifre vengono sommate e riportate alla stringa per la stampa implicita.


4

Python 3 , 165 159 148 146 byte

Per ogni carattere (incluso non alfanumerico) si lines*3 + curvesottiene un valore compreso tra 0 e 12, quindi è possibile utilizzare un numero lungo di base 13 per codificare i dati. Per renderlo più breve viene convertito in base-36.

Grazie a @Chas Brown per ottimi consigli.

-2 byte convertendo lambda in programma.

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

Provalo online!


4

Python 2 , 179 166 165 163 byte

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

Provalo online!

Restituisce un elenco [curves, lines].


3

Python 2 , 525 byte

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

Provalo online!

Approccio simile all'implementazione di riferimento ma leggermente più breve.



2
Ci ho pensato mentre stavo
— bevendo

1
@HermanL Sentiti libero di pubblicare come risposta. Non ho tempo per aggiornare questa vigilia.
— ElPedro,

2
265 byte con un po 'più di golf ...
— Chas Brown,


2

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

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

Provalo online!


2

05AB1E , 53 byte

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

Provalo online o verifica tutti i casi di test .

Spiegazione:

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

Vedi questo mio suggerimento 05AB1E (sezioni Come comprimere numeri interi grandi? E Come comprimere elenchi di numeri interi? ) Per capire perché •xþ¢*>ÌŸÑå#÷AUI'@æýXÁи<¥èå–ΘηžÎà₅åǚĕè 101629259357674935528492544214548347273909568347978482331029666966024823518105773925160ed •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 byte

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 semplice primo tentativo. Misi la tabella in un dizionario, scorrei la stringa, incrementai alcuni contatori e restituii una tupla. L'input è una stringa.

Provalo online!


1
Perché non competere? Mi sta bene.
— ElPedro,

1
Perché il downvote senza un commento?
— ElPedro,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.