Schrift
[thread]1902[/thread]

Rätsel: mit Perl lösbar?

Leser: 2


<< |< 1 2 3 >| >> 23 Einträge, 3 Seiten
lichtkind
 2005-01-13 16:50
#19406 #19406
User since
2004-03-22
5681 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
schon zb keine zahl fängt mit 0 an , achte zuerst auf mathematisches verhalten das 0, 5 und 1 verraten
achte auf überträge, durch überträge kann man schon von anfang an abhängigkeiten von zahlengrössen koppeln\n\n

<!--EDIT|lichtkind|1105638298-->
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
esskar
 2005-01-14 20:16
#19407 #19407
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
ich hab auch gerade festgestellt, dass die abbruch bedingung falsch war
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
#!/usr/bin/perl

use strict;
use warnings;

my @Eq = (
" ABC + DDE = FCF",
" CB + BGE = BCA",
" AEE + CBG = DGAE",
" ABC + CB = AEE",
" DDE + BGE = CBG",
" FCF + BCA = DGAE",
);

my @res = &Sol(@Eq);

foreach my $r (@res)
{
print join("; ", map { "$_ = $r->{$_}" } keys %{$r}), "\n";
}

sub Sol
{
my (@e) = @_;

my %pairs = ();
my @sol = ();

for (@e)
{
s!=!==!;
$pairs{$_} = 0 foreach (m!(\w)!g);
}

my @vars = keys %pairs;
my $count = scalar @vars;

while(1)
{
my $true = 0;
foreach my $e (@e)
{
while(my($k, $v) = each %pairs)
{
$e =~ s!$k!$v!g;
}

$true = eval $e;
last unless $true;
}

push @sol, {%pairs} if $true;

my $i = 0;
while($i < $count)
{
last if ++$pairs{$vars[$i]} < 10;
$pairs{$vars[$i]} = 0;
$i++;
}
last if $i == $count;
}

return @sol;
}

und O(10^n): hattest du natürlich recht; war schon spät!
Vorkim
 2005-01-15 01:00
#19408 #19408
User since
2003-09-27
50 Artikel
BenutzerIn
[default_avatar]
[quote=esskar,14.01.2005, 22:34]nö...
kann nicht sein...
dann würden ja die möglichkeiten steigen, je weniger zeichen man hat...[/quote]
Kombinatorik: Ziehung ohne Zurücklegen mit Beachtung der Reihenfolge.

Einfach: 10*9*8*7*6*5*4 = 10!/3! = 10!/6

Allgemein für n Variablen: 10!/(10-n)!


Beitrag allerdings unter starkem Alkoholeinfluss und ohne Gewähr. Mache gerade den mp3-DJ von meinem Rechner auf einer kleinen Party ...
esskar
 2005-01-16 23:45
#19409 #19409
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
mein code hat hinten und vorne nicht gefunzt;
hier mal ne bessere version
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
#!/usr/bin/perl

use strict;
use warnings;

my @Eq = (
" ABC + DDE = FCF",
" CB + BGE = BCA",
" AEE + CBG = DGAE",
" ABC + CB = AEE",
" DDE + BGE = CBG",
" FCF + BCA = DGAE",
);

&Sol(@Eq);

sub Sol
{
my (@e) = @_;

my %pairs = ();

for (@e)
{
s!=!==!;
$pairs{$_} = 0 foreach (m!(\w)!g);
}

my @vars = keys %pairs;
my $count = scalar @vars;

while(1)
{
my $true = 0;
my @out = ();
foreach (@e)
{
my $e = $_;
while(my($k, $v) = each %pairs)
{

$e =~ s!$k!$v!g;
}

$true = eval $e;
last unless $true;

push @out, $e;
}

print join("\n", @out,"\n") if $true;

my $i = 0;
while($i < $count)
{
last if ++$pairs{$vars[$i]} < 10;
$pairs{$vars[$i]} = 0;
$i++;
}

last if $i == $count;
}
}
esskar
 2005-01-17 22:22
