Forum: Programmerings lek

Forum huvudsida -> Programmering -> Programmerings lek

Sidor: 1 2 3 4 5 6 7

Till botten

Python 17:56 - 24:e Juli 2008 | Post #151
Medlem
Inlägg: 157


Skicka PM
Slängde ihop en lite snabbt i Python med Pygame

  1. iimport pygame
  2. from pygame.locals import *
  3.  
  4. import math, sys
  5.  
  6. class Pen:
  7. def __init__(self, pos, rgb, size):
  8. self.image = pygame.Surface(size)
  9. self.image.fill(rgb)
  10.  
  11. self.rect = self.image.get_rect()
  12. self.rect.center = pos
  13.  
  14. self.angle = 90
  15.  
  16. def DecreaseAngle(self):
  17. self.angle -= 90
  18. if self.angle < 0:
  19. self.angle = 360
  20.  
  21. def IncreaseAngle(self):
  22. self.angle += 90
  23. if self.angle > 360:
  24. self.angle = 0
  25.  
  26. def move_and_draw(self, surface):
  27. self.rect.move_ip(math.cos(math.radians(self.angle)), math.sin(math.radians(self.angle)))
  28. surface.blit(self.image, self.rect)
  29.  
  30. def L(start_axiom, rule, screen, n):
  31. stack = []
  32.  
  33. background = pygame.Surface((1024, 768))
  34. screen.fill((255, 255, 255))
  35.  
  36. pen = Pen((300, 10), (0, 128, 0), (1, 1))
  37.  
  38. axiom = start_axiom
  39.  
  40. for i in range(0, n):
  41. for char in axiom:
  42. if char == "F":
  43. pen.move_and_draw(screen)
  44. elif char == "+":
  45. pen.IncreaseAngle()
  46. elif char == "-":
  47. pen.DecreaseAngle()
  48. elif char == "[":
  49. stack.append(pen.rect.center)
  50. elif char == "]":
  51. pen.rect.center = stack.pop()
  52.  
  53. new_axiom = ""
  54. words = rule.split(" ")
  55. for char in axiom:
  56. if char == words[0]:
  57. new_axiom += words[2]
  58. else:
  59. new_axiom += char
  60.  
  61. axiom = new_axiom
  62. pygame.display.update()
  63.  
  64. def main():
  65. pygame.init()
  66.  
  67. axiom = raw_input("Axiom: ")
  68. if axiom == "":
  69. axiom = "F"
  70.  
  71. rule = raw_input("Rule: ")
  72. if rule == "":
  73. rule = "F => FF-[-F+F+F]+[+F-F-F]"
  74.  
  75. screen = pygame.display.set_mode((600, 300))
  76.  
  77. L(axiom, rule, screen, 7)
  78.  
  79. while True:
  80. for event in pygame.event.get():
  81. if event.type in [QUIT, KEYDOWN]:
  82. sys.exit(0)
  83.  
  84. if __name__ == '__main__': main()


Koden behöver Python + PyGame installerat för att funka.

-------------------------
-------------------------

Senast redigerad 10:19 - 25:e Juli 2008


FunkyChicken 12:31 - 28:e Juli 2008 | Post #152
Nyhetsredaktör
Inlägg: 800


Skicka PM
Blinkenlights påtvingade radnummer (feature-request: en knapp för att hämta code-texten utan nummer!) avskräcker mig från att provköra (sen har jag inte python på jobbet heller...) men det ser ju rätt ut. +1 internet!

Eftersom ingen annan vill vara med och leka får Python hitta på ny uppgift!




Python 13:14 - 28:e Juli 2008 | Post #153
Medlem
Inlägg: 157


Skicka PM
Jag vill ha en BASIC-Interpretator.
Den ska stöda minst IF-THEN-ELSE, Variabler, GOTO, FOR-NEXT, PRINT och INPUT.

Exempel på kod som tolken ska köra:

  1. 10 PRINT "Skriv in ditt namn"
  2. 20 INPUT namn$
  3. 30 IF namn = "Gustav" THEN GOTO 50
  4. 40 PRINT "Du heter inte Gustav"
  5. 50 PRINT "HEJ GUSTAV!"



