Font
[thread]6564[/thread]

RDW #9 - Rätsel der Woche 9

Tags: Similar Threads

Reader: 1


<< |< 1 2 >| >> 13 entries, 2 pages
Crian
 2004-09-04 15:41
#49881 #49881
User since
2003-08-04
5826 articles
ModeratorIn
[Homepage]
user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
 RDW #9 - Raetsel der Woche Nummer 9
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


Regeln:  * Bitte nicht vor Ablauf der ersten 72 Stunden ( = drei Tage ) nach
~~~~~~~    Veroeffentlichung Hinweise (Spoiler) oder Loesungen veroeffent-
           lichen!

         * Wenn diese Zeit abgelaufen ist, werde ich einen Thread mit passen-
           dem Titel erstellen, in dem die Loesungen gepostet werden und dis-
           kutiert werden koennen.

         * Die Loesungen sollten nicht nur gepostet, sondern auch an mich ge-
           mailt werden, damit ich sie testen, "bewerten"  und zusammenfassen
           kann. Die Adrese dafuer lautet:

           crian <---AT---> perl <---MINUS---> community <---DOT---> de

           Im Betreff sollte 'RDW' und die Nummer des Raetsels stehen. Hilf-
           reich waere neben dem Quellcode der Username im Forum sowie Perl-
           und OS-Version, falls Du diese kennst.

         * Verstaendnisfragen duerfen in diesem Thread gestellt werden, aber
           Tipps und (Teil-) Loesungen sind hier unerwuenscht.

         * Ich werde die eingeschickten Programme im Netz zur Verfuegung
           stellen, so dass gerade lange Quellcodes nicht (komplett)
           gepostet werden muessen.

         * Zur Verwendung von Modulen: Ich moechte diese nicht generell aus-
           schliessen, aber wenn quasi die komplette Aufgabe durch die Ver-
           wendung eines Moduls ersetzt werden kann, ist dies vielleicht nicht
           der Sinn der Aufgabe gewesen.



Aufgabe: Funktionen einstellig machen
~~~~~~~~

         (Dieser Vorschlag stammt von Kabel, Fragen bitte an ihn richten =)


         Es reicht aus, wenn man nur Funktionen erlaubt, die ein Argument be-
         kommen. D.h. man benoetigt keine mehrstelligen Funktionen.

         Beispiel 1: Die zweistellige Funktion add

             sub add { $_[0] + $_[1] }

         kann auch so geschrieben werden

             sub add {
                 my $arg1 = shift;
                 return sub {
                     my $arg2 = shift;
                     return $arg1 + $arg2
                 };
             }

         dadurch veraendert sich der Aufruf:

             vorher:     print add(1, 2);      # "3"
             nachher:    print add(1)->(2);    # "3"

         Der Vorgang des Verminderns der Stelligkeit einer Funktion heisst
         "currying".

         Aufgabe: Schreibe eine Funktion curry(), deren erster Parameter die
         zu "curriende" Funktion ist, deren zweiter Parameter die Stelligkeit
         dieser Funktion, und die die obige Transformation ausfuehrt.

         Beispiel 2: builtin print

             my $myprint = sub { print @_; };     # "referenz auf print"
             my $myprint_transformed = curry ($myprint, 3);
             $myprint_transformed->(1);        # nix passiert
             $myprint_transformed->(1)->(2);        # immer noch nix
             $myprint_transformed->(1)->(2)->(3);    # "123"

         Beispiel 3:

             my $myadd = sub { return $_[0] + $_[1]; };
             my $myadd_transformed = curry ($myadd, 2);
             my $add_three = $myadd_transformed->(3);
             print $add_three (100); # "103"

         Tipps:
         
             - Mache Dir klar, warum in Beispiel 2 die ersten beiden Aufrufe
               von $myprint_transformed nichts bewirken.
             - Von welcher Eigenschaft macht Beispiel 1 gebrauch?
             - Darfst Du davon auch Gebrauch machen? Vergiss nicht, dass
               curry() mit beliebigen Funktionen funktionieren soll!

         
         FRAGEN AUSDRUEKLICH ERWUENSCHT!


         Kabel hat schon eine (weniger relevante) Luecke in der Spezifikation
         gefunden. Er verraet aber nicht, wo (und befuerchtet, es sind noch
         mehr drin.)


         Kabel sagt: Die Loesung ist im Vergleich zur Aufgabenstellung fast
         schon banal einfach;) Trotzdem wuerde ich die Aufgabe eher Richtung
         schwer einschaetzen, denn hier wird heftigst von Closures Gebrauch
         gemacht, und des ist nicht jedermanns Sache.
