Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  149 25079
men lurer på om det er noen annen måte å løse dette på?
Vis hele sitatet...
Ja med og droppe ca 18 if statement.
Se på råd |d13m0b gir om dictionary/list.
og det fungerer som bare det
Vis hele sitatet...
Bare for og gi deg et par problemer til og tenke på,prøv og tast feil eksp: a eller 1000.50.
Stikkord her er "Exception Handling" og "Float/Double"

Oppgave 8: Veksleautomat
Løst i python.

Kode

norske_penger = (200, 100, 50, 20, 10, 5, 2, 1, 0.5) #Tuple kan godt bruke list

def tilbake_betal ( min_sum, penger = norske_penger):     
     resultat = {} #Tomt dictionary    
     for item in norske_penger :
        resultat[item], min_sum = divmod(min_sum, item)    
     return resultat 

def bruker_input():    
    while True:
        try:
            Sum_vare = input('Sum varen koster: ')    
            sum_betale = input('Sum du betaler: ')               
            if Sum_vare > sum_betale:
                print 'For lite penger'
            else:
                print ''                   
                min_sum = sum_betale - Sum_vare
                return min_sum
        except (NameError, SyntaxError):
            print 'Kun tall'

def main():    
    tilbake = tilbake_betal(penger = norske_penger, min_sum = bruker_input())    
    print 'Penger tilbake'
    for item, freq in sorted(tilbake.items(),reverse=True):        
        if freq > 0 :           
            print '%d x %.2f kr' % (freq, item)    
        
if __name__ == '__main__':
    main()
Eksp output.

Kode

Sum varen koster: aa
Kun tall
Sum varen koster: 1000
Sum du betaler: 150
For lite penger
Sum varen koster: 1500
Sum du betaler: 2050.50

Penger tilbake
2 x 200.00 kr
1 x 100.00 kr
1 x 50.00 kr
1 x 0.50 kr
Sist endret av snippsat; 15. desember 2009 kl. 07:20.
Sitat av snippsat Vis innlegg
Ja med og droppe ca 18 if statement.
Se på råd |d13m0b gir om dictionary/list.

Bare for og gi deg et par problemer til og tenke på,prøv og tast feil eksp: a eller 1000.50.
Stikkord her er "Exception Handling" og "Float/Double"
Vis hele sitatet...
Dette har bevisst gått bort fra, for jeg ville bare se om jeg faktisk fikk til å lage en slik veksleautomat, det er en smal sak å fikse dette.

Men Takker for alle tips, og nå skal jeg sette i gang, å faktisk lære meg om dictionaries og list å alt det der.

Det skal sies at jeg er veeeldig "noob" om du vil innen programmering, kan KUN det veldig basiske, og setter stor pris på at andre folk faktisk gidder å hjelpe til
Sist endret av Ztratoz90; 15. desember 2009 kl. 09:43.
Hadde et par ledige minutter nå, så jeg viser en objektorientert variant av dette. Det blir gjerne mer kode ut av det, men jeg liker å holde ting objektorientert. Koden tar også med flertall på valuta. Koden kan forkortes noe hvis man vil bruke linq. Gjorde i tillegg dette om til kun én løkke istedet for det jeg beskreiv tidligere. Dette går nok litt på bekostning av leselighet.

Kode

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace KasseSystem
{
    public enum ValutaType
    {
        Lapp,
        Krone,
        Øre
    }

    public abstract class ValutaEnhet : ICloneable
    {
        public ValutaType ValutaType { get; set; }
        public double Verdi { get; set; }

        public override string ToString()
        {
            return string.Format("{0}-{1}", this.Verdi, this.ValutaType.ToString());
        }

        public object Clone()
        {
            return this.Clone();
        }
    }

    public class FemtiLapp : ValutaEnhet
    {
        public FemtiLapp()
        {
            this.ValutaType = ValutaType.Lapp;
            this.Verdi = 50d;
        }
    }

    public class Tyvekroning : ValutaEnhet
    {
        public Tyvekroning()
        {
            this.ValutaType = ValutaType.Krone;
            this.Verdi = 20d;
        }
    }

    public class Tier : ValutaEnhet
    {
        public Tier()
        {
            this.ValutaType = ValutaType.Krone;
            this.Verdi = 10d;
        }
    }

    public class Femmer : ValutaEnhet
    {
        public Femmer()
        {
            this.ValutaType = ValutaType.Krone;
            this.Verdi = 5d;
        }
    }

    public class EnKrone : ValutaEnhet
    {
        public EnKrone()
        {
            this.ValutaType = ValutaType.Krone;
            this.Verdi = 1d;
        }
    }

    public class FemtiØring : ValutaEnhet
    {
        public FemtiØring()
        {
            this.ValutaType = ValutaType.Øre;
            this.Verdi = 0.5d;
        }

        public override string ToString()
        {
            return string.Format("{0}-{1}", this.Verdi*100, this.ValutaType.ToString());
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            FemtiLapp femtiLapp = new FemtiLapp();
            Tyvekroning tyveKroning = new Tyvekroning();
            Tier tier = new Tier();
            Femmer femmer = new Femmer();
            EnKrone enKrone = new EnKrone();
            FemtiØring femtiØring = new FemtiØring();

            List<ValutaEnhet> valutaEnheter = new List<ValutaEnhet>();
            valutaEnheter.Add(femtiLapp);
            valutaEnheter.Add(tyveKroning);
            valutaEnheter.Add(tier);
            valutaEnheter.Add(femmer);
            valutaEnheter.Add(enKrone);
            valutaEnheter.Add(femtiØring);

            double pris = 27.5d;
            double betalt = 150;
            double rest = betalt - pris;

            List<ValutaEnhet> valutaTilbakePrint = new List<ValutaEnhet>();
            while (true)
            {
                if (rest < valutaEnheter[0].Verdi)
                {
                    if (valutaTilbakePrint.Count > 0)
                    {
                        string suffix = string.Empty;
                        if (valutaTilbakePrint.Count > 1)
                        {
                            suffix = "r";
                            if (valutaTilbakePrint[0].ValutaType == ValutaType.Lapp)
                                suffix = suffix.Insert(0, "e");
                        }

                        Console.Write("{0} - {1}{2}{3}", valutaTilbakePrint.Count, valutaTilbakePrint[0].ToString(), suffix, Environment.NewLine );
                        valutaTilbakePrint.Clear();

                        if (rest == 0d)
                            break;
                    }

                    valutaEnheter.RemoveAt(0);
                    continue;
                }

                rest -= valutaEnheter[0].Verdi;
                valutaTilbakePrint.Add(valutaEnheter[0] as ValutaEnhet);
            }
        }
    }
}
Utputt blir på denne måten:

Kode

2 - 50-Lapper
1 - 20-Krone
2 - 1-Kroner
1 - 50-Øre
Sist endret av m0b; 15. desember 2009 kl. 16:33.
▼ ... over et år senere ... ▼
Lenge siden noen har kommet med noen nye oppgaver her ja, kanskje litt dumt å bumpe denne tråden mtp at den er såpass gammel, men innholdet er jo ikke blitt gammelt enda!

Så, er det noen andre som har noen oppgaver å komme med ? Personlig er jeg utkikk etter ting å løse i java, i alle vanskelighetsgrader
Sitat av minimono95 Vis innlegg
Lenge siden noen har kommet med noen nye oppgaver her ja, kanskje litt dumt å bumpe denne tråden mtp at den er såpass gammel, men innholdet er jo ikke blitt gammelt enda!

Så, er det noen andre som har noen oppgaver å komme med ? Personlig er jeg utkikk etter ting å løse i java, i alle vanskelighetsgrader
Vis hele sitatet...
Hva slags oppgaver tenker du på? Selv har jeg hatt mye glede av Euler-project.
Om matematiske problemer er noe du kan finne underholdende så kan du jo se på det. Har ikke kommet så langt selv, tror jeg er på oppgave 11 eller 12 nå.
Queen of Blades
Jonta's Avatar
DonorCrew
moret: Ja, men du har jo ikke løst en på snart en måned jo!

Her er forresten en tråd som spør om sider som ligner på Project Euler, som forøvrig er veldig moro å være med på.

Mål: Ta igjen Dyret, deretter Goophy. nso og slashdot allerede forbigått (om enn så lenge?) ^^
Sitat av Jonta Vis innlegg
moret: Ja, men du har jo ikke løst en på snart en måned jo!
Vis hele sitatet...
Nei, det er nok programmering ved studiet mitt så må nesten prioritere det desverre. Akkurat nå er det C# og asp.net ved nettbutikk som står på timeplanen som er like greit. Det å kjøre matematikk er gøy, men ikke det mest lærerike om man tenker praktisk.
Måtte hvile hodet litt etter å ha arbeidet med matte i hele dag:
skrevet i Java:
(vet det ikke er helt komplett, men likevel)

Kode

import java.util.*;

class Tullball {
  public static void main (String[]args){
    
    Scanner input = new Scanner (System.in);
    
    Random generator = new Random();
    int random = generator.nextInt(100);

//blooper: System.out.println("den hemmelige verdien er: " +random); 
    
    System.out.print("Skriv inn en verdi mellom 0 - 100 : ");
    for(int i = 0; i < 5; i++){
      int inputValue = input.nextInt();
      
      if(inputValue != random){
        System.out.print("du har tastet feil verdi. Prøv igjen : ");
      }
      else if(inputValue == random){
        System.out.print("du har tastet riktig verdi");
      }
    }
  }
}
Sist endret av Spelly; 24. oktober 2011 kl. 15:19.
Her er oppgave 20 (projecteuler.net)

n! means n (n 1) ... 3 2 1

For example, 10! = 10 9 ... 3 2 1 = 3628800,
and the sum of the digits in the number 10! is 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27.

Find the sum of the digits in the number 100!

Jeg fant en løsning jeg lagde for en stund tilbake, dere som har startet å programmere i Python ,kan jo prøve å forstå hvordan jeg har gjort det.

Kode

import time

timer = 0
start = time.clock()
def num(n):
    if n==0:
        return 1
    else:
        return n * num(n-1)

print sum([int(i) for i in str(num(100))])
end = time.clock()
timer += end - start

print "time:", timer*1000, "ms"
Sitat av reaVen Vis innlegg

Kode

def num(n):
    if n==0:
        return 1
    else:
        return n * num(n-1)
Vis hele sitatet...
Her er hvordan jeg ville implementert factorial i Clojure, for dem som er interessert i å se hvordan det ser ut. Dette tilsvarer altså num-funksjonen over. Og min funksjon heter faktisk !

Kode

(defn ! [n] (->> (range 1 (inc n)) (reduce *)))
Om jeg nå f.eks. skriver:

Kode

(println (! 10))
så skriver jeg ut tallet 3628800
Sist endret av tormaroe; 25. oktober 2011 kl. 22:58.
Du mangler bare å plusse sammen alle tallene i 3628800, altså 3 + 6 + 2 + 8 + 8 + 0 + 0.

Lagde en ganske kort variant i Python (Python 2.6.6)

Kode

import math
n, i = 0, str(math.factorial(100))
for x in i: n+=int(x)
print n

Kode

import math
print sum([int(i) for i in str(math.factorial(100))])
Sitat av reaVen Vis innlegg
Du mangler bare å plusse sammen alle tallene i 3628800, altså 3 + 6 + 2 + 8 + 8 + 0 + 0.
Vis hele sitatet...
Selve oppgaven løste jeg for et år siden. Men har stagnert litt for meg på Euler i det siste - det begynner å bli vanskelig
Det er veldig sant, hvor langt har du kommet egentlig?
Jeg har løst 34 oppgaver. Den høyeste jeg har løst er nummer 92, den laveste jeg ikke har løst er nummer 12.
Jeg har drevet på med 12 i sånn 2 timer på skolen i dag ^^ klarer ikke finne en effektiv algoritme.
Fant dette spørsmålet på StackOverflow som sansynligvis vil kunne hjelpe oss til å optimalisere en løsning på #12. Har ikke tid til å forsøke nå, men si fra om du får det til, reaVen.
Jeg har løst 12 for lenge siden, men jeg husker ikke hvordan. Men jeg tror ærlig talt at det ikke var behov for en spesielt effektiv algoritme. Ut i fra å lese oppgaven ser det ut til at tallene er så små at det er bare å kjøre på med en naiv algoritme så skal det gå i en fei.
Hehe, jeg sluttet den oppgaven, klarte 48, 49 og 50 i stedet ^^
En lett oppgave: opprett en tabell med 1000 tilfeldige tall, skriv disse ut og regn ut gjennomsnittet...

min løsning ( skrevet i java);

Kode

import java.util.*;
class Sametest {
  public static void main (String[]args){
    
    int [] heltallsTabell = new int [1000];
    
    Random generator = new Random();
    for(int i = 0; i < 1000;i++){
      int random = generator.nextInt(1000);
      heltallsTabell[i] = random;
      //Arrays.sort(heltallsTabell);
    }
    for(int i = 0; i < heltallsTabell.length;i++){
      System.out.println (heltallsTabell[i]);
    }
    int sum = 0;
    for(int i = 0; i < heltallsTabell.length; i++){
      sum = heltallsTabell[i] + sum;
    }
    int gjennomsnitt = sum / heltallsTabell.length;
    System.out.print("Gjennomsnittet av tabellen er: " + gjennomsnitt);
  }
}
Sist endret av Spelly; 27. oktober 2011 kl. 00:44.
Sitat av spelley Vis innlegg
En lett oppgave: opprett en tabell med 1000 tilfeldige tall, skriv disse ut og regn ut gjennomsnittet...

min løsning ( skrevet i java);

Kode

import java.util.*;
class Sametest {
  public static void main (String[]args){
    
    int [] heltallsTabell = new int [1000];
    
    Random generator = new Random();
    for(int i = 0; i < 1000;i++){
      int random = generator.nextInt(1000);
      heltallsTabell[i] = random;
      //Arrays.sort(heltallsTabell);
    }
    for(int i = 0; i < heltallsTabell.length;i++){
      System.out.println (heltallsTabell[i]);
    }
    int sum = 0;
    for(int i = 0; i < heltallsTabell.length; i++){
      sum = heltallsTabell[i] + sum;
    }
    int gjennomsnitt = sum / heltallsTabell.length;
    System.out.print("Gjennomsnittet av tabellen er: " + gjennomsnitt);
  }
}
Vis hele sitatet...
Jeg må nesten poste en kodesnutt fra python for å vise hvor enkelt det kan gjøres..

Kode

from random import randint
print sum([randint(0,1000) for i in range(0,1000)])/1000
Sitat av steinarlima Vis innlegg
Jeg må nesten poste en kodesnutt fra python for å vise hvor enkelt det kan gjøres..

Kode

from random import randint
print sum([randint(0,1000) for i in range(0,1000)])/1000
Vis hele sitatet...
Fuuu! :P
12 linjer mindre!

Da har jeg begynt å lære meg python!
Sist endret av Spelly; 27. oktober 2011 kl. 01:39.
Glemte forøvrig en ting - python tolker / som heltallsdivisjon, så dette

Kode

from random import randint 
print sum([randint(0,1000) for i in range(0,1000)])/1000.0
eller dette

Kode

from __future__ import division
from random import randint
print sum([randint(0,1000) for i in range(0,1000)])/1000
svarer bedre på oppgaven.
med fruktkjøtt.
Tias's Avatar
Crew
steinarlima: Men python-koden oppretter jo hverken en tabell eller skriver ut alle tallene i den, den bare skriver ut gjennomsnittet.

Kode

  (loop for i from 1 to 1000 
     for ran = (random 1000)
     summing ran into sum_random
     do (print ran)
     finally (print (/ sum_random 1000))
     collect ran)
Her er hele skiten i form av en Common Lisp macro. Den returnerer en lenket liste som representerer tabellen.

(Jeg tar kravspesifikasjoner veldig bokstavelig)
Sist endret av Tias; 27. oktober 2011 kl. 02:02.
Sitat av Tias Vis innlegg
steinarlima: Men python-koden oppretter jo hverken en tabell eller skriver ut alle tallene i den, den bare skriver ut gjennomsnittet.

Kode

  (loop for i from 1 to 1000 
     for ran = (random 1000)
     summing ran into sum_random
     do (print ran)
     finally (print (/ sum_random 1000))
     collect ran)
Her er hele skiten i form av en Common Lisp macro. Den returnerer en lenket liste som representerer tabellen.
Vis hele sitatet...
Sant nok - tallene blir ikke printet ut, men det blir opprettet en liste (om listen skal lagres på stack sier kravspesifikasjonen ingenting om..)
Her er en riktig versjon:

