Scripting Contest

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
inne
Beiträge: 3273
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Scripting Contest

Beitrag von inne » 18.05.2016 15:39:40

heisenberg hat geschrieben:
Pluspunkte bekommt wer eine Mindestlänge implementiert.
Damit meine ich das die Kombinationsmöglichkeiten nicht bei einer Länge von 1 anfangen sondern z.B. bei dem Wert der als Mindeslänge angeben wurde. Dieser muss kleiner als die Länge sein.
(Also gleich mit Zeichenmenge^Mindestlänge begonnen wird.)

Ob das nun eine extra Schwierigkeit ist weiss ich nicht. Ich habe das mit dabei.
heisenberg hat geschrieben:
Zusatzaufgabe, die aber jemand lösen müsste ist eine Kontrolle der Ausgabe. Stimmt die Zeilenanzahl/Anz. d. Kombinationen (Potenz) und sind keine doppelt usw.
D. h. das Ausgabeformat sollte fest definiert sein. Dann kann man das Testscript auch über die Lösungen drüberlaufen lassen:

Code: Alles auswählen

1. Zeile: Zeichenvorrat
2. Zeile: Länge
3. bis letzte Zeile: Alle gefundenen Kombinationen
Ja OK, das macht Sinn.
Ebenso wäre es gut, wenn das Programm die Parameter von der Kommandozeile akzeptiert, dann kann man das testen aller Skripte automatisieren. :)

Parameter 1: Zeichenvorrat
Parameter 2: Länge

Beispiel:

Code: Alles auswählen

./prog.hs "ab" 2
Auch hier OK, das macht Sinn

Syntax ist dann: Script <Zeichenvorrat> <Länge> [Min.Länge]
Bzw nur: Script <Zeichenvorrat> <Länge>

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Scripting Contest

Beitrag von heisenberg » 18.05.2016 16:17:48

...Mindestlänge...Ob das nun eine extra Schwierigkeit ist weiss ich nicht. Ich habe das mit dabei.
Der Hintergrund meiner Frage ist der Sinn des Skripting-Wettbewerbs. Es wurde in dem Thread wiederholt erwähnt, dass es um Algorithmen geht und dass man den Kleinkram da lieber draussen lässt. Deswegen meine Anmerkung, dass das evtl. unnötiger Kleinkram ist, der keine schwerwiegende Problemstellung beinhaltet und dessen Lösung keinen besonderen Erkenntnisgewinn für alle bringt. Nur eine Anmerkung - ist nicht so wichtig.
Zuletzt geändert von heisenberg am 18.05.2016 19:32:27, insgesamt 1-mal geändert.
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

inne
Beiträge: 3273
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Scripting Contest

Beitrag von inne » 18.05.2016 16:20:35

Dann lassen wir die Mindestlänge weg. Das läuft auch bei mir außerhalb des eigentlichen Algo.

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Scripting Contest

Beitrag von heisenberg » 21.05.2016 13:52:06

So. Ich habe mich mal auf einen Kurztrip in die funktionale Programmierung mit Haskell begeben. Da komm' ich mir mal wieder wie der totale Programmieranfänger vor. Aber es hat geklappt!
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Scripting Contest

Beitrag von heisenberg » 21.05.2016 18:26:41

So, hier ist mal das Prüfscript(Braucht die Pakete Debianlua5.1, Debianlua-filesystem und Debianlua-socket):

NoPaste-Eintrag39312

EDIT: Habe nochmal eine Zeitmessung eingebaut.
Zuletzt geändert von heisenberg am 22.05.2016 00:00:57, insgesamt 3-mal geändert.
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

inne
Beiträge: 3273
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Scripting Contest

Beitrag von inne » 21.05.2016 19:56:49

Super!
Wollte mein Skript gerade dagegen testen, aber es will nicht. Habe das LUA-Skript als rttest.lua gespeichert und bekomme dies (Syntaxfehler!):

$ ./rttest.lua "ab" "3"
./rttest.lua: Zeile 3: --: Kommando nicht gefunden.
./rttest.lua: Zeile 4: --: Kommando nicht gefunden.
./rttest.lua: Zeile 5: --: Kommando nicht gefunden.
./rttest.lua: Zeile 6: Syntaxfehler beim unerwarteten Wort `<'
./rttest.lua: Zeile 6: ` -- Usage: ./check.lua <zeichensatz> <laenge>'

Mein Skript muss als ./sol/inne-rtgen.pl gegeben sein – richtig?

