Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Scrambler Gem
#1
Schon wieder zum 20. mal einen 3x3x3-Scrambler geschrieben für deine neue Webseite / dein neues Tool? Damit ist jetzt Schluss!
Tim bringt euch mit viel Liebe das Scrambler gem: https://rubygems.org/gems/scrambler
Einfach einbinden und Scrambles ausspucken lassen.
Wie? So!

Falls ihr ein bisschen Liebe zurück geben wollt: Einfach forken und irgendwann kann das Ding dann auch Random State Scrambles. :)
Zitieren
#2
Meh, Ruby. Für eine generische Lösung aber ziemlich hübsch! Ich bleibe bei meinen statischen Vierzeilern, dafür brauch' ich keine Lib.
[Bild: img.php?id=2009DUMO01&ranking=NR&event_1...vent_3=sq1]
Zitieren
#3
(27.09.2011, 15:20)deepSubDiver schrieb: Für eine generische Lösung aber ziemlich hübsch!

Ruby halt. :P
Zitieren
#4
Ich will mitspielen!

Code:
void Main() {
  // 3x3 example
  
  var sides = new[] {"U", "D", "F", "B", "L", "R"};
  var prefixes = new string[]{};
  var suffixes = new string[]{"", "2", "'"};
  Func<string, string, bool> dispensableMoveDelegate = (prev, curr) => {
    if (string.IsNullOrEmpty(prev) || string.IsNullOrEmpty(curr)) {
      return false;
    }
    char sidePrev = prev[0];
    char sideCurr = curr[0];
    int axisPrev = "UDFBLR".IndexOf(sidePrev);
    int axisCurr = "UDFBLR".IndexOf(sideCurr);
    return axisPrev / 3 == axisCurr / 3;
  };
  
  var scramble = GenerateScramble(sides, prefixes, suffixes, dispensableMoveDelegate, 25);
  
  scramble.Dump();
}

string GenerateScramble(IList<string> sides, IList<string> prefixes, IList<string> suffixes, Func<string, string, bool> dispensableMove, int moveAmount) {
  if (sides == null || sides.Count() == 0) {
    throw new ArgumentException("sides");
  }
  if (prefixes == null) {
    prefixes = new string[] {};
  }
  if (suffixes == null) {
    suffixes = new string[] {};
  }
  if (dispensableMove == null) {
    dispensableMove = (prev, curr) => false;
  }
  if (moveAmount < 1) {
    throw new ArgumentException("moveAmount");
  }
  
  var rng = new Random();
  var sb = new StringBuilder();
  
  string prevMove = string.Empty;
  while (moveAmount-- > 0) {
    var currMove = string.Empty;
    do {
      currMove = GenerateRandomMove(sides, prefixes, suffixes);
    } while (dispensableMove(prevMove, currMove));
    prevMove = currMove;
    sb.AppendFormat(" {0}", currMove);
  }
  
  return sb.ToString().Substring(1);
}

string GenerateRandomMove(IList<string> sides, IList<string> prefixes, IList<string> suffixes) {
  var rng = new Random();
  var sb = new StringBuilder();
  
  if (prefixes.Count() > 0) {
    sb.Append(prefixes[rng.Next(prefixes.Count())]);
  }
  sb.Append(sides[rng.Next(sides.Count())]);
  if (suffixes.Count() > 0) {
    sb.Append(suffixes[rng.Next(suffixes.Count())]);
  }
  
  return sb.ToString();
}

(C# natürlich)
[Bild: img.php?id=2009DUMO01&ranking=NR&event_1...vent_3=sq1]
Zitieren
#5
Ah, nette Lösung mit der anonymen Funktion. Ich hab' allerdings etwas gebraucht um es zu verstehen. ;)

Wäre trotzdem toll, wenn nicht jeder auf seiner Platte irgendeinen Scrambler hat, sondern wir einen "perfekten" haben. :)
Zitieren
#6
Gib's zu, das hast du nur gemacht, weil du ueber die sample-Funktion gestolpert bist :p

Hab's jetzt nicht ausprobiert, sondern nur den Code angesehen. Kann das Scrambles wie "L R ..." erzeugen?

Von einer "offiziellen Scramble-Suite" (oder einer pro Sprache und "die eine" als Pseudocode) traeum ich auch schon lange, ebenso von einem Testframework, wo verschiedene Scrambler durch verschiedene Qualitaetsmetriken statistisch beurteilt und verglichen werden koennen (um wirklich den "perfekten" zu finden... kann ja zB sein, dass ein Unterbinden von "L R" zu besseren oder schlechteren Scrambles fuehrt).
Zitieren
#7
(27.09.2011, 17:52)Stefan Pochmann schrieb: Gib's zu, das hast du nur gemacht, weil du ueber die sample-Funktion gestolpert bist :p

