Fischer-Bayern.de
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Anfängerfrage: Script zum Lösen von Rätseln

 
Neues Thema eröffnen   Neue Antwort erstellen    Fischer-Bayern.de Foren-Übersicht -> AppleScript X
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
yuloc
•->
•->


Anmeldedatum: 10.03.2016
Beiträge: 2

BeitragVerfasst am: 10.03.2016 - 11:44    Titel: Anfängerfrage: Script zum Lösen von Rätseln Antworten mit Zitat

Hallo an alle Scripting-Profis!

Ich bin ein absoluter Neueinsteiger und habe mir das Buch "APPLESCRIPT FÜR ABSOLUTE STARTER" schon einmal zu Gemüte geführt.

Nun bin ich dort aber nicht unbedingt fündig geworden, sodass ich gerne hier nochmal nachfragen möchte...

Als Rätsel-Fan löse ich gerne Schüttelrätsel. Dabei geht es darum, aus durcheinandergewürfelten Buchstaben ein Wort zu bilden. Leider ist dies manchmal so schwer, das ich einfach nicht weiterkomme und Hilfe brauche... Nun dachte ich an ein Apple-Script, was mir bei der Lösung helfen könnte.

Es geht also darum die einzelnen Buchstaben (Variablen 1 = A, 2 = E, 3 = F, 4 = G, usw.) zu einer vorgegebenen Länge (z. B. 5 oder 8 Stellen) miteinander zu kombinieren. Dabei darf jeder Buchstabe aus den Variablen natürlich nur einmal verwendet werden.

Diese Wortliste, die dann ausgegeben wird, sollte alle möglichen Kombinationen der eingegebenen Buchstaben enthalten. Natürlich kommen dabei auch sinnlose Kombinationen heraus, aber das ist egal, ich gehe die Liste dann ja durch.

Superkomfortabel wäre es natürlich, wenn man von vorneherein Buchstabenkombinationen ausschließen könnte, die im Deutschen nicht vorkommen und daher nicht beachtet werden sollen, z. B. "Q"+"T", das würde die Ergebnisliste dann vielleicht etwas kürzen.

Was meint ihr? Ist sowas per AppleScript möglich oder eher nicht? Falls ja, wie gehe ich an die Sache heran?

Danke im Voraus für eure Hilfe!

Gruß an alle

Yuloc

(P. S.: Ich arbeite mit einem iMac unter OSX 10.11.3)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Lösung_Monitor_Auflös_App
•-->
•-->


Anmeldedatum: 25.01.2016
Beiträge: 53

BeitragVerfasst am: 15.03.2016 - 14:09    Titel: ALLES ist möglich mit AppleSript!=Antwort zur ersten Frage Antworten mit Zitat

Prinzipiell gilt für AppleScript: ALLES ist möglich, das weiss man erst wenn man dieses Forum ein paar Jahre gründlich verfolgt hat
Es geht also darum
a)
yuloc hat Folgendes geschrieben:
die einzelnen Buchstaben (Variablen 1 = A, 2 = E, 3 = F, 4 = G, usw.) zu einer vorgegebenen Länge (z. B. 5 oder 8 Stellen) miteinander zu kombinieren.

b) Dabei darf jeder Buchstabe aus der Buchstabenliste nur einmal verwendet werden.
c) sollte gefiltert werden ob die "random" generierten Worte in D vorkommen

Den wichtigsten Teil a) würde ich so lösen wie unten angegeben
Dazu solltest du 2 Listen herstellen womit die erste Liste zur 2.Liste beziehungsmässig koordiniert werden kann.
Viel Spass!
hier die Grundstruktur welche dir weiterhelfen sollte um in Eigenregie noch alle wenn und abers dazwischen zu setzen
hat Folgendes geschrieben:
property Ziffernlist : {1, 2, 3, 4, 5}
property Buchstabenliste : {"A", "E", "F", "G", "H", "etc..."}
property RepANZgemANZListenelemente : ""
property Random5BuchstabenWortResultat : {}
property AlleWorte : {}
set AlleWorte to {}
repeat 10 times --<Statt 10 setzt du ein die Anzahl Variationsmöglichkeiten, Mathematik Professor fragen!
   my WortAus5Buchstaben()
   set AppleScript's text item delimiters to return
   set Random5BuchstabenWortResultat to Random5BuchstabenWortResultat as text
   set AlleWorte to AlleWorte & Random5BuchstabenWortResultat
