Mitä parannettavaa tässä on?
mjono = "pesukone" mjn = "" luvut = [] for x in range(len(mjono)): luvut.append(0) #Muodostetaan binaarilukuja ja sen avulla merkkijonoja. #1 tarkoittaa, että merkki tulostetaan. while (True): #Muutetaan ensin viimeistä numeroa ja sen jälkeen mahdollisesti edellä olevia if (luvut[len(luvut)-1] == 0): luvut[len(luvut)-1] = 1 #Muodostetaan luvuista merkkijono. mjn = "" for i in range(len(luvut)): if (luvut[i] == 1): mjn += mjono[i] print(luvut) print(mjn) x = len(luvut)-1 #Muutetaan edellä olevia lukuja. while (True): if (luvut[x] == 0): break if (x > 0): x -= 1 luvut[x] = 1 for y in range(x+1,len(luvut)): luvut[y] = 0 else: #Ei muuteta edellä olevia lukuja. luvut[len(luvut)-1] = 0 mjn = "" for i in range(len(luvut)): if (luvut[i] == 1): mjn += mjono[i] print(luvut) print(mjn) if (not(0 in luvut)): #Poistutaan silmukasta. break
En tiedä onko tarkoituksena vaan tulostaa kaikki osasanat vai onko järjestyksellä väliä. Vaihtoehtoinen lähestymistapa on osoitteessa https://www.geeksforgeeks.org/generate-all-the-binary-strings-of-n-bits/ .
luvut = [] for x in range(len(mjono)): luvut.append(0)
Tämän voi laittaa muotoon
luvut = [0]*len(mjono)
Varmasti makuasia, mutta Pythonissa ei ole pakko käyttää range(len)-rakennetta.
Koodistasi on vaikea käsittää, mitä siinä edes tehdään. Tämä on ehdottomasti erittäin huono asia ja koskee myös useimpia aikaisempia koodejasi. Koodista pitäisi pystyä ymmärtämään, mitä siinä tapahtuu ja mikä on koodin tavoite. Jos koodi on liian monimutkainen suoraan ymmärrettäväksi, kommenttien pitäisi selittää koodin toimintaa ja erityisesti koodin tarkoitusta. "Merkkijonojen muodostaminen binääriluvuista" on niin epäselvä kuvaus, että siitä ei voi arvata, mitä koodi oikeastaan tekee.
Koodisi myös jää ilmeisesti jumiin ikuiseen silmukkaan – korjaa ainakin tämä harjoituksena.
Käytät taulukkoa etkä binäärilukuja, ja tämän takia koodisi on sekava ja hidas. Oikeasti luvuilla koodista tulee lyhyt ja paljon nopeampi.
teksti = "pesukone" # Käydään läpi binääriluvut 1 – N. for luku in range(1, 2 ** len(teksti)): # Otetaan binääriluvun bittien mukaisesti merkkejä merkkijonosta. osa = "".join(teksti[-i - 1] for i in reversed(range(len(teksti))) if luku >> i & 1 == 1) print(osa)
Tai jos taulukkomuotoinen bittien tulostus on todella tarpeen:
teksti = "pesukone" for luku in range(1, 2 ** len(teksti)): bitit = [luku >> i & 1 for i in reversed(range(len(teksti)))] osa = "".join(teksti[i] for i in range(len(teksti)) if bitit[i] == 1) print(bitit) print(osa)
Yleinen sinun koodiesi vika on myös se, että niistä ei ole mitään hyötyä. Kokeile joskus tehdä jokin kokonainen ohjelma, jota voi käyttää johonkin järkevään tarkoitukseen.
luvut = [0,0,0,0,0,0] a = 0 #Tulostetaan binaarilukuja. while (True): #Lasketaan binaarilukuja kahden potenssien avulla. a += 1 print(luvut) if (a % 32 == 0): luvut[0] = 1 for x in range(1,len(luvut)): luvut[x] = 0 elif (a % 16 == 0): luvut[1] = 1 for x in range(2,len(luvut)): luvut[x] = 0 elif (a % 8 == 0): luvut[2] = 1 for x in range(3,len(luvut)): luvut[x] = 0 elif (a % 4 == 0): luvut[3] = 1 for x in range(4,len(luvut)): luvut[x] = 0 elif (a % 2 == 0): luvut[4] = 1 for x in range(5,len(luvut)): luvut[x] = 0 elif (a % 1 == 0): luvut[5] = 1 if (luvut[0] == 1): break
#include <iostream> using namespace std; int main(){ //Seuraavan neljän luvun avulla yritetään laskea suuremmat binaarit. int bin_2 = 0; int bin_4 = 0; int bin_8 = 0; int bin_16 = 0; int luvut[5] = {0,0,0,0,0}; while (luvut[0] < 1){ luvut[4]=1; bin_2++; bin_4++; bin_8++; bin_16++; //Katsotaan, muutetaanko suurempia lukuja. if (bin_16 == 16){ luvut[0]=1; luvut[1]=0; luvut[2]=0; luvut[3]=0; luvut[4]=0; bin_16=0; bin_8=0; bin_4 = 0; bin_2 = 0; } else if (bin_8 == 8){ luvut[1]=1; luvut[2]=0; luvut[3]=0; luvut[4]=0; bin_8=0; bin_4=0; bin_2=0; } else if (bin_4 == 4){ luvut[2]=1; luvut[3]=0; luvut[4]=0; bin_4=0; bin_2=0; } else if (bin_2 == 2){ luvut[3]=1; luvut[4]=0; bin_2=0; } for (int x = 0; x < 5; x++){ cout << luvut[x] << " "; } cout << endl; } return 0; }
Aihe on jo aika vanha, joten et voi enää vastata siihen.