//OK: Es lag an den Einrückungen vom Copy'n'Paste (Habs dann aus dem Textfeld kopiert)

$ ./rttest.lua "ab" "3"

Pruefe alle Loesungen in Unterverzeichnis sol ...

Test result for inne-rtgen.pl : Bestanden

// Die Fehlerfälle sollten auch alle korrekt erkannt werden.
Zuletzt geändert von Anonymous am 21.05.2016 20:21:23, insgesamt 1-mal geändert.

inne
Beiträge: 3273
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Scripting Contest

Beitrag von inne » 21.05.2016 20:14:18

heisenberg hat geschrieben: Haskell
Warum hast du Haskell gewählt, also eine funktionale Programmiersprache? Ist hier ein Geschwindigkeitsvorteil gegenüber Perl zu erwarten, oder programmiert es sich einfach besser/eleganter?
PS: Ich kenne nur imperative Programmierung(?) und kann etwas Perl...

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Scripting Contest

Beitrag von heisenberg » 21.05.2016 21:02:39

Ich möchte etwas funktionale Programmierung lernen und so meinen Programmierhorizont erweitern. Permutationen - wie hier - sind da auch eine geeignete Anwendung. Geschwindigkeitsvorteile sehe ich da jetzt keine. Im übrigen ist funktionale Programmierung sehr gewöhnungsbedürftig (Kannst Du ja dann morgen selbst sehen).

Gelesene Vorteile sind da u. a. höhere Robustheit wegen der statischen Datentypen und dem weitgehenden fehlen von Variablen zum Zwischenspeichern von temporären Daten, sowie höhere Produktivität, wenn man den Kram erst einmal verstanden hat.

Wenn ich da allerdings "Vorteil bei der Wartbarkeit" lese, dann muss ich im Hinblick auf eine (funktionale) Rekursion doch eher lachen - Die Wartung fand ich da eher schwierig.

Weiterer Grund ist: Erhöhte Sicherheit - Niemand versteht mehr Deinen Code. Im Ernst: Ich vermute, dass das ein erhebliches Problem ist, wenn keiner der Kollegen mehr auch nur ansatzweise Deinen Code versteht.
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

inne
Beiträge: 3273
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Scripting Contest

Beitrag von inne » 22.05.2016 06:18:25

Dann mal Butter bei die Fische ;-)

Code: Alles auswählen

#!/usr/bin/perl
# Perl: Write once -- never understand again
# RainbowTable-Generator (RTGen)
# Usage: ./rtgen.pl <chars to use> <length>

print "$ARGV[0]\n";
print "$ARGV[1]\n";

my @chars = split "", $ARGV[0];
my $len   = $ARGV[1];
my @word  = ();

sub show {
    for (@word) {
        print $chars[$_];
    }
    print "\n";
}

sub gen {
    my $first_char = 0;
    my $last_char  = scalar(@chars) - 1;
    my $word_len   = scalar(@word);
    my $n          = scalar(@chars)**scalar(@word);    # Potenz
    while ( $n-- > 0 ) {
        for ( my $i = 0 ; $i < $word_len ; $i++ ) {
            if ( $word[$i] < $last_char ) {
                $word[$i]++;
                last;
            }
            $word[$i] = $first_char;
        }

        show;
    }
}

while ( $len-- > 0 ) {
    push @word, -1;
    gen;
}

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Scripting Contest

Beitrag von heisenberg » 22.05.2016 13:20:50

Boah ey! Der Code ist echt hart. Ich habe mir den jetzt 1 Stunde angeschaut und immer noch nicht ganz verstanden wie er funktioniert.

Na dann hier nochmal 2 Lösungen von mir:
  • NoPaste-Eintrag39307 Eine rekursive Lösung in lua
  • NoPaste-Eintrag39316 Haskell - natürlich auch rekursiv - so wie man das nach ein paar Stunden Haskell-lernen gerade so hinbekommt.
Zuletzt geändert von heisenberg am 22.05.2016 18:08:56, insgesamt 1-mal geändert.
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

inne
Beiträge: 3273
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Scripting Contest

Beitrag von inne » 22.05.2016 14:00:19

Na wenn ich deine Lösungen sehen, muss ich zugeben wirklich keine guten Ansätze zu finden. Nicht das meins wesentlich langsamer ist auch verbraucht es imo ein mehr an Speicher.
Ich glaub das war mein letzter Beitrag hier im Contest...

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Scripting Contest

Beitrag von heisenberg » 22.05.2016 14:05:58

Die Idee mit Indizies zu arbeiten statt mit Zeichen oder Strings fand ich interessant.
...verbraucht es imo ein mehr an Speicher
Die Perl-Variante braucht 2 MB. Die Lua-Variante braucht 1 MB. Die Haskell-Variante verbraucht 56 MB. Ich würde mal sagen, das liegt an den verschieden grossen Laufzeitumgebungen. Die Aufgabe und die Lösungen sind ja jetzt nicht wirklich speicherintensiv.
Zuletzt geändert von heisenberg am 22.05.2016 14:14:03, insgesamt 1-mal geändert.
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

inne
Beiträge: 3273
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Scripting Contest

Beitrag von inne » 22.05.2016 14:08:58

OK, so ist das wohl...
Zuletzt geändert von Anonymous am 23.05.2016 08:17:16, insgesamt 1-mal geändert.

inne
Beiträge: 3273
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Scripting Contest

Beitrag von inne » 22.05.2016 14:29:15

heisenberg hat geschrieben:
...verbraucht es imo ein mehr an Speicher
Ich würde mal sagen, das liegt an den verschieden grossen Laufzeitumgebungen..
Die hatte ich gar nicht im Sinn.
Die Aufgabe und die Lösungen sind ja jetzt nicht wirklich speicherintensiv.
Das nicht. Aber wo du nur die Lauf/Zähl-Variablen und einen String im Speicher hast. Habe ich die Laufvaribablen und 2 Arrays bzw. Perl-Listen. Das hatte ich überschlagen. Aber ob man das so vergleichen kann?

PS: Lua kenne ich ja etwas von NMap und Haskell bis dato garnicht.
Wenn ich mir dann deinen Code ansehen, willst du mir sagen meine Lösung ist nicht verständlich ;-)
Ich mag mich nur nicht wirklich in die Sprachen einarbeiten... Wobei sich Lua wohl lohnen würde... da kann ich immerhin erahnen wie du vorgehst^^

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Scripting Contest

Beitrag von heisenberg » 22.05.2016 17:43:00

heisenberg hat geschrieben:Boah ey! Der Code ist echt hart. Ich habe mir den jetzt 1 Stunde angeschaut und immer noch nicht ganz verstanden wie er funktioniert.
inne hat geschrieben:Wenn ich mir dann deinen Code ansehe, willst du mir sagen, meine Lösung ist nicht verständlich? ;-)
Na dann liegt's wohl doch eher weniger an Deinem harten Code, sondern an meinen eigenen Fähikgkeiten ;-)
Speicher.... Das nicht. Aber wo du nur die Lauf/Zähl-Variablen und einen String im Speicher hast. Habe ich die Laufvaribablen und 2 Arrays bzw. Perl-Listen. Das hatte ich überschlagen. Aber ob man das so vergleichen kann?
Bei so etwas mach ich mir drüber Gedanken, wenn's wirklich um Mengen von Speicher geht, wo's drauf an kommt. Aber bei der Menge an Variablenspeicher deutlich unter 1 K hier? Aber grundsätzlich ist is es natürlich schon gut darauf zu achten.

---

Haskell nicht sofort zu verstehen, das ist glaube ich keine Schande. Es ist halt einfach ganz anders...

Wer in einem 5-Minuten-Browser-Tutorial mal reinschnuppern will:

https://tryhaskell.org/
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

OldGod78
Beiträge: 190
Registriert: 20.04.2016 20:59:51
Kontaktdaten:

Re: Scripting Contest

Beitrag von OldGod78 » 26.05.2016 14:42:31

nice

inne
Beiträge: 3273
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Scripting Contest

Beitrag von inne » 28.07.2016 04:25:22

Hi,

ich habe wieder eine Idee für ein kleines Script. Diesmal ein Spiel: Hoch/Tief.

Die Regeln sind denkbar einfach. Man bekommt immer zufällig fortlaufend eine Zahl aus dem Bereich 1-15 angezeigt und muss tippen, ob die nächste Zahl höher oder tiefer als die vorherige sein wird. Wobei keine Zahl zweimal aufeinander folgen darf. Hat man richtig getippt, gibt es einen Punkt, wenn nicht beginnt man wieder bei 0.

Eingabe ist von STDIN h=höher t=tiefer q|e=beenden

Ausgabe auf STDOUT ist Zahl (Punkte - Highscore)

Gewonnen hat diesmal die kürzeste Implementierung würde ich vorschlagen, wobei die Sprache nicht beachtet wird, nur die Ausgabe von wc(1) auf den Quellcode zählt.

Beispiel:

Code: Alles auswählen

$ ./ht
   3 (0 – 0)
h 10 (1 – 1)
t  1 (2 – 2)
h  3 (3 – 3)
h 14 (4 – 4)
t 12 (5 – 5)
t  8 (6 – 6)
h  6 (0 – 6)
h 14 (1 – 6)
t 12 (2 – 6)
t  3 (3 – 6)
h  2 (0 – 6)
h 11 (1 – 6)
t  1 (2 – 6)
h  2 (3 – 6)
h  7 (4 – 6)
h 14 (5 – 6)
t  3 (6 – 6)
h  2 (0 – 6)
h  6 (1 – 6)
h  9 (2 – 6)
h 12 (3 – 6)
t  9 (4 – 6)
h  3 (0 – 6)
q

inne
Beiträge: 3273
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Scripting Contest

Beitrag von inne » 28.07.2016 18:56:23

Keine Rückmeldung, Leute Spielspass für 5min garantiert :mrgreen: In 8-Ball Pool haben sie dieses Minispiel leider durch ein neues Drehrad mit Preisen als Gewinnenspiel ersetzt.
Oder beleidigt diese Aufgabe den Profi ;-)

PS: Meine Lösung (vorerst nur ein schnell dahingeschriebenes Bash Skript) werde ich aber auch nicht veröffentlichen. Da muss ich erst mal sehen, dass ich das auch wirklich kurz in Perl o.ä. hinbekomme...
Zuletzt geändert von Anonymous am 28.07.2016 20:23:37, insgesamt 1-mal geändert.

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: Scripting Contest

Beitrag von ThorstenS » 28.07.2016 20:10:57

Wann ist denn Abgabe? Ich hab vorhin auch nur ein kurzes Bashscript angefangen, aber erst am WE wieder Zeit es zu komplettieren…

thoerb
Beiträge: 1677
Registriert: 01.08.2012 15:34:53
Lizenz eigener Beiträge: MIT Lizenz

Re: Scripting Contest

Beitrag von thoerb » 28.07.2016 20:31:44

ThorstenS hat geschrieben:Wann ist denn Abgabe? Ich hab vorhin auch nur ein kurzes Bashscript angefangen, aber erst am WE wieder Zeit es zu komplettieren…
Soweit ich das in Erinnerung habe, wurde sich mal auf (frühestens) Sonntagnachmittag geeinigt.

Benutzeravatar
ohnex
Beiträge: 391
Registriert: 31.01.2010 22:35:36

Re: Scripting Contest

Beitrag von ohnex » 28.07.2016 21:32:56

Hi

Schön das es hier weiter geht. :D
ThorstenS hat geschrieben:Wann ist denn Abgabe? Ich hab vorhin auch nur ein kurzes Bashscript angefangen, aber erst am WE wieder Zeit es zu komplettieren…
Sonntags ab 18:00 darf jede/r sein können veröffentlichen.

Ciao

Benutzeravatar
Phineas
Beiträge: 348
Registriert: 20.06.2012 20:26:19

Re: Scripting Contest

Beitrag von Phineas » 31.07.2016 22:22:13

Ein Einzeiler für die Bash, 301 Zeichen:

Code: Alles auswählen

p=0;h=0;r=0;m=0;a=' ';while [[ $a = [\ ht] ]];do while r=$[RANDOM%15+1];((m==r));do :;done;[ "$a" != " " ]&&{ l=t;((m-r<=0))&&l=h;((p++));[ "$a" = "$l" ]||p=0;((p>h))&&h=$p; };m=$r;printf '\r\e[K%1s%3i %s\n' "$a" $r "($p - $h)";a=;while ! [[ $a = [htqe] ]];do printf \\r\\e[K;read -n1 a;done;done;echo

inne
Beiträge: 3273
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Scripting Contest

Beitrag von inne » 31.07.2016 22:31:08

Funktioniert.
Meine aktuelle Lösung auch in Bash ist genau 100 Zeichen länger – muss ich also (noch) nicht posten.

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: Scripting Contest

Beitrag von ThorstenS » 01.08.2016 08:36:02

fuck wie geil 8O , ich bin raus

Benutzeravatar
Phineas
Beiträge: 348
Registriert: 20.06.2012 20:26:19

Re: Scripting Contest

Beitrag von Phineas » 01.08.2016 10:31:59

Warum? Ich würde gerne andere Codes sehen, auch wenn sie länger sind. Mein Code hat den Nachteil, völlig unflexibel zu sein. Kleine Regeländerungen reichen und der Code ist komplett für die Tonne.

Antworten