Forum: Programmerings lek

Forum huvudsida -> Programmering -> Programmerings lek

Sidor: 1 2 3 4 5 6 7

Till botten

tobbez 19:30 - 18:e Januari 2008 | Post #126
Medlem
Inlägg: 364


Skicka PM
Funkar med firefox 3 beta 2.
*Godkänner ozamosis lösning åt Python*




Python 11:44 - 19:e Januari 2008 | Post #127
Medlem
Inlägg: 157


Skicka PM
*kickar tobbez i baken och godkänner själv*


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



FunkyChicken 12:35 - 19:e Januari 2008 | Post #128
Nyhetsredaktör
Inlägg: 800


Skicka PM
Independence: jag tänkte nog att servern var kvar på ett adsl och att addressen byttes lite då och då.

Ozamosi får fixa ny uppgift!




Independence 12:43 - 19:e Januari 2008 | Post #129
Administratör
Inlägg: 1800


Skicka PM
    Citat av FunkyChicken:
Independence: jag tänkte nog att servern var kvar på ett adsl och att addressen byttes lite då och då.

Ozamosi får fixa ny uppgift!


Hm, fast det ADSLet har också haft statisk IP i några år

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

Vi är riddarna som säger fiskbulle!





FunkyChicken 16:26 - 19:e Januari 2008 | Post #130
Nyhetsredaktör
Inlägg: 800


Skicka PM
touché




ozamosi 22:40 - 20:e Januari 2008 | Post #131
Administratör
Inlägg: 1129


Skicka PM
Jag glomde ata mat idag, sa jag borjar bli hungrig. Alltsa vill jag att ni tillagar en "miniraknare" - dvs ett program som later anvandaren skriva in tva tal och ett raknesatt (forslagsvis inte som ett matematiskt uttryck, utan i flera steg som i C++-guiden), for att sedan skriva ut resultatet. Jag vill ha minst tva raknesatt, tack.

Edit: battre lank. Jag foreslar att det byggs for perl-tolken, da den pastas fungera bast.

-------------------------
Ljusblå

Senast redigerad 22:45 - 20:e Januari 2008


FunkyChicken 00:06 - 21:a Januari 2008 | Post #132
Nyhetsredaktör
Inlägg: 800


Skicka PM
Jag har inte perl installerat så jag vet inte om det fungerar, och det vore ju synd om ingen annan fick chansen att försöka... Men här är mitt förslag:

Delicious calculator-cake.

This is a delicious calculator-cake.

Ingredients.
1 kg sugar
1 kg cacao
1 l water
5 l milk
42 strawberries
1 onion

Method.
Take sugar from refrigerator.
Take water from refrigerator.
Take cacao from refrigerator.
Put water into mixing bowl.
Remove strawberries.
Fold milk into mixing bowl.
Drink the milk.
Put sugar into mixing bowl.
Add cacao.
Pour contents of the mixing bowl into the baking dish.
Put onion into mixing bowl.
Remove onion.
Fold onion into mixing bowl.
Set aside.
Drink until drinked.
Drink the milk.
Put sugar into mixing bowl.
Combine cacao.
Pour contents of the mixing bowl into the baking dish.
Set aside.
Drink until drinked.

Serves 1.



!¤&#&£$£$¤& Avsaknad av villkorssatser, måste fulanvända ful-loopar...




Python 14:46 - 29:e Februari 2008 | Post #133
Medlem
Inlägg: 157


Skicka PM
Kommer ozamosi att godkänna eller dissa FC försök?


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



ozamosi 17:38 - 29:e Februari 2008 | Post #134
Administratör
Inlägg: 1129


Skicka PM
Oh, det här hade jag glömt bort!

F_C:s kod fungerar inte - men jag upptäckte att det gäller för alla program som använder IO, oavsett om man använder perl- eller python-tolken. Det var en dålig uppgift, och eftersom ingen annan försökt så får jag godkänna F_C:s lösning.

-------------------------
Ljusblå



Python 13:45 - 9:e Mars 2008 | Post #135
Medlem
Inlägg: 157


Skicka PM
F_C: Du kan gärna posta en ny uppgiftSmiley

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



