aris
September 11, 2012, 10:22am
1
Una stringa può essere di lunghezza variabile e parzialmente riempita
con una data nel formato GGMMAA, esempio con due date.
str = ‘190611250412000000000000’
devo trasformarla in un array ed in ogni elemento una data, scartando il
resto:
[‘190611’,‘250412’]
come faccio ad ottenere questo risultato con una sola riga di codice?
triplem
September 11, 2012, 10:31am
2
Scusa ma la “lunghezza variabile” solo un riempimento di zeri o sono
numeri randomici?
–
Matteo L.
triplem
September 11, 2012, 10:33am
3
Direi che l’elemento chiave e’ il doppio zero (00)
in quanto non ci sono date con 00 (almeno fino al 2100 ) per quanti anni
ti serve?
triplem
September 11, 2012, 10:41am
4
Tests con http://rubular.com/
(\d{6}) e poi rimuovi i gruppi con 000000
non e’ un oneline ma per me funzia.
triplem
September 11, 2012, 10:44am
5
una soluzione un po’ hardcoded, potrebbe essere questa:
“190611250412000000000000”.split(/([0-9]{6})/).reject {|t| t.size != 6 || t ==
‘000000’ }
=> [“190611”, “250412”]
dipende se il “resto” composto da soli zeri, e le date sono sempre
formate da
gruppi di 6 numeri
ciao,
A.
Il 11/09/2012 10:22, Marco M. ha scritto:
triplem
September 11, 2012, 10:39am
6
Si variabile con solo zeri a porzioni di 6
triplem
September 11, 2012, 11:03am
7
L’ultima è perfetta e mi piacerebbe capire perchè scarta i blocchi con
gli zeri.
@Davide
Grazie per il sito, per check veloci è molto comodo. Come alternativa io
creo un file di testo e ci ficco dentro tutti i possibili casi poi li
testo con l’editor in modalità regexp.
Grazie comunque ad entrambi, mi avete evitato un bel mal di testa!
triplem
September 11, 2012, 11:12am
8
Anzi non funziona, mostra sempre il primo blocco. Comunque grazie
ugualmente per lo spunto
triplem
September 11, 2012, 10:50am
9
soluzione leggermente pi elegante
“190611250412000000000000”.match(/(\d{6})/).to_a
=> [“190611”, “190611”]
ciao,
A.
triplem
September 11, 2012, 11:25am
10
An the winner is:
“190611250412000000000000”.scan(/\d{6}/).reject{|t| t.size != 6 || t ==
‘000000’ }
con scan .
=> [“190611”, “250412”]
Ciao
Davide
sono bravo? eh sono bravo? dai ditemi che sono bravo!
triplem
September 11, 2012, 11:34am
11
Il 11/09/2012 11:07, Davide R. ha scritto:
bug! ritorna due volte 190611 e skippa 250412
ahaha! che cantonata che ho preso, troppo di corsa. spero comunque che
tu abbia
trovato un po’ di spunti in merito
A.
triplem
September 11, 2012, 11:20am
12
bug! ritorna due volte 190611 e skippa 250412
triplem
September 11, 2012, 11:36am
13
il mio funziona ed e’ un one liner. Devi usare scan
“190611250412000000000000”.scan(/\d{6}/).reject{|t| t.size != 6 || t ==
‘000000’ }
=> [“190611”, “250412”]
Davide
triplem
September 11, 2012, 12:15pm
14
Si Andrea, grazie del prezioso contributo.
Davide, lasciando per un momento da parte la modestia, la tua soluzione
funziona e la preferisco in questa variante:
“190611250412000000000000”.scan(/\d{6}/).select{|t| regexp === t}
dove regexp controlla anche il formato delle date:
regexp = /(0[1-9]|[12]\d|3[01])(0[1-9]|1[012])(\d[1-9]|[1-9]0)/
la regexp di controllo l’ho creata io dalle mie umili basi, non l’ho
testata bene e non so forse si può migliorare
triplem
September 11, 2012, 12:27pm
15
la modestia e’ per i deboli, come anche i test:
http://gradha.sdf-eu.org/textos/klingon_programmer.en.html
W i klingon!
(scusate momento troll)
triplem
September 11, 2012, 5:01pm
16
la modestia e’ per i deboli, come anche i test:
ecco un esempio dei miei tests: http://pastie.org/4702099
triplem
September 11, 2012, 12:35pm
17