[Python] Wiskundige vraag over grootte berekening

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • flugelisoke
  • Registratie: Januari 2005
  • Laatst online: 18:25
De situatie:

Ik ben zojuist begonnen met het leren van programmeren in Python, nu loop ik tegen een opdracht aan waarbij je een pijl 2 keer zo groot moet maken, echter is het van belang dat de verhouding gelijk blijft.

Dit is de originele pijl:

Afbeeldingslocatie: https://i.imgur.com/Ycjy8Vw.jpg

Goed, dit is de oplossing voor de 2e pijl hoe hij er uit moet komen te zien. Ik heb deze niet zelf gemaakt.

Afbeeldingslocatie: https://i.imgur.com/wQzlLMf.jpg

Mijn vraag:

Hoe kan ik exact berekenen hoe ik die originele pijl 2 keer zo groot maak in verhouding? Simpelweg 5 sterretjes aan de onderkant x2 = 10 klopt niet.

Ik wil het graag precies begrijpen hoe ik zo'n berekening maak zodat ik in het vervolg efficiënt en nauwkeurig zo'n opdracht kan voltooien, terwijl ik ook de theorie hoe het werkt begrijp.

Alvast bedankt! _/-\o_ :)

Beste antwoord (via flugelisoke op 10-04-2019 13:46)


  • Shakesbeer_NL
  • Registratie: Juli 2009
  • Laatst online: 05-10 14:48
Hey OP,

Ik denk dat de vraag die je eruit haalt om dit automatisch te berekenen, met de juiste proporties, qua moeilijkheid voorbij gaat aan de opdracht.
Er staat letterlijk 'make the arrow twice as large'. In dit geval wordt er (waarschijnlijk) bedoelt om direct de print-calls aan passen om dit te behalen.

Om in pseudo-code uit te leggen wat je zoal nodig zou hebben om het automatisch te doen:
  • Variabele om de schaling van grootte bij te houden
  • Een berekening om de geschaalde grootte en hoogte te bepalen.
    Hierbij te compenseren voor het kleinst mogelijk print-symbool (1 '*'); kortom om de verhoudingen van de pijl te behouden moet elke wijziging in grootte in stappen van 2 '*' gebeuren.
Vervolgens zou je de logica voor het tekenen implementeren van de verschillende onderdelen van het figuur:
- Tekenen van het punt-uiteinde van pijl
- Tekenen van de steeds wijder wordende pijl (zeer geschikt voor loop)
- Tekenen van de overgang van de pijl naar de steel van pijl
- Tekenen van de steel van de pijl (wederom geschikte taak voor een loop)
- Tekenen van de onderkant

