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.