C eller C++.

-------------------------
-------------------------

Senast redigerad 09:10 - 29:e Juli 2008


HärJ 19:22 - 28:e Juli 2008 | Post #154
Moderator
Inlägg: 1198


Skicka PM
20 namn = INPUT

så har man inte skrivit i någon av de BASIC-varianter jag har pysslat med snarare
20 INPUT namn

men det är i min lilla världSmiley

-------------------------
Tänk om jag vore en skalärprodukt!



Python 23:17 - 28:e Juli 2008 | Post #155
Medlem
Inlägg: 157


Skicka PM
    Citat av HärJ:
20 namn = INPUT

så har man inte skrivit i någon av de BASIC-varianter jag har pysslat med snarare
20 INPUT namn

men det är i min lilla världSmiley


Jo det är sant, jag ändrar.

-------------------------
-------------------------



Nissebosselasse 23:20 - 28:e Juli 2008 | Post #156
Medlem
Inlägg: 490


Skicka PM
Borde det inte vara INPUT namn$ också? Så var det på min tid...Smiley

-------------------------
http://pushingcows.se
Gula Nallen



HärJ 01:20 - 29:e Juli 2008 | Post #157
Moderator
Inlägg: 1198


Skicka PM
    Citat av Nissebosselasse:
Borde det inte vara INPUT namn$ också? Så var det på min tid...Smiley

förutsatt att du inte har ett namn som enbart består av siffrorSmiley

-------------------------
Tänk om jag vore en skalärprodukt!



FunkyChicken 16:44 - 29:e Juli 2008 | Post #158
Nyhetsredaktör
Inlägg: 800


Skicka PM
Detta är nog en vanlig missuppfattning om variabler i BASIC. Suffixet $ betyder att variabeln är en sträng (% betyder int, osv). Detta låter BASIC-språket vara starkt typat utan att man ens behöver deklarera sina variabler. Det är dock fullt möjligt att explicit deklarera variabler att vara av en viss typ om man vill.

INPUT namn

är alltså helt okej om man tidigare gjort

DIM namn AS STRING

eller

DEFSTR n




jla 13:54 - 27:e September 2009 | Post #159
Medlem
Inlägg: 18


Skicka PM
Händer det något i den här tråden??

/jla




stampe90 08:16 - 28:e September 2009 | Post #160
Medlem
Inlägg: 0


Skicka PM
Vi kör igång med ny fråga:

Ett program skrivet i valfrittspråk och utseende.
När man startar skall man välja vilken gånger tabell man vill se, väljer man 3:an så skall 3:ans gånger tabell printas ut 0 - 10.




martin310 09:38 - 28:e September 2009 | Post #161
Medlem
Inlägg: 132


Skicka PM
Så:

  1. #include <iostream>
  2. #include <windows.h>
  3.  
  4. using std::cout;
  5. using std::cin;
  6. using std::endl;
  7.  
  8. int main()
  9. {
  10. while(1)
  11. {
  12. //annars blir den en minnes slukare
  13. static int tal;
  14.  
  15. //Förlåt, kör på windows kan inte de andra kommandona
  16. system("cls");
  17.  
  18. cout << "Skriv in ett tal: ";
  19. cin >> tal;
  20. cout << endl;
  21.  
  22. //skriv ut talen
  23. for(int at = 0; at < 11; at++)
  24. {
  25. cout << at * tal << endl;
  26. }
  27.  
  28. //datorn är för snabb xD
  29. Sleep(1000);
  30. cin.get();
  31. Sleep(500);
  32. cin.get();
  33. }
  34. return 0;
  35. }


Funkar i VC++

-------------------------

Hjälp jorden med Granola, det är gratis och funkar på både Windows och Linux, och försämrar inte datorns prestandad!



Senast redigerad 09:44 - 28:e September 2009


stampe90 10:28 - 28:e September 2009 | Post #162
Medlem
Inlägg: 0


Skicka PM
Det där gick fort, shit.. Ingen skola eller jobb idag eller?:P




jla 17:15 - 28:e September 2009 | Post #163
Medlem
Inlägg: 18


Skicka PM
Ny uppgift??

/jla




Vitdom 20:03 - 28:e September 2009 | Post #164
Medlem
Inlägg: 71


Skicka PM
    Citat av jla:
Ny uppgift??

/jla


Skriv ett program(valfritt språk) som ber användaren att skriva in en sträng av 10 olika tecken i intervallet '0' - '9' & 'A' - 'Z' & 'a' - 'z'. Programmet ska sedan ta dessa tecken och skriva ut dem i en ordning sorterad efter hur ofta varje tecken förekommer i denna fil: http://vitdom.webs.com/tecken.txt

I filen har exakt 10 000 tecken mellan intervallen '0' - '9' & 'A' - 'Z' & 'a' - 'z' slumpats ut.

De tecken som förekommer mest ska skrivas ut först. Förekommer två tecken lika många gånger i filen så ska det tecken som skrevs in först skrivas ut först.

-------------------------



Senast redigerad 20:38 - 28:e September 2009


martin310 17:12 - 29:e September 2009 | Post #165
Medlem
Inlägg: 132


Skicka PM
    Citat av stampe90:
Det där gick fort, shit.. Ingen skola eller jobb idag eller?:P


Faktiskt inte!

(Studiedag)

LOL, har basen (skriven på max tio min.) men vet inte resten. Så går det när man går i 8:an .Smiley

-------------------------

Hjälp jorden med Granola, det är gratis och funkar på både Windows och Linux, och försämrar inte datorns prestandad!



Senast redigerad 17:34 - 29:e September 2009


Kekke 16:28 - 30:e September 2009 | Post #166
Medlem
Inlägg: 4


Skicka PM
Tror jag lyckades lösa det i C#.NET, är inte helt säker på att det är rätt så du kan väl kolla om den sorterar rätt.



Edit*

Vet fan inte vad som är fel med formateringen, mellanslag/tabsen visas ju inte..

Edit**

Verkar inte vara rätt, uppdaterar snart igen.

Edit***
Nu ska det fungera, ny screenshot:




using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace BlinkenlightsProg01
{
public partial class Form1 : Form
{
int[] intNumOfTimes = new int[200];
int[] banned = new int[3000];
static int bannedCounter = 0;

public Form1()
{
InitializeComponent();

for (int i = 0; i < 200; i++)
{
intNumOfTimes[i] = 0;
}
}

int [] FindHighestNumber()
{
int[] iTemp = new int[15];
int[] iTemp2 = new int[15];


int iTimes = 0;

for (int i = 0; i < 200; i++)
{


if (intNumOfTimes[i] > iTemp[0])
{
bool wasitbanned = false;
for (int j = 0; j < 1000; j++)
{
if (i == banned[j])
wasitbanned = true;

}

if (!wasitbanned)
{
iTemp2[0] = i;
iTemp[0] = intNumOfTimes[i];
}
}


}

for (int i = 0; i < 200; i++)
{
if (intNumOfTimes[i] == iTemp[0])
{
iTemp[++iTimes] = i;
}
}

return iTemp2;
}

private void button1_Click(object sender, EventArgs e)
{
if (tboInput.Text.Length == 10)
{
string strOutput = "";

StreamReader srStream = new StreamReader(@"C: ecken.txt");

int k = 0;

while (!srStream.EndOfStream)
{
k = srStream.Read();
intNumOfTimes[k]++;
}

while (tboOutput.Text.Length != 10)
{
int[] nums = FindHighestNumber();

for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 15; j++)
{
if ((int)tboInput.Text[i] == nums[j])
strOutput += tboInput.Text[i];
}
}

tboOutput.Text = strOutput;

for (int i = 0; i < 15; i++)
{
banned[bannedCounter++] = nums[i];
nums[i] = 0;
}
}
lblStatus.Text = "Sorted";
}
else
{
lblStatus.Text = "Please enter 10 characters and/or numbers";
}
}
}
}


-------------------------
Ingen signatur!

Senast redigerad 17:07 - 30:e September 2009


Vitdom 23:33 - 30:e September 2009 | Post #167
Medlem
Inlägg: 71


Skicka PM
Verkar funka bra enligt den senaste bilden! Har själv ingen C#-kompilator så jag kan inte köra den.Smiley

-------------------------



Senast redigerad 23:37 - 30:e September 2009


Kekke 17:56 - 1:a Oktober 2009 | Post #168
Medlem
Inlägg: 4


Skicka PM
Jag tar en tävling vi hade på ett annat forum, som Slush från cout.se gav oss.

Jag tänkte att de som känner sig manad skulle implementera en lite floodfill-funktionalitet. Jag har skrivit en liten bas i C++ och lämnat funktionen "floodfill" tom. Funktionens uppgift är att fylla ett fält med en ny färg. Ett fält definieras av att den ska vara samma färg som sträcker sig till en heldragen eller diagonal linje, eller till kanten på den totala ytan. Detta är alltså på samma sätt som "hinken" fungerar i MS Paint och liknande enklare ritprogram.

För att slippa GUI och allt sådant så representeras en "färg" av ett tecken.

Den totala ytan representeras av Area-klassen som har metoder för att hämta och rita en färg på en given xy-position. Utdata från programmet ska se ut såhär om det fungerar som det är tänkt:


Before:
...#.....#...#..
..#.......#.#.#.
..#........#...#
..#............#
..#....#####...#
..#...#.....#..#
..#...#......##.
..#...#.#.......
..#....#.#.##...
..#.......#..#..
..#..........#..
..##########.#..
..#..........#..
..#########..#..
..#..........#..
..############..
After:
...# #...#..
..# #.# #.
..# # #
..# #
..# ##### #
..# #.....# #
..# #......##.
..# #.#.......
..# # #.##...
..# # #..
..# #..
..########## #..
..# #..
..######### #..
..# #..
..############..


Det vill säga, ytan i mitten av figuren har fyllts med mellanslag istället för punkter.
Baskoden ser ut så här och ska inte behöva förändras med undantag för floodfill-funktionen:


#include <iostream>
#include <algorithm>

class Area {
public:
/*
  • Skapar en area med en viss bredd och höjd. Den initieras
  • med data som skickas med som initdata.
*/
Area(int width, int height, const char* initdata)
: m_width(width), m_height(height)
{
data = new char[width
  • height];
std::copy(initdata, initdata+width*height, data);
}

/*
  • Ritar färgen ch på position (x, y) på ytan.
*/
void setChar(int x, int y, int ch)
{
if (isValid(x, y))
data[y*m_width+x] = ch;
}

/*
  • Hämtar färgen som råkar finnas på position (x, y)
  • på ytan. Returnerar 0 om (x, y) inte ligger på
  • ytan.
*/
char getChar(int x, int y) const
{
if (isValid(x, y))
return data[y*m_width+x];
return 0;
}

/*
  • Returnerar denna ytas bredd
*/
int getWidth() const { return m_width; }

/*
  • Returnerar denna ytas höjd
*/
int getHeight() const { return m_height; }

/*
  • Returnerar true om de medskickade positionen ligger
  • innanför denna yta. Lämplig att använda för att se om
  • man är på väg att rita utanför ytan.
*/
bool isValid(int x, int y) const
{
return x >= 0 && x < m_width && y >= 0 && y < m_height;
}

private:
int m_width, m_height;
char* data;
};

/*
  • Skriver en Area till en stream.
  • T ex.:
  • std::cout << area;
*/
std::ostream& operator<<(std::ostream &stream, const Area &a) {
for (int y = 0; y < a.getHeight(); y++)
{
for (int x = 0; x < a.getWidth(); x++)
{
stream << a.getChar(x, y);
}
stream << std::endl;
}

return stream;
}

/**********************************************************************
  • Den här funktionen ska alltså implementeras. Dess uppgift är
  • att färgfylla ett område färg på en yta med en annan färg.
*
  • Färgen kan ej tränga igenom två intilliggande block på
  • diagonalen. Det vill säga, här kommer färgen inte att
  • tränga igenom från fält 1 till fält 2:
*
  • 1111#
  • 111#2
  • 11#22
  • ##222
*
  • Area a - den yta som ska fyllas. Se Area-klassen för att se vilka
  • operationer den stöder.
  • int x - x-positionen från där fyllningen ska utgå ifrån.
  • int y - y-positionen från där fyllningen ska utgå ifrån.
  • char ch - färgen som ska fyllas med.
  • char back - den färg på området som ska fyllas, floodfill
  • ska inte fylla över någon annan färg än den som
  • finns i back.
***********************************************************************/
void floodfill(Area &a, int x, int y, char ch, char back) {
// FIXME
}

int main() {

// Positionen där vi ska börja fylla
const int x = 4;
const int y = 4;

const char data[] = {
"...#.....#...#.."
"..#.......#.#.#."
"..#........#...#"
"..#............#"
"..#....#####...#"
"..#...#.....#..#"
"..#...#......##."
"..#...#.#......."
"..#....#.#.##..."
"..#.......#..#.."
"..#..........#.."
"..##########.#.."
"..#..........#.."
"..#########..#.."
"..#..........#.."
"..############.."
};

Area area(16, 16, data);

std::cout << "Before:" << std::endl << area;

// Fyller fältet som finns på (x, y) med mellanslag
floodfill(area, x, y, ' ', area.getChar(x, y));

std::cout << "After:" << std::endl << area;
}

}



Mellanslagen vid After verkar inte fungera, hänvisar er till http://www.cout.se/forum/5785-post57.html om ni inte förstår.

Lycka till!

-------------------------
Ingen signatur!



Kekke 16:20 - 6:e Oktober 2009 | Post #169
Medlem
Inlägg: 4


Skicka PM
Ingen som tänker göra ett försök?Smiley

-------------------------
Ingen signatur!



jla 16:09 - 7:e Oktober 2009 | Post #170
Medlem
Inlägg: 18


Skicka PM
Den e lite för svår för mig :-(




Kekke 18:49 - 7:e Oktober 2009 | Post #171
Medlem
Inlägg: 4


Skicka PM
Eftersom att ingen verkar lösa den postar jag en ny lättare uppgift.


Du ska skapa ett program som ska känna igen och hitta en 10x10 pixlar stor bild (Bild 1) som finns någonstans i en större a skriva ut vilken top-left position den lilla bilden har i den stora bilden. Detta ska givetvis fungera med vilka bilder som helst, även om den hittar flera resultat! Den andra bilden är riktigt stor, men det får ni nöja er med. Lycka till!

-------------------------
Ingen signatur!



Vitdom 23:22 - 7:e Oktober 2009 | Post #172
Medlem
Inlägg: 71


Skicka PM
Problem med bilderna löst:
bildhittare.zip

images.h innehåller bilddata som kan kompileras direkt till ett data som programmet kan använda efter kompileringen. Den genererades med GIMP 2.6.7 efter de två bifogade .BMP filerna.

Källkod för programmet:
  1. #include <iostream>
  2. #include "images.h"
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8. bool found;
  9.  
  10. for(int sy = 0; sy < SImageHeight - FImageHeight + 1; sy++)
  11. {
  12. for(int sx = 0; sx < SImageWidth - FImageWidth + 1; sx++)
  13. {
  14. found = true;
  15. for(int fy = 0; fy < FImageHeight; fy++)
  16. {
  17. for(int fx = 0; fx < FImageWidth; fx++)
  18. {
  19. for(int p = 0; p < 3; p++)
  20. {
  21. if(searchImage[((sy + fy) * SImageWidth + sx + fx) * 3 + p] != findImage[(fy * FImageWidth + fx) * 3 + p])
  22. {
  23. found = false;
  24. break;
  25. }
  26. }
  27. if(!found)
  28. break;
  29. }
  30. if(!found)
  31. break;
  32. }
  33.  
  34. if(found)
  35. cout << "Image match found at: " << sx << ", " << sy << "!" << endl;
  36. }
  37. }
  38. }


-------------------------





jla 15:47 - 23:e Oktober 2009 | Post #173
Medlem
Inlägg: 18


Skicka PM
Ny uppgift??




Sidor: 1 2 3 4 5 6 7

Forum huvudsida -> Programmering -> Programmerings lek
Atom feed

Du får inte posta i den här tråden | Till toppen