Voor de steel en het steeds wijder wordende gedeeld van de pijl zou je een loop kunnen gebruiken.
Bovendien moet er bij het printen rekening worden gehouden met de 'spaties' die ook mee geprint moeten worden. (tip https://pyformat.info/#param_align)

Wel een leuke opdracht om dit in een script eenvoudig schaalbaar te maken zodra je wat verder bent met python! Ik was er even zoet mee :P
Afbeeldingslocatie: https://i.imgur.com/Lb6Zi6i.png

[ Voor 3% gewijzigd door Shakesbeer_NL op 10-04-2019 13:43 ]

Alle reacties


Acties:
  • +2 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Die tweede pijl is niet in verhouding en volgens mij dus ook niet de juiste oplossing. Wie zegt dat 't de juiste oplossing is?

Hier heb ik beide pijlen op elkaar gelegd; de kleinste negatief gemaakt (zodat je 't beter ziet) en vervolgens (met behoud van verhoudingen) geschaald:
Afbeeldingslocatie: https://tweakers.net/ext/f/42DiPWLS7FmA7AcpHWY5gsOA/full.png Afbeeldingslocatie: https://tweakers.net/ext/f/E25AM2zECzjqXUa9fqcs8avz/full.png
Afbeeldingslocatie: https://tweakers.net/ext/f/zIEXLVA8BuMc6iQo6P0BbXTs/medium.png

Je ziet duidelijk dat de verhoudingen anders zijn.

Hoe je zo'n berekening maakt? Wat je in de breedte doet moet je ook in de lengte doen. Dus als je breedte x 3,141592 doet zul je lengte ook x 3,141592 moeten doen wil je de verhouding behouden.

[ Voor 87% gewijzigd door RobIII op 10-04-2019 11:28 ]

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!

  • emnich
  • Registratie: November 2012
  • Niet online

emnich

kom je hier vaker?

Die 2e pijl klopt inderdaad niet. De eerste pijl is 9 sterren breed, de 2e 17 sterren.

Acties:
  • 0 Henk 'm!

  • flugelisoke
  • Registratie: Januari 2005
  • Laatst online: 18:25
Volgens Python Institute is dit een voorbeeld solution, daarom vind ik het ook zo apart.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
flugelisoke schreef op woensdag 10 april 2019 @ 11:18:
Volgens Python Institute is dit een voorbeeld solution, daarom vind ik het ook zo apart.
Dan klopt je beschrijving van de opdracht niet. Heb je een link?

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!

  • flugelisoke
  • Registratie: Januari 2005
  • Laatst online: 18:25
Ik zal even de opdracht quoten:


Objectives

experimenting with existing Python code;
discovering and fixing basic syntax errors;
becoming familiar with the print() function and its formatting capabilities.
Scenario
We strongly encourage you to play with the code we've written for you, and make some (maybe even destructive) amendments. Feel free to modify any part of the code, but there is one condition - learn from your mistakes and draw your own conclusions.

Try to:

minimize the number of print() function invocations by inserting the \n sequence into the strings
make the arrow twice as large (but keep the proportions)
duplicate the arrow, placing both arrows side by side; note: a string may be multiplied by using the following trick:
"string" * 2
will produce "stringstring" (we'll tell you more about it soon)
remove any of the quotes, and look carefully at Python's response; pay attention to where Python sees an error - is this the place where the error really exists?
do the same with some of the parentheses;
change any of the print words into something else, differing only in case (e.g., Print); what happens now?
replace some of the quotes with apostrophes; watch what happens carefully.

Originele code:

print(" *")
print(" * *")
print(" * *")
print(" * *")
print("*** ***")
print(" * *")
print(" * *")
print(" *****")


Afbeeldingslocatie: https://i.imgur.com/oOvOtB0.jpg

[ Voor 7% gewijzigd door flugelisoke op 10-04-2019 11:23 ]


Acties:
  • 0 Henk 'm!

  • jeanj
  • Registratie: Augustus 2002
  • Niet online

jeanj

F5 keeps me alive

De pijl twee keer zo groot maken bij gelijk blijvenden proporties, dat betekent de hoogte en de breedte twee kee zo groot maken. (In theorie zou je het gebruikte font ook 2x zo groot kunnen maken :) )

De lengte 2x zo lang, is twee keer zoveel print regels (even versimplificeert)
De breedte 2x zo breed, is de strings 2x zo breed maken (letop valkuil)

succes

ps overigens teleurgesteld, geen wiskunde in de vraag....

ps2 het voorbeeld van het antwoord klopt niet. Tussen de onderkant van de driehoek en de de bodem van de pijl zitten 2 regels (code regels 6 en 7). Ergo 2x zo groot, betekent, dat dit er maar 4 zijn (en geen 6 zoals in het voorbeeld). Dus in het voorbeeld van het antwoord zijn de proporties niet gehandhaafd, maar dat was hierboven ook al gezegd

ps3 stel de vraag een ander, stel je heb een verticale lijn van twee *, zoals dit
*
*

en maak deze twee keer zo groot
is het antwoord dan
**
**
**
**
of
*
*
*
*

[ Voor 44% gewijzigd door jeanj op 10-04-2019 12:51 ]

Everything is better with Bluetooth


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • Shakesbeer_NL
  • Registratie: Juli 2009
  • Laatst online: 05-10 14:48
Hey OP,

Ik denk dat de vraag die je eruit haalt om dit automatisch te berekenen, met de juiste proporties, qua moeilijkheid voorbij gaat aan de opdracht.
Er staat letterlijk 'make the arrow twice as large'. In dit geval wordt er (waarschijnlijk) bedoelt om direct de print-calls aan passen om dit te behalen.

Om in pseudo-code uit te leggen wat je zoal nodig zou hebben om het automatisch te doen:
  • Variabele om de schaling van grootte bij te houden
  • Een berekening om de geschaalde grootte en hoogte te bepalen.
    Hierbij te compenseren voor het kleinst mogelijk print-symbool (1 '*'); kortom om de verhoudingen van de pijl te behouden moet elke wijziging in grootte in stappen van 2 '*' gebeuren.
Vervolgens zou je de logica voor het tekenen implementeren van de verschillende onderdelen van het figuur:
- Tekenen van het punt-uiteinde van pijl
- Tekenen van de steeds wijder wordende pijl (zeer geschikt voor loop)
- Tekenen van de overgang van de pijl naar de steel van pijl
- Tekenen van de steel van de pijl (wederom geschikte taak voor een loop)
- Tekenen van de onderkant

Voor de steel en het steeds wijder wordende gedeeld van de pijl zou je een loop kunnen gebruiken.
Bovendien moet er bij het printen rekening worden gehouden met de 'spaties' die ook mee geprint moeten worden. (tip https://pyformat.info/#param_align)

Wel een leuke opdracht om dit in een script eenvoudig schaalbaar te maken zodra je wat verder bent met python! Ik was er even zoet mee :P
Afbeeldingslocatie: https://i.imgur.com/Lb6Zi6i.png

[ Voor 3% gewijzigd door Shakesbeer_NL op 10-04-2019 13:43 ]


Acties:
  • 0 Henk 'm!

  • flugelisoke
  • Registratie: Januari 2005
  • Laatst online: 18:25
Shakesbeer_NL schreef op woensdag 10 april 2019 @ 13:33:
Hey OP,

Ik denk dat de vraag die je eruit haalt om dit automatisch te berekenen, met de juiste proporties, qua moeilijkheid voorbij gaat aan de opdracht.
Er staat letterlijk 'make the arrow twice as large'. In dit geval wordt er (waarschijnlijk) bedoelt om direct de print-calls aan passen om dit te behalen.

Om in pseudo-code uit te leggen wat je zoal nodig zou hebben om het automatisch te doen:
  • Variabele om de schaling van grootte bij te houden
  • Een berekening om de geschaalde grootte en hoogte te bepalen.
    Hierbij te compenseren voor het kleinst mogelijk print-symbool (1 '*'); kortom om de verhoudingen van de pijl te behouden moet elke wijziging in grootte in stappen van 2 '*' gebeuren.
Vervolgens zou je de logica voor het tekenen implementeren van de verschillende onderdelen van het figuur:
- Tekenen van het punt-uiteinde van pijl
- Tekenen van de steeds wijder wordende pijl (zeer geschikt voor loop)
- Tekenen van de overgang van de pijl naar de steel van pijl
- Tekenen van de steel van de pijl (wederom geschikte taak voor een loop)
- Tekenen van de onderkant

Voor de steel en het steeds wijder wordende gedeeld van de pijl zou je een loop kunnen gebruiken.
Bovendien moet er bij het printen rekening worden gehouden met de 'spaties' die ook mee geprint moeten worden. (tip https://pyformat.info/#param_align)

Wel een leuke opdracht om dit in een script eenvoudig schaalbaar te maken zodra je wat verder bent met python! Ik was er even zoet mee :P
[Afbeelding]
Waarschijnlijk gaat deze vraag idd verder qua complexiteit dan de opdracht zelf :P Soms denk ik ook teveel na en wil ik misschien teveel begrijpen. Maar je antwoord is desalniettemin zeer duidelijk!

Tnx!

Acties:
  • +1 Henk 'm!

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 15:03
Als je het meer mathematisch aan wilt pakken, kun je de sterren als punten met coordinaten beschouwen in een 2D ruimte. Als je deze coordinaten in een matrix stopt, kun je met matrix algebra heel gemakkelijk transformaties uitvoeren.

Voorbeldje:
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import numpy

# Voorbeeld coordinaten matrix, vormt een L
dots = np.matrix([
    [0, 0],
    [0, 1],
    [0, 2],
    [2, 2],
    [4, 2],
])

# Schalen x 4 is simpel
dots_scaled = dots * 4
print(dots_scaled)

# Opschuiven is vegelijkbaar
dots_trans = dots + 2
print(dots)

Je moet dan alleen nog even een plotting functie schrijven, maar dat is wel te doen :)

Als je verschillende schaalfactoren wilt in horizontale en verticale richting, kun je dat ook doen met matrix vermenigvuldinging. Zie hier voor een voorbeeldje: https://nbviewer.jupyter...._algebra_transforms.ipynb

De wiskunde hierachter wordt op Khan Acedemy best goed uitgelegd: https://www.khanacademy.o...nsforming-position-vector

Je kunt op deze manier ook roteren et cetera. Maar let erop dat mijn (crappy) plot functie geen negatieve assen ondersteunt en alleen gehele getallen als coordinaten, dus het wordt dan al gauw een zootje :P

[ Voor 17% gewijzigd door Morrar op 12-04-2019 12:07 ]

Pagina: 1