Schrift
[thread]12389[/thread]

Variablen aus einem array erstellen (Seite 2)

Leser: 1


<< |< 1 2 3 >| >> 22 Einträge, 3 Seiten
Gast Gast
 2008-08-21 23:56
#113864 #113864
Erstmal danke für die Antworten, ich habe grad keinen Inetanschluss (bin im Cafe) und werde mir alles morgen zu Gemüte führen. Das Problem ist grundsätzlich folgendes. Eigentlich ganz einfach: Ein Sudokufeld. Ich habe ein Format gemacht, und das hat dann natürlich 81 Variablen. Ich bin auf das Problem gestoßen, 81 Variablen aus ner Externen Datei einzulesen, die ungefähr so aussieht:

1:2:4:5:5:9... usf.

Nachdem ich rausgefunden habe, dass folgendes funktioniert:

while(<FILEHANDLE>){
($a111,$a112,...) = split(/:/);
}

Um den Feldkoordinaten die Werte aus der Datei zuzuwweisen, war das Problem das Generieren der vielen Variablen. Ich habe ein bisschen Code geschrieben, der mir das Array @coord gibt, dass dann so aussieht:

@coord = (a111, a112, a113....)

Die Indizes bezeichnen Feld, Zeile und Spalte. Letzteres wäre zwar ausreichend, aber für mathematische Dinge brauche ich später drei Indizes.

Was ja aber kein Array aus Variablen ist, so, wie ich es gern hätte. Ich lerne die Sprache jetzt seit Montag, meine Lösung muss also nicht der Stein der Weisen sein. Anregungen werden freundlich aufgenommen :).

Eigentlich ließe sich das Problem lösen, indem ich die Variablen einfach AUSSCHREIBE. Is aber ein bisschen mühsam. Und ich denke, es sollte in PERL einen Weg geben, eine große Anzahl von Variablen automatisch zu generieren.

Wie gesagt, eure Einträge schaue ich mir später an, danke schon im Vorraus!

G, Limping_Twerp
pq
 2008-08-22 00:57
#113869 #113869
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Gast+2008-08-21 21:56:13--
while(<FILEHANDLE>){
($a111,$a112,...) = split(/:/);
}

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
use Data::Dumper;

my @fields = split /;/, $s;
my @array;
my $i = 0;
for my $x (0..2) {
    for my $y (0..2) {
        for my $z (0..2) {
            $array[$x]->[$y]->[$z] = $fields[$i];
            $i++;
        }
    }
}
print Dumper \@array;


Quote
Und ich denke, es sollte in PERL einen Weg geben, eine große Anzahl von Variablen automatisch zu generieren.

gibt es wie gesagt, aber wozu, wenn man sauber mit mehrdimensionalen arrays arbeiten kann?
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
LanX-
 2008-08-22 01:26
#113872 #113872
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
Gast+2008-08-21 21:56:13--

1:2:4:5:5:9... usf.

Nachdem ich rausgefunden habe, dass folgendes funktioniert:

Code (perl): (dl )
1
2
3
4
while(<FILEHANDLE>){
  ($a111,$a112,...) = split(/:/);
}
@coord = (a111, a112, a113....)



ja aber du kannst gleich schreiben:


Code (perl): (dl )
1
2
3
while(<FILEHANDLE>){
  @liste = split(/:/);
}


aber was soll die Schleife, wieviele Sodukostellungen liest du ein?


Was du aber eigentlich willst ist doch die Darstellung
Code (perl): (dl )
$coord[$feld][$zeile][$spalte]
Um die Gültigkeit der Stellungen als Summe bei einer fixen Koordinate zu bestimmen, oder?

Leider kennt Perl keine Mehrdimensionalen Arrayslices sonst könntest du schreiben:

Code (perl): (dl )
@coord[0..8][0..2][0..2]=split(/:/);



deswegen sollte ne normale Schleife reichen:

Code (perl): (dl )
1
2
3
4
5
6
7
8
my $idx=0;
for my $feld (0..8) {
  for my $spalte (0..2) {
     for my $zeile (0..2)  {
         $coord[$feld][$zeile][$spalte]=$liste[$idx++];
     }
  }
}


Alternativ könntest du auch so einmalig ein Array @idx basteln, dass es dir erlaubt so zuzugreifen:

Code (perl): (dl )
print $liste[  $idx[$feld][$zeile][$spalte]  ];


Kommt ganz drauf an was du brauchst.

Grüße
LanX

NACHTRAG: es gäbe noch ein paar andere Lösungsansätze, die für einen Anfänger aber definitiv too much wären!
murphy
 2008-08-22 19:03
#113910 #113910
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Gast+2008-08-21 21:56:13--
[...] Das Problem ist grundsätzlich folgendes. Eigentlich ganz einfach: Ein Sudokufeld. [...]


Anmerkung am Rande: Als Anregung zur Arbeit mit Sudokupuzzeln lohnt sich vielleicht auch ein Blick ins Wiki auf Rätsel der Woche – Sudokulösungsprogramm
When C++ is your hammer, every problem looks like your thumb.
L_Twerp
 2008-08-23 18:46
#113928 #113928
User since
2008-08-23
1 Artikel
BenutzerIn
[default_avatar]
LanX-+2008-08-21 23:26:23--

ja aber du kannst gleich schreiben:


Jo, is klar, ich wollte es nur möglichst deutlich darstellen.

LanX-+2008-08-21 23:26:23--
aber was soll die Schleife, wieviele Sodukostellungen liest du ein?


Die Schleife ist sinnlos, richtig. Man liest bis jetzt nur eine Zeile ein.

LanX-+2008-08-21 23:26:23--
Was du aber eigentlich willst ist doch die Darstellung
Code (perl): (dl )
$coord[$feld][$zeile][$spalte]
Um die Gültigkeit der Stellungen als Summe bei einer fixen Koordinate zu bestimmen, oder?


Genau. So wie du das begeschrieben hast, wäre das natürlich himmlisch. Ich habe mir überlegt, dass ich, wenn ich rausfinde, unter welchen Vertauschungen von Kästchenwerten die Summen invariant bleiben, die Menge aller Möglichen Sudokus rausfinde (oder zumindest eine große Teilmenge dieser Menge). Da wären Mehrdimensionale Arrayslices natürlich genial, da man die Permutationen damit denkbar einfach umsetzen könnte.

Code (perl): (dl )
$array[$x]->[$y]->[$z] = $fields[$i];


Und was genau machen die kleinen Pfeile?

Limping_Twerp

PS: Gibt es WIRKLICH keine Möglichkeit, die mehrdimensionalen Arrayslices wie Vorgeschlagen umzusetzen?
LanX-
 2008-08-23 19:33
#113929 #113929
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
L_Twerp+2008-08-23 16:46:52--
Genau. So wie du das begeschrieben hast, wäre das natürlich himmlisch. Ich habe mir überlegt, dass ich, wenn ich rausfinde, unter welchen Vertauschungen von Kästchenwerten die Summen invariant bleiben, die Menge aller Möglichen Sudokus rausfinde (oder zumindest eine große Teilmenge dieser Menge). Da wären Mehrdimensionale Arrayslices natürlich genial, da man die Permutationen damit denkbar einfach umsetzen könnte.


OK, um das richtig zu verstehen, folgende Teil-Felder sind invariant?
Quote
1 2 <-> 2 1
4 3 <-> 3 4

EDIT: Fehler korrigiert!

Invariant weil: Zeilensummen und Feldsumme ändern sich nicht durch horizontale Vertauschung und Spaltensumme bei beiden Spalten gleich 5.

und jetzt möchtest du (Mathematisch ausgedrückt) den gesamten Lösungsraum mit einem Representanten und der Gruppe aller "invarianten" Permutationen beschreiben?



L_Twerp+2008-08-23 16:46:52--
Code (perl): (dl )
$array[$x]->[$y]->[$z] = $fields[$i];

Und was genau machen die kleinen Pfeile?

das ist die explizite Form der Kurzschreuibweise
Code (perl): (dl )
$array[$x][$y][$z] = $fields[$i];


Um mehrdimenionale Strukturen in Perl zu realisieren legst du Refrenzen auf Strukturen ab, mit Pfeil werden sie Derefrenziert.

Falls neu, solltest du das nachschlagen!!!


L_Twerp+2008-08-23 16:46:52--
PS: Gibt es WIRKLICH keine Möglichkeit, die mehrdimensionalen Arrayslices wie Vorgeschlagen umzusetzen?


IMHO bei Perl5 nichts Out-Of-The-Box, man kann nur tricksen ... aber ist der Aufwand berechtigt ...oder schießt du dir dann vor lauter Perlmagie selbst ins Bein? ... IMHO letzteres!

Schreib dir lieber Subroutinen, die dir deine Funktionalität liefert.

wenn du das hinkriegst können wir uns über sinnhaftigkeit von lvalue-subs oder Objekten unterhalten.
betterworld
 2008-08-23 20:23
#113930 #113930
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
murphy+2008-08-22 17:03:39--
Anmerkung am Rande: Als Anregung zur Arbeit mit Sudokupuzzeln lohnt sich vielleicht auch ein Blick ins Wiki auf Rätsel der Woche – Sudokulösungsprogramm

Es gibt zu dem Thema auch noch jüngere Forschungsergebnisse :)
Sudoku solver bei Perlmonks
LanX-
 2008-08-23 20:36
#113932 #113932
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
2 Fragen:
1. Sollten Sudokus nicht immer eindeutig lösbar sein?
2. Kann man noch in den Wettbewerb einsteigen? 8 )

Apopos: CPAN:Games-Sudoku
@L_Twerp perllol perlref
moritz
 2008-08-23 20:58
#113933 #113933
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
LanX-+2008-08-23 18:36:07--
2 Fragen:
1. Sollten Sudokos nicht immer eindeutig lösbar sein?


Ja bitte. Sonst machen sie keinen Spass.

Wer ein bisschen Spass beim Programmieren haben will, kann ja mal die Dancing Links von Knuth implementieren ;-)

Update: "Knoth" =~ s/o/u/
LanX-
 2008-08-23 21:24
#113934 #113934
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
moritz+2008-08-23 18:58:01--
Dancing Links von Knoth implementieren ;-)
Knuth! Du vermengelst da was mit dem ebenso genialen Erfinder Knox! ; )
<< |< 1 2 3 >| >> 22 Einträge, 3 Seiten



View all threads created 2008-08-21 16:22.