end repeat
on WortAus5Buchstaben()
   set Random5BuchstabenWortResultat to {}
   set ANZ to number of items of Ziffernlist
   repeat 5 times
      set ZUFNr to (random number from 1 to ANZ)
      # hier die ZUFNr dahin überprüfen, ob mit ihr schon ein res in der liste Random5BuchstabenWortResultat schon solcher Buchstabe existiert oder nicht, wenn existiert erneute random
      set res to item ZUFNr of Buchstabenliste
      set Random5BuchstabenWortResultat to Random5BuchstabenWortResultat & res as text
   end repeat
   Random5BuchstabenWortResultat
end WortAus5Buchstaben
set AlleWorte to AlleWorte as text
display dialog "AlleWorte kannst du im sog Eventprotokoll des ScriptEditors nachlesen" default answer AlleWorte
return my DelimiterUndResultatAuftischer()
on DelimiterUndResultatAuftischer()
   set AppleScript's text item delimiters to ""
   return AlleWorte
end DelimiterUndResultatAuftischer


Den Rest deiner zitierten Ansprüche die du an das Script stellst kannst du wohl selbst lösen - vorausgesetzt du hast meinen Vorschlag Zeile um Zeile verstanden - möglicherweise erübrigen sie sich teilweise.

1) willst du ja überprüfen, welche Wörter aufgenommen und welche verworfen werden sollen. Dazu verwendets du wohl eine Internet-Wörtersammlung und lässt jeweils abfragen ob das Wort in D vorkommt oder nicht
2) Willst du die Bedingung erfüllt, dass ein Buchstabe nur jeweils einmal vorkommt
Da musste einen Algorithmus einbauen bevor du die ZUFNr des random-Systems als gültig gelten lassen kannst:
So: Mit der zufällig gewählten ZUFNr den entsprechenden Buchstaben in der "Buchstabenliste" afusuchen und überprüfen lassen ob er schon vorkommt in "Random5BuchstabenWortResultat"
3) vielleicht genügen dir auch ca.20-50 Durchläufe um selbst zu lesen ob was brauchbares fürs Rätsel dabei vorkommt?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Wolle-77
•--->
•--->


Anmeldedatum: 25.02.2003
Beiträge: 447
Wohnort: Geldern

BeitragVerfasst am: 15.03.2016 - 17:29    Titel: Antworten mit Zitat

Hallo yuloc,

was Du möchtest, ist eine sogenannte Permutation. Das in AppleScript rein zu entwickeln wäre ein wenig aufwendig und sicherlich nicht besonders performant, zumindest jedoch sehr codelastig.

Bitte ignoriere den Wirrkopf über mir, er hilft Dir nicht nur nicht weiter, sondern hat sich wiedermal ein besonders unnützes Stück Verwirrung ausgedacht.

Diese Aufgabe der Permutation übergeben wir einer externen anderen Sprache namens Perl. Also keine Angst, Du kannst im Scripteditor bleiben und auch AppleScript weiter benutzen. Der folgende Kern des Handlers stammt von Skeeve, er war auch hier im Forum mal stark aktiv.

Code:
on perlpermutation(anzahl, pool, sortieren) # 0 = keine Sortierung, 1 = normales Sortieren, 2 = Sortieren nach Zahlen, 3 = rückwärtiges Sortieren, 4 = rückwärtiges Sortieren nach Zahlen
   if anzahl is missing value then set anzahl to count words of pool
   if sortieren is 0 then
      set sortieren to ""
   else if sortieren is 1 then
      set sortieren to " | sort"
   else if sortieren is 2 then
      set sortieren to " | sort -g"
   else if sortieren is 3 then
      set sortieren to " | sort -r"
   else if sortieren is 4 then
      set sortieren to " | sort -rg"
   end if
   return do shell script "perl -e 'sub p{if($l--){@p=(p(@_,pop@p),@p)for@p};$p{join\" \",@_}=$/if!$l++;pop}($l,@p)=@ARGV;++$l;p;print%p' " & anzahl & " " & pool & sortieren
end perlpermutation

my perlpermutation(missing value, "P I D A L E Y O M", 0)


