[Python] Hoe door alfabet iteraten

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • ironheart
  • Registratie: September 2022
  • Laatst online: 29-09 12:45
Wat wil ik bereiken:
Door een list iteraten beginnende bij één teken en eindigen bij een maximaal aantal tekens van deze list.

Wat heb ik tot nu toe:
code:
1
2
3
4
5
6
7
8
9
10
11
alfabet = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","0","1","2","3","4","5","6","7","8","9"]

for a in alfabet:
    for b in alfabet:
        for c in alfabet:
            for d in alfabet:
                for e in alfabet:
                    try: 
                    #REST OF THE CODE 
                    except:
                        pass


Wat gebeurt er:
Deze code werkt, hij begint netjes bij AAAAA, daarna AAAAB, AAAAC enz enz.

Wens:
Beginnen bij A en doorgaan tot en met 9 (zie list) en dan doorgaan met AA, daarna AB tot en met A9 en dan weer naar AAA, AAB enz. enz.
Dus eigenlijk iets in de zin van:
code:
1
2
3
4
N = 1
While N < 10000:
Doe iets
N=N+1

Maar dan met de list.

Wat heb ik al gedaan:
Gekeken naar itertools maar daar kom ik niet echt aan uit. Anderen geven aan dat het een Cartesian Product zou moeten zijn maar daar vind ik niet echt een aanknopingspunt voor. Hoe kan ik dit het beste aanvliegen?

Alle reacties


Acties:
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik zou het heel anders aanvliegen. Ik zou gewoon (integer) tellen van 0 tot N en dat getal in Base36 uitschrijven.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • OnTracK
  • Registratie: Oktober 2002
  • Laatst online: 15:30
RobIII schreef op donderdag 19 oktober 2023 @ 15:17:
Ik zou het heel anders aanvliegen. Ik zou gewoon (integer) tellen van 0 tot N en dat getal in Base36 uitschrijven.
Wordt dan de eerste keer dat je twee tekens nodig hebt het getal niet BA?

Not everybody wins, and certainly not everybody wins all the time.
But once you get into your boat, push off and tie into your shoes.
Then you have indeed won far more than those who have never tried.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
OnTracK schreef op donderdag 19 oktober 2023 @ 15:19:
[...]
Wordt dan de eerste keer dat je twee tekens nodig hebt het getal niet BA?
Na negen komt toch 10, niet 20 :? Waarom zou dat in een andere base wel zo zijn?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • +1 Henk 'm!

  • OnTracK
  • Registratie: Oktober 2002
  • Laatst online: 15:30
Na 9 komt 10 idd
Dat zijn twee verschillende tekens, "1" en "0", het tweede en eerste teken in de reeks respectievelijk
Dus als je reeks A, B, C is, en A=0, en B=1
Dan is bij n=36 de conversie naar base36 "10" => "BA"

Oprecht, misschien zie ik iets over het hoofd hoor. :)

Not everybody wins, and certainly not everybody wins all the time.
But once you get into your boat, push off and tie into your shoes.
Then you have indeed won far more than those who have never tried.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
OnTracK schreef op donderdag 19 oktober 2023 @ 15:21:
Na 9 komt 10 idd
Dat zijn twee verschillende tekens, "1" en "0", het tweede en eerste teken in de reeks respectievelijk
Dus als je reeks A, B, C is, en A=0, en B=1
Dan is bij n=36 de conversie naar base36 "10" => "BA"

Oprecht, misschien zie ik iets over het hoofd hoor.
Ok, ik had misschien wat specifieker moeten zijn; "Base36" met een 'custom alfabet'. Standaard is '1234567890ABCDE...' en dat zal iig '0ABCDE...1234...9' moeten worden o.i.d. ja.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • +1 Henk 'm!

  • OnTracK
  • Registratie: Oktober 2002
  • Laatst online: 15:30
Ja ik snap dat je een custom alfabet wilde gebruiken. Maar volgens denk je nét even te snel :)

base10base36base36 alternatief alfabet
00A
11B
22C
33D
44E
55F
66G
77H
88I
99J
10AK
11BL
12CM
13DN
14EO
15FP
16GQ
17HR
18IS
19JT
20KU
21LV
22MW
23NX
24OY
25PZ
26Q0
27R1
28S2
29T3
30U4
31V5
32W6
33X7
34Y8
35Z9
3610BA


Want AA zou "00" zijn in gewoon base36

Not everybody wins, and certainly not everybody wins all the time.
But once you get into your boat, push off and tie into your shoes.
Then you have indeed won far more than those who have never tried.


Acties:
  • 0 Henk 'm!

  • Compuchip87
  • Registratie: Februari 2021
  • Laatst online: 12:35
Een alternatieve oplossing is met recursie. Ik ben niet zo goed in Python wil niet de hele oplossing voorzeggen dus hier in pseudocode:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
alfabet = ["A", "B", ... "Z", "0", ..., "9"]

# Lijst voor alle woorden van alle lengtes
resultaat = []

# Initialiseer met een lijst met alle woorden van lengte 0
nieuwe_lijst = []

for L in 1 .. MAX:
  # Voeg elke letter toe aan elk woord van lengte (L - 1)
  for prefix in lijst_van_lengte:
    for suffix in alfabet:
      nieuwe_lijst.append(prefix + suffix)
  
  # nieuwe_lijst heeft nu alle woorden van lengte L
  resultaat.append(nieuwe_lijst)

  # Ga naar de volgende iteratie met een nieuwe lijst van woorden met lengte L als prefix
loop

Acties:
  • 0 Henk 'm!

  • OnTracK
  • Registratie: Oktober 2002
  • Laatst online: 15:30
@RobIII Ik zie nu dat je nog "0" vooraan je custom alfabet hebt staan. Dat is inderdaad wat creatiever omgaan met een custom alfabet. Maar de TS wil de nul niet na de 9, maar tussen de Z en de 1. Dus klopt het dan nog?

Not everybody wins, and certainly not everybody wins all the time.
But once you get into your boat, push off and tie into your shoes.
Then you have indeed won far more than those who have never tried.


Acties:
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
OnTracK schreef op donderdag 19 oktober 2023 @ 15:33:
@RobIII Ik zie nu dat je nog "0" vooraan je custom alfabet hebt staan. Dat is inderdaad wat creatiever omgaan met een custom alfabet. Maar de TS wil de nul niet na de 9, maar tussen de Z en de 1. Dus klopt het dan nog?
Ja, ik heb misschien iets te snel geroepen, misschien ook niet. Ik zit met m'n hoofd eigenlijk in andere code op 't moment :X Het was iig mijn eerste ingeving.

[ Voor 3% gewijzigd door RobIII op 19-10-2023 15:34 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • MatHack
  • Registratie: Oktober 2001
  • Niet online

MatHack

Dev by day, Gamer by night

Gevalletje teller elke keer 1 ophogen en dat getal omrekenen met modulo en andere rekenkunde tot een representatie?

Geen idee of onderstaande werkt, maar iets in deze trant (dit is dan de doe iets uit de TS):

code:
1
2
3
4
5
6
7
8
9
var module = 36
result = ""
do
{
var index = teller % modulo
result = list[index] + result
teller -= index
module *= 36
} while (teller < modulo)

[ Voor 5% gewijzigd door MatHack op 19-10-2023 16:10 ]

There's no place like 127.0.0.1


Acties:
  • 0 Henk 'm!

  • OnTracK
  • Registratie: Oktober 2002
  • Laatst online: 15:30
RobIII schreef op donderdag 19 oktober 2023 @ 15:33:
[...]

Ja, ik heb misschien iets te snel geroepen, misschien ook niet. Ik zit met m'n hoofd eigenlijk in andere code op 't moment :X Het was iig mijn eerste ingeving.
Het was ook mijn eerste gedachte, maar kwam er niet uit :P Dus ik snapte niet hoe het bij jou moest werken.

@ironheart wat je wil lijkt verdacht veel op een Excel column name generator. Een ding waar veel op het internet over is geschreven omdat het beste een "interessent" probleem is om mee te oefenen.
Bijvoorbeeld hier: https://www.geeksforgeeks...column-name-given-number/

En daar zie je dat de suggestie van RobIII op zich een goed begin is. Maar dat ze de "0" uit de string slopen. Nu heb jij wel het additionele probleem dat je wel degelijk een "0" op een andere plek erin wil hebben. Dus mogelijk moet je extra stappen doen.

[ Voor 8% gewijzigd door OnTracK op 19-10-2023 15:41 ]

Not everybody wins, and certainly not everybody wins all the time.
But once you get into your boat, push off and tie into your shoes.
Then you have indeed won far more than those who have never tried.


Acties:
  • +1 Henk 'm!

  • Rvdv
  • Registratie: Oktober 2002
  • Nu online
code:
1
2
3
4
5
from itertools import product

for n in range(9):
    for x in product(alfabet, repeat=n+1):
       #doe iets


Zoiets? Toch een cartesian product, maar dan voor lengtes 1 t/m 9

Acties:
  • 0 Henk 'm!

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
Zoiets misschien (code is ietswat versimpeld)?
code:
1
2
3
4
5
6
import itertools
ALF=list('ABCXYZ012789')
for length in range(1,3):
    for p in itertools.permutations(ALF,length):
        #doe iets met ''.join(p)
        print(''.join(p))

Ik ga er overigens vanuit dat je begint met A...9 en dan doorgaat met AA..A9,BA..B9,..9A..99.

[ Voor 16% gewijzigd door KabouterSuper op 19-10-2023 15:58 ]

When life gives you lemons, start a battery factory


Acties:
  • 0 Henk 'm!

  • Duke of Savage
  • Registratie: April 2023
  • Laatst online: 11:36
Kun je niet iets doen met chr()?
Dat converteert een integer naar een character.

Acties:
  • +3 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Passen we wel een beetje op met compleet voorgekauwde oplossingen posten? ;)
