Miten saisin että ohjelma lisää textboxiin randomisti "sanan"?
"Sana" meinaa kaikkea mahdollista tekstiä minkä voi kirjoittaa näppäimistöllä esim "SO<o2q34e9 '¤&[@£/_" tai "mO1 =}20$€".
Haluaisin siis että se kirjoittaa kaikki mahdolliset enintään 20 merkkiä pitkät "sanat" textboxiin eri riveille.
Esimerkki:
Private Sub Ajastin_Timer () 'Text1.Textiin lisätään rivi ja RandomSana Text1.Text = Text1.Text & vbCrlF & RandomSana 'Jos kaikki mahdolliset on lisätty niin lopetetaan If RandomSana.Valmis = True Then Ajastin.Enabled = False End If End Sub
Jossain vain pitäisi määritellä mikä on "RandomSana", mutta mikä/miten?
Tarkastellaan kolmen merkin pituisia sanoja, joissa voi olla kolme erilaista merkkiä (A, B ja C):
AAA BAA CAA AAB BAB CAB AAC BAC CAC ABA BBA CBA ABB BBB CBB ABC BBC CBC ACA BCA CCA ACB BCB CCB ACC BCC CCC
Tässä näkyy sanojen muodostustapa. Ensimmäisen merkin voi valita kolmella tavalla, samoin toisen ja kolmannen. Yhteensä sanoja on siis 3 * 3 * 3 = 27.
Tässä on yleiskäyttöinen ohjelma, joka luo listan tietyn pituisista sanoista, joissa on tiettyjä merkkejä. Sanan pituuden ja merkistön pystyy valitsemaan ohjelman alussa:
Const MERKIT = "ABC" ' käytettävät merkit Const PITUUS = 3 ' sanan pituus Sub kerros(kohta As Integer, sana As String) Dim i As Integer If kohta > PITUUS Then ' lisätään listalle oikeanpituinen sana List1.AddItem sana Else ' käydään läpi kaikki sallitut merkit For i = 1 To Len(MERKIT) kerros kohta + 1, sana & Mid(MERKIT, i, 1) Next End If End Sub Private Sub Form_Load() Caption = "Sanojen määrä: " & (Len(MERKIT) ^ PITUUS) kerros 1, "" End Sub
Ohjelman toiminta perustuu siihen, että jokainen sanan merkki on vuorollaan yksi sallituista merkeistä. Rekursiivinen aliohjelma valitsee aina yhden merkin ja kutsuu sen jälkeen itseään.
Ohjelma laskee sanojen määrän suoraan kaavalla mp, jossa m on mahdollisten merkkien määrä ja p on sanan pituus. Kun merkistö ja sanan pituus suurentuu, sanojen määrä kasvaa nopeasti. Esim. kahdeksan merkin pituisia sanoja kirjaimista A, B, C, D, E ja F voidaan muodostaa jo 68 = 1679616.
Tässä kyllä sanat muodostetaan järjestyksessä eikä satunnaisesti, mutta moinen tuskin haittaa.
Kiitos! Yritän tosta vääntää jotain, mutta se tilttas kun laitoin niinkuin halusin että kirjoittaa kaikki mahdolliset 20 sanan pituiset "sanat"?
Johtuu luultavasti siitä, että sellaisia sanoja on liian paljon. Jos merkkejä on esim. 50 ja sanan pituus 20, sanoja on 5020 = 9536743164062500000000000000000000. Näin monta sanaa ohjelma ei mitenkään pysty muodostamaan eikä näyttämään.
Antti Laaksonen kirjoitti:
Johtuu luultavasti siitä, että sellaisia sanoja on liian paljon. Jos merkkejä on esim. 50 ja sanan pituus 20, sanoja on 5020 = 9536743164062500000000000000000000. Näin monta sanaa ohjelma ei mitenkään pysty muodostamaan eikä näyttämään.
Miten saisin että se tekee tuon ajastimessa? 1 "sana" millisekunnissa niin ei tilttais.
Laitoin siihen alkuun, sillon kun tilttas:
Const MERKIT = "QqWwEeRrTtYyUuIiOoPpÅåAaSsDdFfGgHhJjKkLlÖöÄäZzXxCcVvBbNnMm,;.:-_½!#¤%&/()=?`´§@£$€{[]}\~^¨*'" ' käytettävät merkit Const PITUUS = 20 ' sanan pituus
Tiedätkös, yksi sana millisekuntissa, niin tuolla merkistöllä (92 merkkiä) jo kaikkien kuuden merkin mittaisten sanojen muodostaminen kestää vaatimattomat 19,2 vuotta. Tämä on tietenkin täysin teoreettista, koska 160 gigatavun kovalevylle mahtuu vain 4,7% näistä.
20 merkin sanoilla taasen muodostaminen tuolla vauhdilla kestäisi liki 60000 kvadriljoona vuotta, ja muistia niille tarvittaisiin reilut 10544061 jottatavua (siis 10,5 kvintiljoonaa tavua).
Metabolix kirjoitti:
Tiedätkös, yksi sana millisekuntissa, niin tuolla merkistöllä (92 merkkiä) jo kaikkien kuuden merkin mittaisten sanojen muodostaminen kestää vaatimattomat 19,2 vuotta. Tämä on tietenkin täysin teoreettista, koska 160 gigatavun kovalevylle mahtuu vain 4,7% näistä.
20 merkin sanoilla taasen muodostaminen tuolla vauhdilla kestäisi liki 60000 kvadriljoona vuotta, ja muistia niille tarvittaisiin reilut 10544061 jottatavua (siis 10,5 kvintiljoonaa tavua).
Ai.
Miten saisin sitten niin että se laittais ajastimessa yhden kerrallaan vanhan tilalle.
Mikä järki?
T.M. kirjoitti:
Mikä järki?
En kerro. =P
Haluut kovispahistella bustaamalla kaveris salasanan o/
Niijoo... mut on noihin valmiita ohjelmiakin :P
T.M. kirjoitti:
Niijoo... mut on noihin valmiita ohjelmiakin :P
En löytäny.
Kuule kulma!
Leiki tällä:
Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer) Static merkkijono As String, laskuri1 As Integer, laskuri2 As Integer Randomize If laskuri1 = 0 Then laskuri1 = CInt(Rnd(20) * 20) End If If laskuri2 <= laskuri1 and laskuri1 > 0 Then merkkijono = merkkijono + Chr$(CInt(Rnd(KeyCode) * KeyCode)) laskuri2 = laskuri2 + 1 ElseIf laskuri2 > laskuri1 Then Label1.Caption = Label1.Caption & merkkijono & vbCrLf laskuri1 = 0: laskuri2 = 0: merkkijono = "" End If End Sub
Ei tehny mitään ku laitoin form_loadiin.
No ei varmaankaan, tuohan tekee jotakin painalluseventin KeyCode-muuttujan kanssa.
Sanan saa edellisen tilalle, kun vaihtaa listaan lisäämisen paikalle vaikkapa sijoituslauseen, jossa laittaa sen edellisen tilalle.
Koeta nyt uskoa jo, että ei ole mitään järkeä yrittääkään käydä läpi kaikkia tuollaisia. Katso vaikka tähän mennessä annettuja vuosimääriä ja mieti sitten.
Tää juttu alkaa olla tasoa http://thedailywtf.com
Aihe on jo aika vanha, joten et voi enää vastata siihen.