In die Zeile my perlpermutation gibst Du einfach Deine Wunschparameter an: Bei missing value, dem ersten Parameter, kannst Du auch eine 4 oder 6 hinschreiben – dann werden aus dem Pool nur Wörter mit 4 oder 6 Buchstaben genommen. missing value, also fehlender Wert, ergibt das gleiche, als wenn Du die Anzahl aller Buchstaben im Pool angibst. Der Pool ist ein mit Wortzwischenräumen getrennter Vorrat an Buchstaben (oder sonstigem). Und die letzte 0 habe ich so mal als Händlererweiterung genommen; Du kannst auch sortieren (das ist im Kommentar erklärt).

Mehr nicht.

Wenn Du das oben ausfühlen läßt, dauert es auf einem 3,4 GHz iMac ca. 4 bis 5 Sekunden und Du bekommst alle 362880 Kombinationen (Fakultät von 9 – 9*8*7*6*5*4*3*2*1) angezeigt – in dem Fall steckt auch mein Rätselwort darin. Viel Spaß beim Experimentieren und Spielen.
_________________
Martin Wolter
--
Apple rocks the planet!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Wolle-77
•--->
•--->


Anmeldedatum: 25.02.2003
Beiträge: 447
Wohnort: Geldern

BeitragVerfasst am: 16.03.2016 - 14:11    Titel: Antworten mit Zitat

Hi yuloc,

als Ergänzung habe ich den Handler jetzt noch so erweitert, daß er auch in der Lage ist, Deine gewünschten Ausschlüsse von Buchstabenkombinationen vorzunehmen:

Code:
on perlpermutation(anzahl, pool, sortieren, ausschlusz) # 0 = keine Sortierung, 1 = normales Sortieren, 2 = Sortieren nach Zahlen, 3 = rückwärtiges Sortieren, 4 = rückwärtiges Sortieren nach Zahlen
   if anzahl is missing value then set anzahl to count words of pool
   if sortieren is 0 then
      set sortieren to ""
   else if sortieren is 1 then
      set sortieren to " | sort"
   else if sortieren is 2 then
      set sortieren to " | sort -g"
   else if sortieren is 3 then
      set sortieren to " | sort -r"
   else if sortieren is 4 then
      set sortieren to " | sort -rg"
   end if
   if ausschlusz is not "" then
      set my text item delimiters to "|"
      set ausschlusz to ausschlusz as string
      set my text item delimiters to ""
      set ausschlusz to " | grep -Ev " & quoted form of ("(" & ausschlusz & ")") as string
   end if
   return do shell script "perl -e 'sub p{if($l--){@p=(p(@_,pop@p),@p)for@p};$p{join\" \",@_}=$/if!$l++;pop}($l,@p)=@ARGV;++$l;p;print%p' " & anzahl & " " & pool & sortieren & ausschlusz
end perlpermutation

my perlpermutation(missing value, "P I D A L E Y O M", 0, {"Q T", "E Y", "P I D A L E Y O M", "L E"})


Bedeutet, Du übergibst einfach im letzten Parameter ausschlusz eine Liste mit Deinen – ebenfalls wortzwischenraumgetrennten – Kombinationen, die nicht zurückgegeben werden sollen, wie eben Q T oder sonstwas.

Also, mal ein Beispiel:

Du bekommst die 3 Buchstaben S, I, und E und willst alle Kombinationen ermittelt haben, dann ergibt

Code:
my perlpermutation(missing value, "S I E", 0, "")

das hier:

I E S
S E I
I S E
E S I
E I S
S I E


Wenn Dir jetzt die Suche nach dem Zielwort immer noch zu schwer ist und Du genauer suchen und die Kombinationen SI und SE ausschließen möchtest, rufst Du den Händler so auf:

Code:
my perlpermutation(missing value, "S I E", 0, {"S I", "S E"})


I E S
E I S


Und dann sollte die Lösung EIS zu finden nicht mehr so schwer sein Wink
_________________
Martin Wolter
--
Apple rocks the planet!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
yuloc
•->
•->


Anmeldedatum: 10.03.2016
Beiträge: 2

BeitragVerfasst am: 16.03.2016 - 20:58    Titel: Wow - Dankeschön Antworten mit Zitat

Hallo!

Das ist genau das, was ich gesucht habe, vielen Dank dafür.
Da wäre ich ohne Hilfe natürlich niemals drauf gekommen.

Nochmals vielen Dank an die Profis.

Gruß an alle
yuloc
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Fischer-Bayern.de Foren-Übersicht -> AppleScript X Alle Zeiten sind GMT + 2 Stunden
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2002 phpBB Group
Deutsche Übersetzung von phpBB.de


AppleScript für absolute Starter