Schrift
[thread]6559[/thread]

QOTW 23 'perl' quiz

Leser: 1


<< |< 1 2 >| >> 14 Einträge, 2 Seiten
Crian
 2004-09-02 11:38
#49823 #49823
User since
2003-08-04
5871 Artikel
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
Write a program, 'parens', which gets a command line argument, 'n',
which is an integer.  The program should print all the
properly-balanced strings of parentheses of length 2n.  For example,
given the argument '3', the program should print these five lines:

       ((()))
       (()())
       (())()
       ()(())
       ()()()

in some order.  (The order is not important.)  

For the argument '1'; the output should be:
       
       ()

and for argument '4', the output should be:

       (((())))
       ((()()))
       ((())())
       ((()))()
       (()(()))
       (()()())
       (()())()
       (())(())
       (())()()
       ()((()))
       ()(()())
       ()(())()
       ()()(())
       ()()()()

in some order.


Bitte auch hier vor Ablauf der 60 Stunden keine Hinweise oder Lösungen posten.

Datumstempel der Mail war: Wed, 01 Sep 2004 12:50:14 -0400
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
DS
 2004-09-02 16:25
#49824 #49824
User since
2003-08-04
247 Artikel
BenutzerIn
[default_avatar]
Schaut golfgeeignet aus... :D
Crian
 2004-09-02 16:56
#49825 #49825
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
Genau, deshalb postete ich es hier - ich kenn doch meine Pappenheimer ;)
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
Crian
 2004-09-02 17:29
#49826 #49826
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
So, ich hab gerade mal eine nicht-Golf-Lösung für QOTW geschrieben. Wann kann man die da einreichen *rechne*

Wed, 01 Sep 2004 12:50:14 -0400
+ 60 Stunden (= 2,5 Tage)
=> Sat, 04 Sep 2004 0:50:14 -0400

In unsere Zeitzone übersetzt: Sat, 04 Sep 2004 5:50:14 +0100 oder?

Also Samstag nach dem Aufstehen =)


Edit: Meine Golflösung hat 139 Zeichen. (Dabei übernehme ich den Parameter n aus @ARGV, nur bevor das da wieder jemand reinpipet und am Ende gebe ich es wie gewünscht zeilenweise mit Zeilenumbrüchen aus.) Erfahrungsgemäß wird DS dann eine Lösung um die 50 Zeichen finden :blush:

Die Ausgabenreihenfolge ist zufällig genau die gleiche wie die in der Aufgabenstellung.\n\n

<!--EDIT|Crian|1094133431-->
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
DS
 2004-09-02 19:24
#49827 #49827
User since
2003-08-04
247 Artikel
BenutzerIn
[default_avatar]
Hm, schön wär's... :)

Aber ich biete vorerst mal 80 Zeichen... :cool:
Crian
 2004-09-02 23:44
#49828 #49828
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
Ich wusste es doch ... warte mal ab, morgen sinds nur noch 50 ;)

Nimmst Du es denn auch aus @ARGV entgegen und gibst es mit print aus?
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-03 00:17
#49829 #49829
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
ich musste mal ein Assembler Programm schreiben, das sowas macht; mal sehen ob ich es noch irgendwo hab!
DS
 2004-09-03 06:03
#49830 #49830
User since
2003-08-04
247 Artikel
BenutzerIn
[default_avatar]
So, jetzt bin ich wieder daheim...

Ja, ich lese auch brav von ARGV und printe mit print... ;) zumindest hab' ich auch diese Variante...

Aktueller Stand:
ARGV: 61 Zeichen :laugh:
STDIN: 59 Zeichen :angry:

Ich wage die Prognose, dass die 50 nicht zu erreichen sind...
Crian
 2004-09-04 16:12
#49831 #49831
User since
2003-08-04
5871 Artikel
ModeratorIn
[Homepage]
user image
Hier ist meine Lösung:

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
#!/usr/bin/perl
use strict;
use warnings;

use File::Basename;

=head1 QUEST

Write a program, 'parens', which gets a command line argument, 'n',
which is an integer. The program should print all the
properly-balanced strings of parentheses of length 2n. For example,
given the argument '3', the program should print these five lines:

((()))
(()())
(())()
()(())
()()()

in some order. (The order is not important.)

For the argument '1'; the output should be:

()

and for argument '4', the output should be:

(((())))
((()()))
((())())
((()))()
(()(()))
(()()())
(()())()
(())(())
(())()()
()((()))
()(()())
()(())()
()()(())
()()()()

in some order.

=cut


main();
exit;


sub next_parenthesis ($$) {
my ($is, $n) = @_;
my @np;

my $open = () = $is =~ m/\(/g;
my $close = () = $is =~ m/\)/g;

push @np, '(' if $open < $n;
push @np, ')' if $close < $open;

return @np;
}


sub main {
my $n = $ARGV[0];

die "syntax: ", basename($0),
" N\n\twhere N is a natural number (number of pairs of parenthesis)\n"
unless defined $n and $n > 0;

my @output = ('');

for my $position (1 .. 2*$n) {
my @output2;

for my $is (@output) {
push @output2, "$is$_" for next_parenthesis($is, $n);
}
@output = @output2;
}

printf "%3d: %s\n", $_+1, $output[$_] for 0.. $#output;
}


und hier die Golf-Lösung:

Code: (dl )
1
2
#!/usr/bin/perl
$n=$ARGV[0];@o=('');for(1..2*$n){my@q;for(@o){$o=()=m/\(/g;$c=()=m/\)/g;push@q,"$_("if $o<$n;push@q,"$_)"if$c<$o;}@o=@q;}print"$_\n"for@o;


(umgebrochen fuer bessere Lesbarkeit, an der Stelle wird der Zeilenumbruch nicht benötigt...)\n\n

<!--EDIT|Crian|1094300060-->
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
DS
 2004-09-04 16:44
#49832 #49832
User since
2003-08-04
247 Artikel
BenutzerIn
[default_avatar]
Code (perl): (dl )
1
2
3
#!perl -l

map/.*(??{$t{"$`($&)$'"}=1})/,@p=@p?keys%t:'',%t=()for 0..shift;print for@p

(77 Zeichen)

- oder -

Code: (dl )
1
2
3
#!perl -l

map{/\d/||print while s/0(.*?)1/($1)/}glob'{0,1}'x(2*shift)

(61 Zeichen)

Die Lösungen mit Eingabe über STDIN hätten je 2 Zeichen weniger... ;)\n\n

<!--EDIT|DS|1094302072-->
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2004-09-02 11:38.