FunkyChicken 18:31 - 9:e Mars 2008 | Post #136
Nyhetsredaktör
Inlägg: 800


Skicka PM
Hade missat den här tråden. ...terkommer inom kort.




FunkyChicken 00:46 - 10:e Mars 2008 | Post #137
Nyhetsredaktör
Inlägg: 800


Skicka PM
Ok, dags för lite matte och en (tror jag) ganska simpel uppgift!

Betrakta följande:

5+3=5+1+1+1 (addition)
5*3=5+5+5 (multipliktation)
5^3=5*5*5 (exponention)
5^^3=5^(5^5) (tetration)

Dessa operatorer kallas i tur och ordning för hyper-1, hyper-2, hyper-3 och hyper-4. Det är lätt att inse att man på samma vis kan definiera hyper-5, hyper-6, osv.

Skriv en rekursiv funktion som kan beräkna resultatet av en godtycklig hyperfunktion på två tal. Vi intresserar oss endast för heltal. Demonstrera att lösningen fungerar. Valfritt språk.

Notera att hyper-1 och hyper-2 (addition och multiplikation) är kommutativa, dvs 5+3=3+5 och 5*3=3*5. Detta är inte sant för högre ordningar av hyperfunktionen.

EDIT: fixat felaktig nuffra.


Senast redigerad 00:25 - 12:a Mars 2008


Bookia 23:03 - 11:a Mars 2008 | Post #138
Medlem
Inlägg: 44


Skicka PM
Nu kan jag tyvärr inte rekursion så jag löste uppgiften på ett enklare nybörjar n00b loser vis:

  1. #usr/bin/perl
  2.  
  3. use warnings;
  4.  
  5. use strict;
  6.  
  7.  
  8. print "Detta program utför 4 olika beräkningssätt på 2 valfria värden. Dessa beräkningssätt är additon, multiplikation, exponention och tetration. \nVar god skriv in det första värdet: ";
  9.  
  10. my $firstvalue = <STDIN>;
  11.  
  12. chomp $firstvalue;
  13.  
  14. print "Var god skriv in värde nummer två: ";
  15.  
  16. my $secondvalue = <STDIN>;
  17.  
  18. chomp $secondvalue;
  19.  
  20. if ($secondvalue == 0){
  21. print "Operationerna kunde inte utföras eftersom det värdet nummer två är '$secondvalue'. Var god försök igen!";
  22. }
  23. else{
  24. my $addition = $firstvalue+$secondvalue;
  25. my $multiplikation = $firstvalue*$secondvalue;
  26. my $exponention = $firstvalue**$secondvalue;
  27. my $tetration = $firstvalue**$firstvalue**$firstvalue;
  28.  
  29. print "Resultaten av beräkningarna är:\nAddition ger: $addition\nMultiplikation ger: $multiplikation\nExponention ger: $exponention\nTetration ger: $tetration\n";
  30. }


Någon smartare kommer säkert med en rekursiv lösning. Smiley

-------------------------
All truth passes through three stages. First, it is ridiculed. Second, it is violently opposed. Third, it is accepted as being self-evident.
We are just an advanced breed of monkeys on a minor planet of a very average star.



Fasting 23:06 - 11:a Mars 2008 | Post #139
Medlem
Inlägg: 121


Skicka PM
Kodade en surutin i Perl.
  1. sub hyper_rek {
  2. my ($t1, $op, $t2) = @_;
  3.  
  4. if ($op eq "+") {
  5. if ($t2 > 0) {return 1 + hyper_rek($t1, $op, $t2-1)}
  6. else {return $t1}
  7. }
  8. elsif ($op eq "*") {
  9. if ($t2 > 1) {return $t1 + hyper_rek($t1, $op, $t2-1)}
  10. else {return $t1}
  11. }
  12. elsif ($op eq "^") {
  13. if ($t2 > 1) {return $t1 * hyper_rek($t1, $op, $t2-1)}
  14. else {return $t1}
  15. }
  16. elsif ($op eq "^^") {
  17. if ($t2 > 0) {return $t1 ** hyper_rek($t1, $op, $t2-1)}
  18. else {return $t1}
  19. }
  20. }

