Newsgroup: it.comp.lang.visual-basic
Titolo: [!] la settimana enigmistica del programmatore VB

A fare lunghi tragitti in treno senza nulla da fare vengono strani
pensieri... A me č venuto in mente un problema informatico, da risolvere
scrivendo un programma in VB. Una specie di quesito da settimana enigmistica
del programmatore:
-------------------------
Il giorno dell'esame di informatica, ti presenti in aula e ti siedi davanti
al tuo PC. Apri la busta e leggi il testo del problema:
"Problema: dato un array che contenga variant, scrivere una (o piů) routine
per accettare l'array come parametro e per ciascun dato dell'array
controllare la presenza della lettera "r" (minuscola o maiuscola) e
sostituirla con la lettera "f" minuscola."
Tra te e te pensi: "facile. Lo faccio in un attimo!". Poi guardi la tastiera
del tuo PC e ti accorgi che mancano i tasti delle lettere "W", "G" e "V", e
che i tasti "R" e "F" sono cosě rovinati che potrai premerli una volta sola
ciascuno prima che si rompano.
Non c'č il mouse e ovviamente mancando il tasto "V" anche il ctrl-v č
impossibile.
-------------------------
Ricapitolando: bisogna scrivere il suddetto programma senza che nel sorgente
siano presenti le lettere "W","G" e "V" (non importa se maiuscole o
minuscole) e usando una sola volta le lettere "R" e "F" (non importa se
maiuscole o minuscole)
Sembra facile...
Ciao
*Roby*
P.S.
E' un quesito "pulito", non servono trucchi strani, solo codice. Ovviamente
io la soluzione ce l'ho. :-)

 scrivendo un programma in VB.
Risolto, mi pare. Hai posta.
Ma stiamo bene? ;-))

 Ma stiamo bene? ;-))
Abbastanza, grazie. ;-)
Ciao
*Roby*

 Aspetto la prossima mail. :-)
Embè? Eccheccevò? Inviata.
Ma gli altri stanno a guardare e ridono? Senza pagare il biglietto?

 Ma gli altri stanno a guardare e ridono? Senza pagare il biglietto?
Magari dormono. :-)
Ciao
*Roby*

 E se fossero rotti anche tutti i tasti dei numeri da "9" a "2" compresi?
Da "9" a "2", non capisco quali altri sono compresi (ovvero non
utilizzabili)
Comunque, se mi lasci qualche cifra che non sia lo 0 soltanto, con un  po'
di +,-,*,/ dici che non si può fare lo stesso? ;-))

 E se fossero rotti anche tutti i tasti dei numeri da "9" a "2" compresi?
azz , allora scarto l'idea dei "ALT+ codice" ma ce la faro' anche io ....
aspetta il postino accanto a outlook ....

 di +,-,*,/ dici che non si puň fare lo stesso? ;-))
Facciamo cosě. Come numeri puoi usare solo "1", "2" e "3", e il "+" una
volta sola.
Vediamo se stavolta si riesce a rendere la sfida anche solo "leggermente"
impegnativa. :-)
Ciao
*Roby*

 impegnativa. :-)
vado a nanna adesso. mica come quelli del privato che (anche) il
sabato mattina dormono :P
intanto sto contando quanti post ci mettete ad arrivare alla regola
"e' possibile usare un solo carattere, una volta sola". con
dichiarazione di variabili non obbligatoria, spero.
buona, a.

 "e' possibile usare un solo carattere, una volta sola".
Se continua cosě, ora che di domattina abbiamo inserito anche una regola che
costringe a tenere spento il computer. :-)
Come dicevo via mail a Lupo, sarebbe stato sicuramente meglio se avessi
fatto qualche prova in piů prima di postare il problema. :-)
Ciao
*Roby*

 azz , allora scarto l'idea dei "ALT+ codice"
ALT+Codice? Ma le pensate proprio tutte per rovinarmi il giochino?!? :-)
Ciao
*Roby*

 ALT+Codice? Ma le pensate proprio tutte per rovinarmi il giochino?!? :-)
della mia soluzione in pvt che ne pensi ?

 impegnativa. :-)
Fatto.

Ah, a proposito, è ora che cambi la tastiera, neh?!

Ah, a proposito, è ora che cambi la tastiera, neh?!
L' avra' rovinata con le briciole cadute durante mentre mangiava
durante qualche rotfl :-)
-- 
ciao, hal

 durante qualche rotfl :-)
Shhhhhhhhhhht ... siamo in un aula di scuola durante un esame, non potete
parlare tra di voi ^_-
PS: Certo che il venerdi "sera" la maggiorparte dei programmatori esce fuori
di testa per eccesso di coding ^_^

 dichiarazione di variabili non obbligatoria, spero.
In effetti era questo lo scopo ultimo di Roberto.
Avendo un po' di codici nazionali di tastiera, non pensi che si possa fare?
Io, però, voglio la stanza imbottita e una camicia normale, quella senza
lacci.

 impegnativa. :-)
Rilancio (ma troppo facile): Non si puņ usare il +, nemmeno una volta.

 di testa per eccesso di coding ^_^
E io che pensavo di essere malato....
Ciao

"Roberto Piazzolla" ha scritto nel messaggio

No, pensano "ma dov'è il problema ?" :-PPPPPPPPP
Un Paperino che ha almeno tre idee diverse, e può (ha dovuto)
lavorare anche _senza la tastiera_. E' una rogna, ma si può. :-)
Bye, G.

 pensieri...
[snip]
Tiro fuori la mappa caratteri (in winXP c'è anche la tastiera "on-screen") e
uso quella.
Ciao

 lavorare anche _senza la tastiera_. E' una rogna, ma si puņ. :-)
ogni giorno lo fa la maggior parte dei fornai. pero' i pianisti non
potrebbero :>

 uso quella.
azz la mia proposta di prima e' impossbilie , gia' scrivendo
"byref" mi consuma la R auff...

 uso quella.
ma allora facciamola sporca sul serio :
1) non si puo' usare nessun tipo di cut&paste
2) non si possono usare i testi consigliati del vb , tantomeno
l'object.browser
Insomma si puo' solo scrivere codice e basta !
mo ce provo , vediamo se si puo' fare ^_^

 l'object.browser
Le mani le ho ancora o le ho perse nelle porte della metropolitana mentre
andavo all'università per il test?
Ciao

 uso quella.
Hai [snip]pato troppo. Diceva anche "non c'è il mouse".
Un Paperino che "però non ha nominato trackball, touchpad, touchscreen
nè il pirulicchio sulla tastiera" :-P

 Insomma si puo' solo scrivere codice e basta !
SpeechToText, PenWindow, VNC, BrainController ?
Un Paperino "Telepatia... ?".

 nè il pirulicchio sulla tastiera" :-P
Vogliamo riepilogare?
Impossibile usare W, G, V e F. (non si distingue fra maiuscoli e/o
minuscoli)
Impossibile usare 0, 4, 5, 6, 7, 8, 9.
E' possibile usare R una sola volta. (non si distingue fra maiuscolo o
minuscolo)
E' possibile usare + una sola volta (si può anche senza mai usare +)
Ci si riferisce al codice scritto e funzionante, comunque scritto.
L'assenza dei tasti era un modo di dire.
Good "coding" ;-)

andavo all'università per il test?
LOLLONE :-D

 Hai [snip]pato troppo. Diceva anche "non c'è il mouse".
Lo avevo considerato.
Non mi dire che non riusciresti ad arrivare alla mappa caratteri e ad usarla
con i soli tasti freccia, spazio e tastino windows.
Ciao

 L'assenza dei tasti era un modo di dire.