\n\n

<!--EDIT|esskar|1094376037-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
esskar
 2004-09-04 15:51
#49882 #49882
User since
2003-08-04
7321 articles
ModeratorIn

user image
coole idee...
Crian
 2004-09-04 16:04
#49883 #49883
User since
2003-08-04
5826 articles
ModeratorIn
[Homepage]
user image
nicht meine, wie gesagt ;)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
murphy
 2004-09-04 18:32
#49884 #49884
User since
2004-07-19
1771 articles
HausmeisterIn
[Homepage]
user image
Sollen wir vielleicht auch gleich noch in CPS transformieren, damit das Resultat noch hässlicher wird? Falls nicht, schlage ich das als neues RDW vor ;-)
When C++ is your hammer, every problem looks like your thumb.
Crian
 2004-09-04 21:49
#49885 #49885
User since
2003-08-04
5826 articles
ModeratorIn
[Homepage]
user image
CPS?
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
murphy
 2004-09-05 01:03
#49886 #49886
User since
2004-07-19
1771 articles
HausmeisterIn
[Homepage]
user image
CPS == Continuation Passing Style.
Mehr dazu habe ich schon mal hier geschrieben: CPS auf wikipedia.org
Die Technik hat im Alltagsbetrieb wenig verloren, ist aber wertvoll zur Obfuscation und als Zwischenschritt bei der Kompilierung von Sprachen, die Continuations unterstützen. Perl 6 wird sie allerdings wohl nicht verwenden, da Parrot zwar Continuations hat, aber einen Stack besitzt (was in meinen Augen eine tödliche Kombination ist ;)
When C++ is your hammer, every problem looks like your thumb.
esskar
 2004-09-05 04:42
#49887 #49887
User since
2003-08-04
7321 articles
ModeratorIn

user image
wie soll sich folgendes beispiel verhalten?
Code: (dl )
1
2
3
my $myprint = sub { print @_; }
my $myprint_transformed = curry ($myprint, 3);
$myprint_transformed->(qw/1 2 3/);
Ishka
 2004-09-05 13:09
#49888 #49888
User since
2003-08-04
771 articles
HausmeisterIn
[Homepage] [default_avatar]
ich nehm mal an, genauso wie $myprint_transformed->(1), da bei diesen Funktionen es nicht vorgesehen ist mehrere Parameter zu übergeben.
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
DS
 2004-09-05 15:03
#49889 #49889
User since
2003-08-04
247 articles
BenutzerIn
[default_avatar]
Naja, ->(1,2) könnte auch eine "Abkürzung" für ->(1)->(2) sein...
Ishka
 2004-09-05 16:48
#49890 #49890
User since
2003-08-04
771 articles
HausmeisterIn
[Homepage] [default_avatar]
Es könnte aber auch sein, daß man jeden Parameter genau einmal darauf angewendet haben will und eine Liste von Referenzen haben will.

Wie dem auch sei: Ich fang jetzt mal mit meinem Bieten für Golf an (und nehmen an, daß wirklich immer nur genau ein Parameter kommt): 64
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
<< |< 1 2 >| >> 13 entries, 2 pages



View all threads created 2004-09-04 15:41.