#19410 #19410
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=Ronnie,17.01.2005, 21:19]Außerdem lernt man einiges dabei (jedenfalls ich).[/quote]
jo... ich hab gelernt, dass ich in ein paar zeilen code doch in der lage bin, 1000 fehler einzubauen.... und das ich eine endlosschleife nicht erkenne auch wenn alles darauf hinweißt... :)
Ronnie
 2005-01-13 15:04
#19411 #19411
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Ich habe hier ein Rätsel rumliegen:
Code: (dl )
1
2
3
4
5
ABC  +  DDE  =  FCF
+ + +
CB + BGE = BCA
= = =
AEE + CBG = DGAE

Wie könnte man sowas (mit Perl) lösen?
Taulmarill
 2005-01-13 16:42
#19412 #19412
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
im der theorie ist jedes (einfache) mathematische problem mit Perl lösbar, was spätestens seit "Algorithmen mit Perl" bekannt sein sollte. auch wenn C sicher performanter ist.
allerdings habe ich zu wenig erfahrungen mit solchen oder ähnlichen rätseln, um dir da einen vorschlag zu machen, daher würde ich einfach eine zugegebenermassen sehr plumpe brute-force methode verwenden. teste die berechnungen einfach für jede mögliche zahlenzuprdnung. das problem ist klein genug um das auch mit perl in absehbarer zeit lösen zu können.
gibt es für solche rätsel eigendlich eine generelle herangehensweise?
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
esskar
 2005-01-14 06:05
#19413 #19413
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
klar geht das:
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
#!/usr/bin/perl

use strict;
use warnings;

my @Eq = (
" ABC + DDE =  FCF",
"  CB + BGE =  BCA",
" AEE + CBG = DGAE",
" ABC +  CB =  AEE",
   " DDE + BGE =  CBG",
   " FCF + BCA = DGAE",
);

my @res = &Sol(@Eq);

foreach my $r (@res)
{
print join("; ", map { "$_ = $r->{$_}" } keys %{$r}), "\n";
}

sub Sol
{
my (@e) = @_;

my %pairs = ();
my @sol = ();

for (@e)
{
s!=!==!;
$pairs{$_} = 0 foreach (m!(\w)!g);
}

my @vars = keys %pairs;
my $count = scalar @vars;

while($pairs{$vars[$count-1]} < 10)
{
my $true = 0;
foreach my $e (@e)
{
while(my($k, $v) = each %pairs)
{
$e =~ s!$k!$v!g;
}

$true = eval $e;
last unless $true;
}

push @sol, {%pairs} if $true;

my $i = 0;
while($i < $count)
{
last if ++$pairs{$vars[$i]} < 10;
$pairs{$vars[$i]} = 0;
$i++;
}
}

return @sol;
}


wohl diese brute-force methode ziemlich ungeignet ist.
Komplexität O(n^10) mit n = Anzahl der Variablen
Ronnie
 2005-01-14 15:53
#19414 #19414
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
@esskar: Puh, Respekt. Verstehen tue ich es noch nicht, aber interessant sieht es aus. Ein Ergebniss hat es mir leider noch nicht geliefert, aber den Arbeitsspeicher gefüllt und die CPU ordentlich belastet. Ich dachte es könnt nicht so wild sein. Der Symbolvorrat beläuft sich auf 7 Zeichen, also sollte die Lösung innerhalb von 10^7 Möglichkeiten liegen, oder?

Ich werde es auch mal mit vorkims Methode probieren. Das ist klassiche lineare Algebra, das sollte noch klappen. ;)
Vorkim
 2005-01-14 23:23
#19415 #19415
User since
2003-09-27
50 Artikel
BenutzerIn
[default_avatar]
[quote=Ronnie,14.01.2005, 14:53]Der Symbolvorrat beläuft sich auf 7 Zeichen, also sollte die Lösung innerhalb von 10^7 Möglichkeiten liegen, oder?[/quote]
Wenn jeder Ziffer genau ein Buchstabe zugeordnet wird, bin ich eher für 10!/6 = 604800 Möglichkeiten.
<< |< 1 2 3 >| >> 23 Einträge, 3 Seiten



View all threads created 2005-01-13 16:50.