si ma non ho capito se posso usare il copia&incolla e il testo suggerito di
vb , in pratica basta premere me. per avere tutte le proprieta' della form ,
cosi basta scegliere chesso' "me.left" e cosi abbiamo la "F" che da tastiera
e' rotta e cosi via , quindi si arriva ad avere TUTTE LE LETTERE disponibili
, per i numeri basta usare espressioncine e si hanno tutti i numeri mancanti
avendo 1 e 2 funzionanti , quindi da ora in poi si tratta solo di copiare e
incollare , provero' a verificare quanti sono i cut&paste minimi cosi da
poter dire "RISOLTO IN 5 MOSSE" ghghgh

 SpeechToText, PenWindow, VNC, BrainController ?
bha , no no , intendevo soltanto scrivere codice senza spostarsi dal IDE e
senza usare il multitasking con altri programmi

 andavo all'università per il test?
diciamo che ti sei rotto le unghia delle dita A B e C e che puoi usare solo
una volta il pollice-opposto ma se non hai i funghi potresti usare i piedi
cosi da provocare una reazione soborifera-stordente contro la commissione
che ti valutera' con ottimi voti anche se il pc di riciclo dell'esame non lo
hai nemmeno acceso ^_^

 vb , in pratica basta premere me. per avere tutte le proprieta' della form
No, se no è troppo facile. :-)
Ciao
*Roby*

 E' possibile usare + una sola volta (si può anche senza mai usare +)
Ma usando il "-" (che basta usare 2 volte a fila per emulare un "+")...
La tua soluzione è perfetta partendo dalle premesse, ma in realtà non volevo
fare un quiz più per programmatori che per matematici. :-)
C'è infatti una soluzione che permette di evitare di usare qualunque
operazione matematica, tranne 1 solo "+".
Ciao
*Roby*

 andavo all'università per il test?
Hehehe. Non mi aspettavo che la cosa prendesse una piega così divertente.
:-)
Ciao
*Roby*


E con una coppia di mouse a cinque tasti che simulano due "Manone" TM su una
tastiera virtuale a video? ;)

Visto che me lo avete chiesto al Meeting, posto un messaggio a chiusura per
premiare i risolutori e postare la soluzione: Occhio, che sarà una roba
lunga.
Il quesito originario era: "bisogna scrivere il suddetto programma senza che
nel sorgente siano presenti le lettere "W","G" e "V" (non importa se
maiuscole o minuscole) e usando una sola volta le lettere "R" e "F" (non
importa se maiuscole o minuscole)
La soluzione che pensavo di ottenere alla fine era questa:
Sub cambia(c)
   d = LBound(c)
   Do
      c(d) = Replace(c(d), Mid$(MonthName(3), 3, 1), _
             Mid$(MonthName(2), 1,1), 1, , 1)
      d = d + 1
       if d > UBound(c) then exit do
   Loop
End Sub
In pratica la R si estrae da MonthName(3) ("Marzo") e la F da MonthName(2)
("febbraio"). Funziona di sicuro solo con SO italiani o inglesi, ma mi
pareva una idea carina.
Posto il quesito e iniziano ad arrivare le soluzioni. Prima menzione di
merito per Lupo, che ha risolto il mio primo quesito in un modo che non mi
aspettavo affatto.
Sub cambia(a())
    Dim n
    Dim c
    n = LBound(a) - 1
    Do Until n = UBound(a)
        n = n + 1
        c = 0
        Do Until c = Len(a(n))
            c = c + 1
            IF Asc(UCase(Mid(a(n), c, 1))) = 82 _
               Then Mid(a(n), c, 1) = ChR(102)
        Loop
    Loop
End Sub
In pratica non avevo pensato all'uso di Until, e avevo pensato che, date le
premesse, per uscire da un ciclo servisse una If, dato che la W di While non
si poteva usare. In questo caso la domanda sarebbe stata di più complessa
risoluzione. Per uscire dall'Impasse, ho vietato anche l'uso della F,
pensando di usare anche io l'Until.
Anche qui Lupo mi ha spiazzato con una modifica del sorgente originario
(riporto solo il ciclo interno):
        Do Until c = Len(a(n))
            c = c + 1
            Select Case Asc(UCase(Mid(a(n), c, 1)))
                Case 82
                    Mid(a(n), c, 1) = Chr(102)
            End Select
        Loop
Acc. Il select case invece dell'IF. Diabolico! Si stringono allora i limiti,
niente numeri dal 3 al 9. Sempre Lupo, con la sua puntuale soluzione, mi
frega modificando il solo Case:
                Case 100 - 10 - 10 + 1 + 1
                    Mid(a(n), c, 1) = Chr(100 + 1 + 1)
In preda a raptus, gli impongo di non usare nè R nè F (pensando che anche io
avrei potuto sostituire la Replace con un ciclo come aveva fatto lui).
Ecco qui il ciclo interno della sua risposta, ancora inaspettata, coi suoi
calcoli in ottale ed in esadecimale :
        Do Until c = Len(a(n))
            c = c + 1
            Select Case Asc(UCase(Mid(a(n), c, 1)))
                Case Val("&o122")
                    Mid(a(n), c, 1) = Chr(Val("&o123") _
                          + Val("&H13"))
            End Select
        Loop
Ancora più difficile. Ora viene concesso un  solo carattere "+". Però arriva
Moreno...
Sub sum(i%, j%, k)
    k = i + j
End Sub
Sub substch(ch$, ch1$)
    Dim a%
    Dim b%
    Dim c%
    Call sum(Asc("q"), 1, a)
    Call sum(33, 1, b)
    Call sum(b, b, c)
    Call sum(c, b, c)
    Select Case Asc(LCase(ch))
        Case a: ch1 = Chr(c)
        Case Else: ch1 = ch
    End Select
 End Sub
Sub cambia(a())
    Dim i%, j%, t%, t1%
    Dim s$, p$
    i = LBound(a)
    Call sum(UBound(a), 1, t1)
    Do
        Call sum(Len(a(i)), 1, t)
        j = 1
        s = ""
        p = ""
        Do
            Call substch(Mid(a(i), j, 1), s)
            p = p & s
            Call sum(j, 1, j)
        Loop Until j = t
        a(i) = p
        Call sum(i, 1, i)
    Loop Until i = t1
End Sub
Mi ha fregato anche lui! La Sub Sum permette di usare il "+" una volta sola
e la substch gestisce la replace egregiamente. Adesso li spiazzo tutti,
penso. Niente Asc nè Chr.
Ma riecco Moreno che mi stupisce ancora con una soluzione migliore della
mia, ottenuta cambiando la substch:
Sub substch(ch$, ch1$)
    Dim a%
    Call sum(13, 2, a)
    Select Case LCase(ch)
        Case Mid(TypeName(ch), 3, 1): ch1 = LCase(Hex(a))
        Case Else: ch1 = ch
    End Select
End Sub
Insomma, da TypeName(ch) (un variant) estrae la R e da Hex(15) estrae la F.
Funziona indipendentemente dalla lingua del SO, non usa neppure la R, ed è
meglio di quella che avevo pensato io.
Che dire, tanto di cappello. Il vincitore è Moreno.
Ringrazio comunque tutti quelli che hanno partecipato. Una bella prova da
parte di tutti.
Ciao
*Roby*
P.S.
Se mi viene in mente qualche altra fregnaccia del genere ci riproviamo?

Se mi viene in mente qualche altra fregnaccia del genere ci riproviamo?
sě, dai... tempo permattendo č molto divertente... :-)))
Complimenti per l'ideona!
Ciao,
Moreno
-- 
sirri at morenosoft dot com
Moreno Sirri VB Site - 
http://www.msvbsite.net
---------------------------------------------------------------------------
Le risposte alle tue domande le trovi sul Sito Comune di questo NewsGroup:
 
http://www.it-lang-vb.net
---------------------------------------------------------------------------

 Se mi viene in mente qualche altra fregnaccia del genere ci riproviamo?
Mammamia , certamente e' troppo intrigante sta cosa !