Ne, die kenn' ich schon lange (eben seit Ruby 1.9). ;)
Der Grund war eher, dass ich mal Erfahrung mit Gems sammeln wollte und da bot es sich an den Code von Cubemania zu extrahieren (und aufzuräumen) und in ein Gem zu verpacken.

(27.09.2011, 17:52)Stefan Pochmann schrieb: Hab's jetzt nicht ausprobiert, sondern nur den Code angesehen. Kann das Scrambles wie "L R ..." erzeugen?

Sowas kann er nicht erzeugen

(27.09.2011, 17:52)Stefan Pochmann schrieb: ebenso von einem Testframework, wo verschiedene Scrambler durch verschiedene Qualitaetsmetriken statistisch beurteilt und verglichen werden koennen (um wirklich den "perfekten" zu finden...

Oh ja, das Testframework wäre mal interessant. Ich hab zwar ein paar Tests für die Scrambler geschrieben, aber es ist schwierig das richtig zu testen ohne rand zu stubben oder ähnliche hässliche Dinge zu machen. Ich schau eigentlich nur, ob die Züge, die enthalten sind auch erlaubt sind und ob die Anzahl der Züge mit dem übergebenem Parameter übereinstimmt.

(27.09.2011, 17:52)Stefan Pochmann schrieb: kann ja zB sein, dass ein Unterbinden von "L R" zu besseren oder schlechteren Scrambles fuehrt).

Lucas meinte mal, dass die Verteilung besser sei, wenn man "L R" unterbindet. Er hat aber auch gesagt, ich solle ihn nicht darauf festnageln. :)
Zitieren
#8
(27.09.2011, 16:26)tim schrieb: Ah, nette Lösung mit der anonymen Funktion. Ich hab' allerdings etwas gebraucht um es zu verstehen. Wink
Willst du Kommentare? Ich mach' sowas nicht für so kurze Schnipsel...

(27.09.2011, 16:26)tim schrieb: Wäre trotzdem toll, wenn nicht jeder auf seiner Platte irgendeinen Scrambler hat, sondern wir einen "perfekten" haben. Smile
Jap, wäre definitiv toll - Irgendjemand von ss.com hatte mal einen SOAP Web Service aufgesetzt (Conrad?). Die Idee find ich als zentrale Lösung wundervoll, aber man hat halt nicht immer Internetzugang.

(27.09.2011, 18:47)tim schrieb: [...]
Lucas meinte mal, dass die Verteilung besser sei, wenn man "L R" unterbindet. Er hat aber auch gesagt, ich solle ihn nicht darauf festnageln. Smile
Nähere Informationen würden mich interessieren. Ich schick ihm mal eine PN zu diesem Thread.
[Bild: img.php?id=2009DUMO01&ranking=NR&event_1...vent_3=sq1]
Zitieren
#9
(29.09.2011, 05:56)deepSubDiver schrieb: Willst du Kommentare? Ich mach' sowas nicht für so kurze Schnipsel...

Ne, ging auch so, danke. Aber: "kurz"? Tongue

(27.09.2011, 18:47)tim schrieb: Irgendjemand von ss.com hatte mal einen SOAP Web Service aufgesetzt (Conrad?). Die Idee find ich als zentrale Lösung wundervoll, aber man hat halt nicht immer Internetzugang.

LOLSOAP. Das hab' ich mir auch schon überlegt (natürlich RESTful HTTP).

(29.09.2011, 05:56)deepSubDiver schrieb:
(27.09.2011, 18:47)tim schrieb: [...]
Lucas meinte mal, dass die Verteilung besser sei, wenn man "L R" unterbindet. Er hat aber auch gesagt, ich solle ihn nicht darauf festnageln. Smile
Nähere Informationen würden mich interessieren. Ich schick ihm mal eine PN zu diesem Thread.

Verdammt! Das war irgendwo in einem dieser zahlreichen "Mein Scrambler ist viel geiler/schöner/kürzer/schneller als deiner"-Threads im Speedsolving-Forum. Find ihn aber gerade nicht. -.-
GEFUNDEN: http://www.speedsolving.com/forum/showth...post483761
Zitieren
#10
(29.09.2011, 10:45)tim schrieb: Das hab' ich mir auch schon überlegt (natürlich RESTful* HTTP).

http://scrambler-api.herokuapp.com/clock/100 :)
Code
Ruby + Rack + Heroku = ♥

*nein, ist nicht RESTful, sorry. :)
Zitieren


Gehe zu: