Data una stringa di cifre, produci in output tutte le sottostringhe contigue di lunghezza n in quella stringa, nell'ordine in cui compaiono.
Per esempio, la stringa «49142» ha le seguenti serie di 3 cifre:
E le seguenti serie di 4 cifre:
E se chiedi una serie di 6 cifre da una stringa di 5 cifre, ti meriti quello che ti capita.
Tieni presente che queste serie devono solo occupare posizioni adiacenti nell'input; le cifre non devono essere numericamente consecutive.
Definisci due funzioni: (Due? Sì, a volte chiediamo di più a Go.)
All restituisce un array di tutte le sottostringhe di s di lunghezza n.
All(n int, s string) []string
UnsafeFirst restituisce la prima sottostringa di s di lunghezza n.
UnsafeFirst(n int, s string) string
A questo punto potresti considerare concluso questo esercizio e passare oltre.
Ma aspetta, forse ti stai ponendo una domanda ragionevole: perché la funzione si chiama Unsafe First? Se ti interessa, continua a leggere per un esercizio bonus.
Una volta che go test passa, prova go test -tags asktoomuch.
Questo usa un build tag per abilitare un test che prima non era abilitato.
I build tag permettono di selezionare i file che il pacchetto deve usare.
Nel nostro caso controllerà quali file di test vengono usati.
Puoi leggere di più in proposito nella documentazione di Go.
Potresti accorgerti che non riesci a far contento questo test asktoomuch. Ci serve un modo per segnalare che in alcuni casi non puoi prendere i primi N caratteri della stringa. UnsafeFirst non può farlo, dato che restituisce solo una stringa.
Per risolvere, aggiungiamo un altro valore restituito alla funzione.
Definisci First(int, string) (first string, ok bool) e prova con go test -tags first.
Il secondo valore restituito, ok bool, è un pattern comune e idiomatico in Go.
Per esempio lo vedi nelle ricerche nelle map e nelle type assertion.
Iscriviti a Exercism per imparare e padroneggiare Go con 34 concetti165 esercizi e il mentoring di persone reali, tutto gratis.