För att testa den hade jag med:
  1. use strict;
  2. use warnings;
  3.  
  4. print "\t".hyper_rek($ARGV[0], $ARGV[1], $ARGV[2])."\n";

och körde den vilket resulterade i det nedan.

perl proglek.pl 5 \+ 3
        8
perl proglek.pl 5 \* 3
        15
perl proglek.pl 5 \^ 3
        125
perl proglek.pl 2 \^^ 2
        16

\o/

-------------------------
Efter att ni har läst det här har ni insett att det inte gav något.



ozamosi 23:27 - 11:a Mars 2008 | Post #140
Administratör
Inlägg: 1129


Skicka PM
    Citat av FunkyChicken:

5+3=5+1+1+1 (addition)
5*3=5+5+5 (multipliktation)
5^3=5*5*5 (exponention)
5^^5=5^(5^5) (tetration)

Låt mig gissa:
sista raden ska vara 5^^3=5^(5^5) ?

-------------------------
Ljusblå



tobbez 00:10 - 12:a Mars 2008 | Post #141
Medlem
Inlägg: 364


Skicka PM
Solutions for you (jag utgår ifrån att ozamosi gissade rätt).

  1. #!/usr/bin/env python
  2.  
  3. def hyper1(val, times):
  4. if times == 0:
  5. return val
  6. else:
  7. return val + hyper1(1, times - 1)
  8.  
  9. def hyper2(val, times):
  10. if times == 1:
  11. return val
  12. else:
  13. return val + hyper2(val, times - 1)
  14.  
  15. def hyper3(val, times):
  16. if times == 1:
  17. return val
  18. else:
  19. return val * hyper3(val, times - 1)
  20.  
  21. def hyper4(val, times):
  22. if times == 1:
  23. return val
  24. else:
  25. return val ** hyper4(val, times - 1)
  26.  
  27. def metahyper(int_a, int_b, fn):
  28. return fn(int_a, int_b)
  29.  
  30. # Test printouts live here.
  31. print metahyper(5, 3, hyper1)
  32. print metahyper(5, 3, hyper2)
  33. print metahyper(5, 3, hyper3)
  34. print metahyper(5, 3, hyper4)


Let me know if I passed Smiley


Edit: Inte koda när man är trött, då kan det gå så illa att man löser fel uppgift. Jag satte visst rekursionen på fel plats.
Får väl återkomma efter behövd sömn.


Senast redigerad 00:26 - 12:a Mars 2008


FunkyChicken 00:22 - 12:a Mars 2008 | Post #142
Nyhetsredaktör
Inlägg: 800


Skicka PM
Rätt Ozamosi (vilket också fasting hade insett).
Däremot tänker jag inte godkänna någon lösning än - uppgiften är att skriva en funktion som beräknar hyperfunktionen av GODTYCKLIG ordning, dvs hyper-x av två tal, där x är något positivt heltal. Bookia och Fastings lösningar fungerar men bara för hyper-1,2,3,4.

Hint: Som jag försökte visa är hyper-n en upprepning av ett antal hyper(n-1), dvs tetration är en serie av exponentioner, som i sin tur är en serie av multiplikationer, osv. Här kommer rekursiviteten in i bilden.

Obs att hyperfunktionen vid högre ordningar snabbt returnerar groteskt stora tal som förmodligen inte går att beräkna. Ni behöver bara visa att funktionen fungerar i princip genom att köra den för tex exponention.

EDIT: En sak till som kanske kan förtydligas: 5^^3 definieras som 5^(5^5), INTE som (5^5)^5. Tänk på att göra saker i rätt ordning!



Senast redigerad 00:30 - 12:a Mars 2008


viblo 20:34 - 12:a Mars 2008 | Post #143
Medlem
Inlägg: 25


Skicka PM

hyper 1 a b = a+b
hyper n a b = foldr1 (hyper $ n-1) $ replicate b a


ska se om jag kan fixa till den lite så den blir lite snygg

Edit: Sådär. (kodat i haskell)
Den ger tex

*Main> hyper 4 2 4
65536
*Main> hyper 4 5 2
3125
*Main> hyper 4 6 2
46656
*Main> hyper 4 7 2
823543
*Main> hyper 4 8 2
16777216