Give a man a fish and feed him for a day. Teach a man how to fish and feed him for a lifetime.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
RobIII schreef op donderdag 19 oktober 2023 @ 16:01:
Passen we wel een beetje op met compleet voorgekauwde oplossingen posten? ;)

[...]
Het is herfstvakantie, we vervelen ons.

When life gives you lemons, start a battery factory


Acties:
  • 0 Henk 'm!

  • Zebby
  • Registratie: Maart 2009
  • Laatst online: 12:11
Voor dit soort vragen grijp ik naar Phind.com, die helpt in je gedachteproces en legt vaak ook dingen uit, maar krijgt het zelfden in 1x goed dat je toch zelf nog wat moet nadenken en debuggen.
Heel nuttig :)

Acties:
  • +1 Henk 'm!

  • ironheart
  • Registratie: September 2022
  • Laatst online: 29-09 12:45
Actually maakt de positie van 0 niet uit. Het base36 verhaal is eigenlijk perfect geschikt hiervoor. Dank!

Acties:
  • 0 Henk 'm!

  • Tk55
  • Registratie: April 2009
  • Niet online
Je begint met je lijst karakters, die heb je al.

Daarna wil je X aantal keer itereren over de lijst. De eerste keer wil je dat 1 keer doen:
code:
1
2
for a in alfabet:
    print(a)


Dit wil je maximaal 5 keer herhalen. Dit kan door te loopen over een range.

Dmv een Cartesian Product kun je de lijsten combineren (1-5 keer). Zo krijg je alle verschillende mogelijkheden, van A t/m 99999.

Acties:
  • +2 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15:21
Dit is een codering zoals bijvoorbeeld gebruikt wordt voor de kolommen in een spreadsheet (A..Z, dan AA..ZZ, dan AAA...ZZZ etc.) Het lijkt op basis-N codering maar het is het net niet. Je kunt een lijst van codes generen, maar eenvoudiger is om een bijectie van getallen naar codes te definiëren, bijvoorbeeld:

Python:
1
2
3
4
5
6
7
8
alphabet = 'abc'

def Encode(i):
  if i == 0: return ''
  return Encode((i - 1) // len(alphabet)) + alphabet[(i - 1) % len(alphabet)]

for i in range(100):
  print(i, Encode(i))


Uitvoer:

0  
1 a
2 b
3 c
4 aa
5 ab
..
12 cc
13 aaa
14 aab
..
38 ccb
39 ccc
40 aaaa
41 aaab
..

etc. Je kunt de codes decoderen door de logica om te draaien:

Python:
1
2
3
def Decode(s):
  if s == '': return 0
  return 1 + alphabet.index(s[-1]) + len(alphabet)*Decode(s[:-1])
Pagina: 1