Kode

from random import randint
values = [randint(0,1000) for i in range(0,1000)]
for value in values: print value
print sum(values)/1000.0
Sist endret av steili; 27. oktober 2011 kl. 02:06.
med fruktkjøtt.
Tias's Avatar
Crew
Sitat av steinarlima Vis innlegg
Sant nok - tallene blir ikke printet ut, men det blir opprettet en liste (om listen skal lagres på stack sier kravspesifikasjonen ingenting om..)
Vis hele sitatet...
Oj, det ble det visst. Merker jeg er rusten i Python. Nice!

Men hvis vi går ut ifra at det bare er gjennomsnittet av summen av alle tallene i tabellen spelley er ute kan Common Lisp også komme med oneliners:

Kode

(print (/ (apply #'+ (loop repeat 1000 collect (random 1000))) 1000))
Resultatet blir en brøk (ala 61079/125) siden ikke noe annet er presisert
Sist endret av Tias; 27. oktober 2011 kl. 02:23.
Sitat av Kråkelefse Vis innlegg
Jeg har løst 12 for lenge siden, men jeg husker ikke hvordan. Men jeg tror ærlig talt at det ikke var behov for en spesielt effektiv algoritme. Ut i fra å lese oppgaven ser det ut til at tallene er så små at det er bare å kjøre på med en naiv algoritme så skal det gå i en fei.
Vis hele sitatet...
Min naive algoritme finner i alle fall ingen løsning i en fei.., langt der i fra!
Sitat av tormaroe Vis innlegg
Min naive algoritme finner i alle fall ingen løsning i en fei.., langt der i fra!
Vis hele sitatet...
Lenge siden jeg tok den, men generelt sett om faktoriseringsoppgaver så er det lurt å ha en dynamisk programmeringstilnærming. Det er kode som kommer godt med når du skal ta senere oppgaver. Blir typisk noe slikt:

Prealloker en liste/array av en viss størrelse og la element K ha verdien til antallet faktorer i tallet K. Dermed kan du slå opp tidligere tall heller enn å rekalkulere. F.eks. hvis 1024 faktoreres til 8*128, så kan man hente ut 128 og 8 fordi man antagelig har beregnet dem allerede. Du trenger også bare å betrakte faktorer opp til sqrt(tall) siden multiplikasjon er kommutativt og du dermed vil finne alle mulige faktorer på vei opp.

Oppgaven tar maks et sekund med en god faktoriseringsalgoritme.
Sitat av Tias Vis innlegg
Oj, det ble det visst. Merker jeg er rusten i Python. Nice!

Kode

(print (/ (apply #'+ (loop repeat 1000 collect (random 1000))) 1000))
Vis hele sitatet...
Bare for sammenligning: I Clojure har man ikke loop-makroen. Derfor ville jeg skrevet dette slik:

Kode

(println (/ (apply + (take 1000 (repeatedly #(rand-int 1000)))) 1000))
Men for lesbarhetesn skyld kan jeg også snu litt på det, f.eks.:

Kode

(println (/ (->> #(rand-int 1000) repeatedly (take 1000) (apply +)) 1000))
Skal jeg fjerne duplisering og gjøre det mere lesbart for utviklere som ikke kan Lisp blir det kanskje noe sånn:

Kode

(let [n 1000
       random-numbers-to-infinity-and-beyond (repeatedly #(rand-int 1000))
       random-numbers (take n random-numbers-to-infinity-and-beyond)
       sum (apply + random-numbers)
       average (/ sum n)]
  (println average))
▼ ... mange måneder senere ... ▼
&lt;?=getUserTitle()?&gt;
Kanskje noen kan komme på noen nye oppgaver vi kan bryne oss på?
▼ ... over en måned senere ... ▼
Jeg har løst oppgave 1, men har et problem.
Når jeg bruker randint eller randrange modulen, så blir det tilfeldige tallet mindre enn null, altså du får aldri riktig.
F. eks. "Skriv et tall: 0"
"Nei, det er for høyt".
Det er ikke bare min kode der det skjer heller, prøvde koden til han som postet et svar først og det skjer det samme...

Men her er ihvertfall koden min:

Kode

# -*- coding: utf-8 -*-
#!/usr/bin/python
#Tilfeig nummergenerering.
import random
from time import sleep

Machinenumber=random.randint(0, 101)
Personname=raw_input("Skriv navnet ditt: ")
print "Hei " + Personname, ", jeg har et nummer mellom 0 og 100. Kan du gjette det?"

Continue = True 
while Continue:
  Personnumber=raw_input("Skriv tallet ditt her: ")
  if Personnumber < Machinenumber:
    print "Haha, du er for lavt."
  if Personnumber > Machinenumber:
    print "Haha, du er for høyt."
  if Personnumber == Machinenumber:
    print Personname + ", du må være synsk, fordi du gjettet riktig ;-)"
  
  choice = ""
  while choice.lower() not in ["ja", "nei"]:
    choice = raw_input("Vil du prøve igjen? Ja eller nei.")
  if choice.lower() == "nei":
    Continue = False
    print "Goodbye!"
    sleep(3)
Sist endret av 23732; 17. juni 2012 kl. 01:36.
Det er fordi raw_input blir en streng. Til formålet kan du heller bruke input:

Kode

In [1]: raw = raw_input()
1337

In [2]: type(raw)
Out[2]: <type 'str'>

In [3]: inp = input()
1337

In [4]: inp == raw
Out[4]: False

In [5]: raw == 1337
Out[5]: False

In [6]: inp == 1337
Out[6]: True

In [7]: type(raw)
Out[7]: <type 'str'>
Selvfølgelig :-P
Det er jo slik at når det er tall så skal man bruke input, og med strenger så er det raw_input.

Uansett, tusen takk for hjelpen :-)
▼ ... noen uker senere ... ▼
Tok meg litt tid å lagde en versjon av Game of Life i Python ved hjelp av PyGame, de som vil kan ta en titt
koden er dårlig kommentert, men dere som er interessert kan prøve å finne ut hvordan jeg har tenkt

http://pastie.org/4264795

edit: Kun testet med Python 2.6.6
Sist endret av reaVen; 16. juli 2012 kl. 14:20.
Sitat av reaVen Vis innlegg
Tok meg litt tid å lagde en versjon av Game of Life i Python ved hjelp av PyGame, de som vil kan ta en titt
koden er dårlig kommentert, men dere som er interessert kan prøve å finne ut hvordan jeg har tenkt

http://pastie.org/4264795
Vis hele sitatet...
Har du sett min løsning?
Nei, men ble delvis fornøyd med min, kan ha den så stor som du vil, med å skifte en variabel og jeg tror alt funker som det skal ^^
Sitat av reaVen Vis innlegg
Nei, men ble delvis fornøyd med min, kan ha den så stor som du vil, med å skifte en variabel og jeg tror alt funker som det skal ^^
Vis hele sitatet...
Vet ikke om du testet min i browseren også, men den kan vokse og krympe etter behov etterhvert som tiden går (en utvidelse i forhold til videoen). Fungerer i Chrome, men ytelsen er ikke særlig bra om brettet blir stort.

Wikipedia: "The universe of the Game of Life is an infinite two-dimensional orthogonal grid of square cells"
▼ ... over en uke senere ... ▼

Kode

 

 -*- coding: cp1252 -*- vet ikke helt hvorfor det dukker opp

# mesteparten er bare et plagiat


import random


thenumber1 = random.randint(0, 9) 
thenumber2 = random.randint(0, 9)


loop = 1 
loop1 = 2


#Definerer choice. 
choice1 = 4 
choice2 = 5


print "Gjett et tall mellom 0 - 99?"  
print "Plagiat av Tkvikstad" 

yourname = raw_input("Ka hete du : ")  

    
while loop == 1: 
    choice1 = input("Første Runde, hvilket tall er det?: ") 
    if choice1 == thenumber1: 
        print "Gratulere med første tall," + " " + yourname + "!" 
        loop = 0 
        print "Over til neste tall j for ja, n for nei." 
        restart = raw_input("Over til neste tall: ") 
        if restart == "j": 
              loop1 = 2 
        elif restart == "n": 
            loop = 0 
            print "Game Over!" 
            exit() 
    elif choice1 < thenumber1: 
        print "Høyere" 
        loop = 1 
    elif choice1 > thenumber1: 
        print "Lavere!" 
        loop = 1 
    elif choice1 > 10: 
        print "Idiot!" 
        loop = 1

while loop1 == 2: 
    choice2 = input("Andre Runde hvilket tall er det?: ") 
    if choice2 == thenumber2: 
        print "Andre er rett" + " " + yourname + "!"  
        loop = 0 
        print "Koden er " + str(choice1) + str(choice2) 
        restart = raw_input("Vil du prøve på nytt?  for ja, n for nei. ") 
        if restart == "j": 
            loop = 1
        elif restart == "n": 
            loop = 0 
            print "Ja ja, ikke alle kan vinne!" 
            exit() 
    elif choice2 < thenumber2: 
        print "Høyere!" 
        loop1 = 2 
    elif choice2 > thenumber2: 
        print "Lavere" 
        loop1 = 2 
    elif choice2 > 10: 
        print "Idiot!" 
        loop1 = 2
En litt anderledes versjon av gjetteleken. Hoved problemet er at jeg ikke får loopet tilbake til start. Får bare opp runde to igjen. Noen som vet hvordan jeg får loopet tilbake til starten?
Du kan putte enda en while-loop rundt alt.
Sitat av TheJokerHD Vis innlegg
Kanskje noen kan komme på noen nye oppgaver vi kan bryne oss på?
Vis hele sitatet...
Hvilket nivå vil du at de oppgavene skal være da, er endel oppgaver her allerede og ikke mange som har lagt ved løsninger.
Lekte meg litt i Clojure i kveld med oppgave 2 fra posten som startet denne tråden:

...her er det du som skal tenke på et tall, og programmet skal gjette. Du gir tilbakemelding til programmet om det skal gjette høyere eller lavere. Her vil jeg også ha med at den teller antall forsøk, så da er det om å gjøre å finne ut hvordan du kan få den til å gjette tallet på færrest mulig forsøk.
Vis hele sitatet...
Jeg lagde en ren funksjonell løsning:

Kode

(defn solve 
  "Side-effect free function to find a number in a range.
  oracle is a function that will validate a guess (if it's
  correct, too high, or too low. Yields the number of
  guesses it had to make."
  [from to oracle]
  (letfn [(guess-between [low high]
            (quot (+ low high) 2))]
    (loop [attempts 1
           low      (dec from)
           high     (inc to)]
      (let [guess (guess-between low high)]
        (condp = (oracle guess)
          :too-low  (recur (inc attempts) guess high)
          :too-high (recur (inc attempts) low  guess)
          :correct  attempts)))))
For å bruke denne funksjonen manuelt i konsollet laget jeg en funksjon for å spørre brukeren om et tall var riktig gjettet, og en funksjon for å starte "spillet":

Kode

(defn manually-verify-answer [guess]
  (print "Is it" guess 
         "(y:yes / l:too low / h:too high? ") 
  (flush)
  (condp = (read)
    'y :correct
    'l :too-low
    'h :too-high
    (do
      (println "Please reply with one of the letters"
               "y, l, or h.")
      (recur guess))))

Kode

(defn run-manually []
  (println "Think of a number from 0 to 100.")
  (println "I solved it with" 
           (solve 0 100 manually-verify-answer) 
           "guesses!"))
Jeg var deretter interessert i å finne ut hvor god løsningen var til å gjette. Jeg lagde en funksjon som opprettet automatiske verifiserings-funksjoner:

Kode

(defn make-oracle 
  "Yields an oracle function for any correct answer."
  [correct-number]
  (fn [guess]
    (cond
      (< guess correct-number) :too-low
      (> guess correct-number) :too-high
      (= guess correct-number) :correct)))
Så trengte jeg en liten average-funksjon:

Kode

(defn average [seq]
  (/ (apply + seq)
     (count seq)))
Og så til slutt en funksjon for å kjøre løsningen på en gitt range:

Kode

(defn run-complete [from to]
  (println "Running solver for all numbers between"
           from "and" to)
  (->> 
    (range from (inc to))
    (map #(solve from to (make-oracle %)))
    average
    float
    (println "Average guesses to solve:")))
Fra 0 til 100 bruker funksjonen i snitt 5,8 forsøk.
Fra 0 til 1000 bruker funksjonen i snitt 8,988 forsøk.
Fra 0 til 10000 bruker funksjonen i snitt 12,36 forsøk.
Fra 0 til 100000 bruker funksjonen i snitt 15,7 forsøk.
Osv., osv. ...

Å finne snittet for en range fra 0 til én million tar på min maskin ca 1438 millisekunder med denne koden. Fra 0 til 10 mill tar det ca 17 sekunder.

DET SOM VAR LITT OVERRASKENDE kom resultatet jeg fikk da jeg forsøkte å parallellisere testen. Jeg har 8 kjerner på laptopen, og endret den siste funksjoner over fra å bruke map til å bruke pmap. Alle CPU'ene ble nå involvert i å teste de ulike tallene, men det ser ut til at koordineringen mellom trådene har et ganske stort overhead, for nå tok rangen fra 0 til 10 millioner hele 24 sekunder.

Er det noen som kan forklare hvorfor på en overbevisende måte? Burde det gå raskere om jeg manuelt delte opp rangen i 8, og kjørte 8 ulike tråder, for så til slutt å folde sammen resultatet?
Noen som vet hvordan jeg får loopet tilbake til starten?
Vis hele sitatet...
For at det ikke skal bli mere spaghetti-kode enn det allerede er nå,må du prøve og strukturerer koden bredere.
Du kan som Ozma foreslår putte while-loop rundt alt,men det blir overhode ikke pent.
while loop og while loop1 gjør stort sett det samme, gjentakende kode er aldri bra.
Viss du skulle forsette koden ville du da skrevet while loop2?

Et tips er når koden nærmer seg 15-20 linjer,
og du er langt fra ferdig må du tenk på og strukturerer bredere noe som betyr og bruke funksjoner/klasser.
Kan skive et eksempel,så blir dette letter og forstå.

Kode

import random

def guess_game():
    '''The logic of game code here'''
    secret_number = random.randint(1,100)
    guess,tries = 0,1
    while guess != secret_number:
        guess = int(raw_input("Take a guess: "))
        if guess > secret_number:
            print "Lower..."
        elif guess < secret_number:
            print "Higher..."
        tries += 1
    print 'You guessed it! The number was %s in %s tries' % (guess,tries)
    raw_input('Press enter to return to menu')

def scorce():
    '''
    Not finish yet
    You can have many fuction that do separate job
    Or take return argument from other functions and do some more work
    '''
    pass

def menu_loop():
    '''You always fall back into this menu when game is finish'''
    while True:
        print '(1) Play guess number game'
        print '(q) Quit'
        choice = raw_input('Enter your choice: ')
        if choice == '1':
            guess_game()
        elif choice == 'q':
            return False
        else:
            print 'Not a correct choice: {}'.format(choice)

menu_loop()
# -*- coding: cp1252 -*- vet ikke helt hvorfor det dukker opp
Vis hele sitatet...
Når det spesifiseres en "encoding" på toppen av programmet betyr det at du kan bruke tegn fra fra den "encoding" i koden.
Når du bruker norske tegn som "æøå" tipper python på "encoding" derfor kommer cp1252 på toppen.
Sist endret av snippsat; 26. juli 2012 kl. 01:58.
Takk for svar, fikk ikke helt til å sette en while loop rundt hele. Bare et spørsmål. Er det "while True" statmenten som får programmet til å loope seg selv i dette tilfellet?


Koden jeg endte opp med.

Kode

 

import random

def guess_game():
    '''The logic of game code here'''
    secret_number = random.randint(0,9)
    secret_number1 = random.randint(0,9)
    guess,tries = 0,1
    while guess != secret_number:
        guess = int(raw_input("Round1: Take a guess: "))
        if guess > secret_number:
            print "Lower..."
        elif guess < secret_number:
            print "Higher..."
        elif guess == secret_number:
            print "Correct!"
        tries += 1

    while guess != secret_number1:
        guess = int(raw_input("Round2: Take a guess: "))
        if guess > secret_number1:
            print "Lower..."
        elif guess < secret_number1:
            print "Higher..."   
        tries += 1

        if guess == secret_number1:
            print "The code is " + str(secret_number) + str(secret_number1)
            print 'You used ' + str(tries) + " tries!"
            raw_input('Press enter to return to menu')
        
def scorce():
    '''
    Not finish yet
    You can have many fuction that do separate job
    Or take return argument from other functions and do some more work
    '''
    pass

def menu_loop():
    '''You always fall back into this menu when game is finish'''
    while True:
        print '(1) Play guess number game'
        print '(q) Quit'
        choice = raw_input('Enter your choice: ')
        if choice == '1':
            guess_game()
        elif choice == 'q':
            return False
        else:
            print 'Not a correct choice: {}'.format(choice)

menu_loop()
@Tormaroe:
Dette ser relevant ut: http://stackoverflow.com/questions/2...-inexpensive-f

Litt C# parallellisme

Kode

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Threading;

namespace Freak
{
    class Program
    {
        static void Main(string[] args)
        {
            
            Stopwatch w = new Stopwatch();
            
            w.Start();

            long totalGuesses = 0;
            Parallel.For(0, (int)1e7, () => 0, 
                (i, loop, subTotal) => subTotal += Solve(new Game(i), 0, (int)1e7),
                (x) => Interlocked.Add(ref totalGuesses, x)
            );
            
            w.Stop();

            Console.WriteLine("Avg. Guesses: {0}", totalGuesses / 1e7);
            Console.WriteLine(w.ElapsedMilliseconds);
            Console.Read();
        }

        public static int Solve(Game g, int min, int max)
        {
            int guess = Avg(min, max);
            switch (g.Guess(guess))
            {
                case -1:
                    return Solve(g, guess, max) + 1;
                case 1:
                    return Solve(g, min, guess) + 1;
                default:
                    return 1;
            }
        }

        public static int Avg(int a, int b)
        {
            return (int)Math.Round((a + b) / 2.0);
        }
    }

    public struct Game
    {
        public readonly int number;

        public Game(int n)
        {
            number = n;
        }

        /// <returns>
        /// -1: To low
        ///  0: Correct
        ///  1: To high
        /// </returns>
        public int Guess(int guess)
        {
            return (guess == number) ? 0 : (guess < number) ? -1 : 1;
        }

    }
}
Ny liten oppgave til dere:
lag et program som verifiserer et personnummer for å sjekke om det er gyldig.

Jeg lagde et kjapt lite python script for å teste -> http://www.pastie.org/4341505 jeg har kun testet det med mitt personnummer.
her finner dere relevant informasjon -> http://no.wikipedia.org/wiki/Personnummer

hvis du er ute etter en utfordring kan du lage et program som genererer gyldige personnummer.
Lykke til.
▼ ... over en måned senere ... ▼
http://pastie.org/4669441
Her er mitt forsøk på å generere gyldige fødselsnummer i Java.
Jeg er ganske ny innen programmering, så hvis noen har noen tips angående koden er jeg veldig takknemlig.
http://pastie.org/4670710
Mitt python bidrag for å generere personnummer for en gitt dato.
edit: ment til 7ate9
Du programmerer mot grensesnitt, altså at du bruker interface/abstrakte klasser som type på variablen, mens du instansierer den til en konkret klasse. Det er bra. Du bruker også regulære uttrykk for å sjekke om det er en gyldig dato, det er også bra. Stringbuilder er også bra.

Et par tips til forbedring: du hopper mye frem og tilbake mellom representasjonen av personnummeret som heltall og streng. Personnummeret er litt teit sånn sett, siden du både skal foreta en kontrollberegning og må ha ledende nuller i tallet. Uansett kan du gjøre parameterlisten i kontrollmetodene dine mye kortere. Du trenger faktisk bare et parameter, en streng eller et heltall. I begge tilfeller kan du bruke en løkke for å gå gjennom sifrene i personnummeret og gange med konstantene.

Her er noen egenskaper med titallssystemet som kan være grei å ha i bakhodet når du programmerer:
  • x * 10 + d, der d er et siffer, legger til sifferet på slutten av tallet.
  • x modulo 10 gir det siste sifferet i et tall. (når du så deler på 10 og gjentar får du det neste sifferet)
  • Floor(log10 tall) +1 gir antall siffer i et tall. Denne er litt kryptisk og ikke så lesbar, men grei å vite om.

Pass på å få riktig indentert kode, ellers er det nesten umulig å lese. Du har også en if-statement der det er for mange linjer i if-blokken. Når jeg kommer til else-blokken har jeg helt glemt hva "else" betyr. Det kan være lurt å håndtere spesialtilfeller først. Hadde du skrevet i begynnelsen:

Kode

if(!isValidDate(date)){
	System.out.println("Feil dato");
	return;
}
Kunne du skrevet resten av koden uten å bekymre deg for ugyldige datoer. Eventuelt kunne du kastet et exception.

I tillegg kan du jobbe med å trekke ut flere metoder. Da blir koden mer selvforklarende.

Dessuten bør man skille datamodeller fra (bruker)grensesnitt. Altså at du håndterer selve personnumrene i en klasse og skriver ut/tar imot data og sender til modellen i en annen.
Sist endret av lor3ntz; 6. september 2012 kl. 01:51.
▼ ... noen måneder senere ... ▼
Kanskje litt sent ute, men kom over denne tråden, og prøvde meg på de to første oppgavene i Python Skal se litt på de andre senere også, men her er ihvertfall mine forslag til oppgave 1 og 2.

Oppgave 1:

Kode

#Gjette på tall


y = Y = yes = Yes = YES = ja = Ja = JA = 101
n = N = no = No = NO = nei = Nei = NEI = 102

#Start, med en liten loop for flere forsøk
start = 1
while start == 1:
    print '\n\n\n\n\n\n'
    print "Her skal du gjette på et tall mellom 1 og 100, det er om å bruke minst miulig forsøk, det blir sagt om tallet skal være høyere eller lavere"
    print " "
    #Loopen starter 
    loop = 1
    start = 0
    while loop == 1:
        fors = 0
        import random
        t = random.randint(1,100) #Tallet programmet tenker på
        print '\n\n'
        print "Jeg tenker på et tall mellom 1 og 100"
        choice=raw_input("Trykk -ENTER- når du er klar   ") 
        loop2 = 1 #Loop nummer 2, for flere gjett
        while loop2 == 1:
            fors = fors+1  #Legger t
            print '\n\n\n\n'
            choice=input("Gjett: ")
            if choice < t:
                print "Tallet jeg tenker på er høyere"
            if choice > t:
                print "Tallet jeg tenker på er lavere"
            elif choice == t:
                loop2 = 0
                start = 0
                if fors < 5:
                    print "Gratulerer, du klarte det på bare", fors, "forsøk! Veldig bra!"
                    choice = input("Vil du gjøre det igjen? [Y/N]: ")
                    if choice == 101: #variabel for ja
                        loop = 1
                    elif choice == 102: #variabel for nei
                        loop = 0
                elif fors == 5 or fors == 6 or fors == 7 or fors == 8 or fors == 9 or fors == 10:
                    print "Du klarte det, men på", fors, "forsøk. Helt ok, men du kan nok bedre!"
                    choice = input("Vil du gjøre det igjen? [Y/N]: ")
                    if choice == 101: #variabel for ja
                        loop = 1
                    elif choice == 102: #variabel for nei:
                        loop = 0
                elif fors > 10:
                    print '+n'
                    print "Du klarte det på bare", fors, "forsøk, dette er ganske dårlig."
                    choice = input("Vil du gjøre det igjen? [Y/N]: ")
                    if choice == 101:#variabel for ja
                        loop = 1
                    elif choice == 102: #varoabel for nei
                        loop = 0



Oppgave 2:

Kode

#Computer gjetter tall

#Gjette på tall

tell = 0
y = Y = yes = Yes = YES = ja = Ja = JA = 101
n = N = no = No = NO = nei = Nei = NEI = 102
hoy = HOY = Hoy = 69
lav = LAV = Lav = lavere = Lavere = 96

#Start, med en liten loop for flere forsøk
start = 1
while start == 1:
    print '\n\n'
    print "Her skal du tenke på et tall mellom 1 og 100, programmet skal gjette det, men når han gjetter feil må du si om det du tenker på er høyere eller lavere, ved å si 'høy' eller 'lav'"
    raw_input("Trykk -ENTER- når du er klar ")
    print " "
    x = 1
    y = 100
    #Loopen starter 
    loop = 1
    start = 0
    while loop == 1:
        tell = tell +1
        import random
        gjett = random.randint(x,y)
        print "Er", gjett, "tallet du tenker på?"
        choice = input("[Y/N]: ")
        if choice == 101
            print "Jeg klarte det, på", tell, "forsøk."
            choice = input("Vil du gjøre det igjen? ")
            if choice == 101:
                loop = 0
                start = 1
            elif choice == 102:
                loop = 0
                start = 0
        elif choice == 102:
            print "Er tallet du tenker på høyere eller lavere?"
            choice = input("[Hoy/Lav] ")
            if choice == 69:
                x = gjett+1
            elif choice == 96:
                y = gjett-1
Sitat av EitZey Vis innlegg
Kanskje litt sent ute, men kom over denne tråden, og prøvde meg på de to første oppgavene i Python Skal se litt på de andre senere også, men her er ihvertfall mine forslag til oppgave 1 og 2.
Vis hele sitatet...
Skal bare gi deg noen tips som jeg så i farta!

Tips: Hold alle imports i TOPPEN av koden.

Kode

y = Y = yes = Yes = YES = ja = Ja = JA = 101
n = N = no = No = NO = nei = Nei = NEI = 102
Jeg ser du bruker en lang remse variabler for å finne ut om personen sier ja eller nei. Annet forslag til løsning:

Kode

answer = raw_input("y/n").lower()
if answer in ["ja","yes","y"]:
    print "yay!"
elif answer in ["n","no","nei"]:
    print "nay!"
Noen andre små tips:

Kode

fors = fors+1
#kan skrives
fors += 1

#Dette går også:
fors *= 2
fors -= 1
fors /= 2

####
elif fors == 5 or fors == 6 or fors == 7 or fors == 8 or fors == 9 or fors == 10:

#kan skrives
elif fors in [5,6,7,8,9,10]:
Sitat av Foxboron Vis innlegg
Skal bare gi deg noen tips som jeg så i farta!

Tips: Hold alle imports i TOPPEN av koden.

Kode

y = Y = yes = Yes = YES = ja = Ja = JA = 101
n = N = no = No = NO = nei = Nei = NEI = 102
Jeg ser du bruker en lang remse variabler for å finne ut om personen sier ja eller nei. Annet forslag til løsning:

Kode

answer = raw_input("y/n").lower()
if answer in ["ja","yes","y"]:
    print "yay!"
elif answer in ["n","no","nei"]:
    print "nay!"
Noen andre små tips:

Kode

fors = fors+1
#kan skrives
fors += 1

#Dette går også:
fors *= 2
fors -= 1
fors /= 2

####
elif fors == 5 or fors == 6 or fors == 7 or fors == 8 or fors == 9 or fors == 10:

#kan skrives
elif fors in [5,6,7,8,9,10]:
Vis hele sitatet...
Tusen takk, skal prøve dette i fremtiden