Dock får man fuska lite för tex hyper 4 8 2 och ange hyper 2 a b = a*b, annars blir det stack overflow, men det räckte ju med principen Smiley

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

Senast redigerad 20:58 - 12:a Mars 2008


FunkyChicken 20:52 - 12:a Mars 2008 | Post #144
Nyhetsredaktör
Inlägg: 800


Skicka PM
Ser efter en snabbkoll med Haskellreferensen ut att fungera? (Haskell verkar för övrigt förbannat trevligt.)




ozamosi 21:08 - 12:a Mars 2008 | Post #145
Administratör
Inlägg: 1129


Skicka PM
hyper 4 2 0
;)

-------------------------
Ljusblå



fritte 21:16 - 12:a Mars 2008 | Post #146
Medlem
Inlägg: 23


Skicka PM
Min lösning var också i haskell. Postar nu för att slippa hitta på ny uppgift (:
  1. hyper a 1 b = a+b
  2. hyper a n 1 = a
  3. hyper a n b = hyper a (n-1) (hyper a n (b-1))





ozamosi 21:26 - 12:a Mars 2008 | Post #147
Administratör
Inlägg: 1129


Skicka PM
Kan fritte kan jagSmiley
Min ursäkt är att Wikipedias formelutskrift gjorde uppgiften lite väl enkel - men jag måste ju visa på hur många rader man kan göra lika lite påSmiley
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4.  
  5. __all__ = ['hyper']
  6.  
  7. def hyper(tal1, grad, tal2):
  8. """Implementerar godtyckliga hypern-operatorer
  9.  
  10. Facit hämtat från http://en.wikipedia.org/wiki/Knuth%27s_up-arrow_notation#Tables_of_values
  11. >>> [hyper(2, x, 1) for x in range(2, 7)]
  12. [2, 2, 2, 2, 2]
  13. >>> [hyper(2, x, 2) for x in range(2, 7)]
  14. [4, 4, 4, 4, 4]
  15. >>> [hyper(2, x, 3) for x in range(2, 5)]
  16. [6, 8, 16]
  17. >>> [hyper(2, x, 4) for x in range(2, 4)] [8, 16]
  18. >>> [hyper(2, x, 5) for x in range(2, 4)]
  19. [10, 32]
  20.  
  21. >>> [hyper(3, x, 1) for x in range(2, 7)]
  22. [3, 3, 3, 3, 3]
  23. >>> [hyper(3, x, 2) for x in range(2, 5)]
  24. [6, 9, 27]
  25. >>> hyper(3, 3, -1)
  26. Traceback (most recent call last):
  27. File "<stdin>", line 1, in ?
  28. ValueError: Tal2 är mindre än 0
  29. >>> hyper(3, -1, 2)
  30. Traceback (most recent call last):
  31. File "<stdin>", line 1, in ?
  32. ValueError: Graden är mindre än 0
  33. >>> hyper(-1, 3, 42)
  34. Traceback (most recent call last):
  35. File "<stdin>", line 1, in ?
  36. ValueError: Tal1 är mindre än 0
  37. """
  38. if tal1 < 0:
  39. raise ValueError, "Tal1 är mindre än 0"
  40. if grad < 0:
  41. raise ValueError, "Graden är mindre än 0"
  42. if tal2 < 0:
  43. raise ValueError, "Tal2 är mindre än 0"
  44. return _hyper(tal1, grad, tal2)
  45.  
  46. def _hyper(tal1, grad, tal2):
  47. if grad == 0:
  48. return tal2 + 1
  49. elif tal2 == 0:
  50. if grad == 1:
  51. return tal1
  52. elif grad == 2:
  53. return 0
  54. else:
  55. return 1
  56. else:
  57. return _hyper(tal1, grad - 1, _hyper(tal1, grad, tal2 - 1))
  58.  
  59. if __name__ == "__main__":
  60. import doctest
  61. doctest.testmod()


-------------------------
Ljusblå



FunkyChicken 23:21 - 12:a Mars 2008 | Post #148
Nyhetsredaktör
Inlägg: 800


Skicka PM
Bra jobbat! Viblos lösning var den första som fungerade så du får hitta på ny uppgift! (Ozamosis lösning är dock mer rätt eftersom att den tar hänsyn till att hyper-n av x och 0 alltid är lika med 1 om n är större än 2 (vilket följer av att x^0 är definierat som 1)).




viblo 19:04 - 13:e Mars 2008 | Post #149
Medlem
Inlägg: 25


Skicka PM
För några dagar sen stötte jag på ett problem som passar utmärkt: Om man har ett ord med omkastade bokstäver och man vill få hjälp med att kasta dom rätt så kan man generera alla möjliga kombinationer och söka efter dom på google och på så sätt få reda på vad som antagligen är rätt.

Dvs, skriv ett program som givet ett ord, tex "maen" testar att söka på google efter "maen", "mane", "naem" osv och väljer ut det som gav bäst svar. Givetvis ska inte programmet söka efter samma kombinationer flera gånger för samma ord, då det annars lätt kan bli många kombinationer. Språk är valfritt så länge det går att köra på win och linux.

(akta så att inte google bannar er baraSmiley


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



FunkyChicken 13:25 - 24:e Juli 2008 | Post #150
Nyhetsredaktör
Inlägg: 800


Skicka PM
DEMO-TAJM!

Då Viblos ack så innovativa idéer inom ordleksområdet inte fått någon respons på fyra månader tar jag mig friheten att hijacka den här tråden... Och det blir förstås ännu en matteuppgift!

Naturen är som bekant fylld av spännande matematik. Växter, till exempel, växer ofta i fraktala mönster. Faktum är att man kan beskriva många typiska växt-utseenden med enkla sk Lindenmayer-system. Man tar en sträng av tecken som symboliserar enkla matematiska operationer och utför sedan rekursiva substitutioner på den. På så vis kan man representera godtyckligt komplexa mönster med väldigt lite data. Detta är förstås (i någon mening) förklaringen till hur information om hela trädets utseende kan få plats i den pyttelilla DNA-molekylen i det pyttelilla fröet...

Vi ska alltså bygga demon som ritar träd!

Vi behöver någon grafikyta att rita på.
Vi behöver en "penna" med en viss position och en viss riktnig. (Som i turtle graphics.)
Och vi behöver en stack där vi kan spara och hämta position och vinkel för pennan.

Sedan tar vi en sträng av tecken som vi kallar för "axiom".

Vi ska använda följande tecken:
"F" - gå fram en viss längd
"+" - sväng en viss vinkel åt vänster
"-" - sväng en viss vinkel åt höger
"[" - lägg position på stacken
"]" - hämta position från stacken

Dessutom har vi en regel som byter ut alla förekomster av en viss delsträng i axiomet mot något annat. Denna regel applicerar vi sedan på axiomet ett godtyckligt antal gånger (3-4 ggr räcker, resultatet blir snabbt stort).

Exempel:
Axiom "F", Regel "F => +FF" blir:
F
+FF
++FF+FF
+++FF+FF++FF+FF
osv.

När vi itererat färdigt utvärderar vi strängen vi fått och utför ett kommando i taget från vänster till höger. Varje gång vi stöter på ett "F" ritar vi (förstås) ett streck med pennan.

Steglängd, antal iterationer och vinkel att svänga är parametrar som kan väljas relativt godtyckligt.

Så, uppgiften blir att skriva ett demo-liknande program som med hjälp av detta gör "något häftigt". Valfritt språk, själv vevade jag ihop ett exempel i C#. Men inte tjuvkika på färdig kod!

Kommando-tecknen har jag lånat från ett program som heter fractint. Vill man ha en större utmaning kan man implementera lite mer avancerade kommandon, se här.

Mer att läsa om L-system finns förstås på wikipedia.

Oh, just det!
Ett mönster att börja med vore kanske på sin plats. Med "F" som axiom och F => FF-[-F+F+F]+[+F-F-F] som regel bör ni få träd i stil med en viss skärmsläckare till X. Pröva er fram eller konsultera interwebben för fler exempel.

Och om någon lider av dendrofobi så är det okej att rita annat än just träd, det finns många andra spännande fraktaler.




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