Scripting Contest

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
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: 3289
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: 3289
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: 1686
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: 393
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: 354
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: 3289
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: 354
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.

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

Re: Scripting Contest

Beitrag von inne » 11.05.2018 12:09:11

Hallo,

ich hätte da eine Idee für einen neuen Contest. Und zwar basierend auf dem Wikiartikel https://wiki.debianforum.de/Lokales_Repository

Gegeben ist eine Verzeichnisstruktur wie folgt:

Code: Alles auswählen


$ tree
.
├── Contents-all
├── Contents-all.gz
├── Contents-amd64
├── Contents-amd64.gz
├── InRelease
├── Packages
├── Packages.gz
├── pool
│   ├── foo_1_amd64.buildinfo
│   ├── foo_1_amd64.changes
│   ├── foo_1.dsc
│   ├── foo_1.tar.xz
│   ├── foo_2_amd64.buildinfo
│   ├── foo_2_amd64.changes
│   ├── foo_2.dsc
│   ├── foo_2.tar.xz
├── Release
├── Release.gpg
├── Sources
└── Sources.gz
Also ein Repository mit beliebig vielen Paketen. Das Skript soll dann alle älteren Versionen eines Pakets löschen, so das nur die aktuelle im ./pool bleibt.

IMO ist es ausreichend, wenn die Lösung nur eine Architektur und all unterstützt.

PS: Ich habe schon so ein Lösung dafür (Shell/BASH). Diese ist aber ganz rudimentär und gefällt mir nicht wirklich.

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

Re: Scripting Contest

Beitrag von ThorstenS » 13.05.2018 10:08:46

Keine Scriptinglösung, aber ein Tipp, wie du deine repos besser pflegen kannst: nimm reprepro!
http://www.pro-linux.de/artikel/2/1726/ ... orgen.html

Das einfach aufgebaute Debianpkg-mozilla-archive-keyring eignet sich sehr gut als Vorlage, um seinen key selbst zu paketieren.

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

Re: Scripting Contest

Beitrag von inne » 13.05.2018 12:33:05

Hallo ThorstenS.

Mit reprepro habe ich mich noch nicht auseinander gesetzt, sollte es wohl aber mal tun...

Satt pkg-mozilla-archive-keyring orientiere ich mich an grml-debian-keyring.
Im Grunde:

Code: Alles auswählen

gpg --output "my-archive-keyring.gpg" --export "0x00000000"
# debian/rules: dh_install "my-archive-keyring.gpg" "/etc/apt/trusted.gpg.d/"
(Ich habe es noch ein klein wenige anders gelöst)

Ich zeig mal meine Lösung, und hoffe jemand greift diese auf und wir bekommen eine Lösung für den obigen Wiki-Artikel :-)

Code: Alles auswählen

#!/bin/bash

# Ins Repository wechseln, weil der Index relativ ist
cd "/var/local/debian/"

rm_obsolet_packages () {
	# TODO: Rewrite to something better
	# See also https://debianforum.de/forum/viewtopic.php?t=156724&p=1174005#p1174005
	find ./pool/ -iname "*.deb" -exec dpkg-name "{}" \;
	ls -1 ./pool/*.deb | sed 's/\.\/pool\///;s/_.*//g' | sort -u | while read; do
		p=$REPLY # package name
		ls -1 ./pool/${p}_*.deb | sort -V | head -n "-1" | sed "s/\.\/pool\///;s/[^_]*_//;s/_[^_]*//" | while read; do
			v=$REPLY # package version
			rm -- ./pool/${p}_${v}_*.deb ./pool/${p}_${v}_*.buildinfo ./pool/${p}_${v}_*.changes ./pool/${p}_${v}.tar.* ./pool/${p}_${v}.dsc
		done
	done
}

rm_obsolet_packages
rm -f -- Contents-* Packages* Sources* *Release* 

: # Index erzeugen
: # Release-Datei generieren und signieren
(Wie gesagt, gefällt mir selbst nicht so wirklich)
Zuletzt geändert von Anonymous am 14.05.2018 13:14:01, insgesamt 1-mal geändert.

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

Re: Scripting Contest

Beitrag von ThorstenS » 14.05.2018 09:16:37

Das Mozilla Paket macht im Grunde genommen nix anderes. Seit stretch darfst du aber auch direkt das asc Format nach trusted.d legen:

Code: Alles auswählen

gpg --armor --export 0123456789ABCDEF > mein-keyring.asc
Unter https://deb.domain.tld/repos habe ich dann den Hinweis stehen, falls es mal schnell gehen muß:

Code: Alles auswählen

wget -O /etc/apt/trusted.gpg.d/mein-keyring.asc https://deb.domain.tld/repos/mein-keyring.asc
Ansonsten platziert mir schon die FAI-Installation meinen key und das Repo unter sources.list/meinrepo.list an Ort und Stelle.

Deine Scriptinglösung macht ja anscheinend was sie soll - so häßlich ist sie jetzt nun auch ned. :THX:

Hier gibt es noch einige Hinweise, aber die kümmern sich nur um die debs, nicht um die sourcen:
https://askubuntu.com/questions/198474/ ... repository

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

Re: Scripting Contest

Beitrag von inne » 14.05.2018 12:59:49

ThorstenS hat geschrieben: ↑ zum Beitrag ↑
14.05.2018 09:16:37
Deine Scriptinglösung macht ja anscheinend was sie soll - so häßlich ist sie jetzt nun auch ned. :THX:
Es wäre halt besser die Version und Paketnamen nicht vom Dateinamen abhängig zumachen, sondern auszulesen und dann in einem Array o.ä. eine Zuordnung Paketname/Version zu Datei zu haben, und mit dieser Datenstruktur zu arbeiten. Die Tools dafür hat es ja alles: dpkg --field, dpkg --compare-versions.

Oder aber zuvor noch so etwas wie find -iname "*.deb" -exec dpkg-name "{}" \; laufen zu lassen.
ThorstenS hat geschrieben: ↑ zum Beitrag ↑
14.05.2018 09:16:37
Seit stretch darfst du aber auch direkt das asc Format nach trusted.d legen
Was ist die zu bevorzugende Variante? Dann würde ich das ins Wiki schreiben.

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

Re: Scripting Contest

Beitrag von ThorstenS » 16.05.2018 13:56:25

Die asc Variante kam wohl neu mit stretch, deswegen sehe ich sie persönlich als zukunftsträchtiger an und nutze sie. Was aber von offz. dazu besprochen oder bekannt gemacht wurde, entzieht sich meiner Kenntnis. Ich bin auch nur durch Zufall in der FAI-ML darüber stolpert.

laut https://manpages.debian.org/stretch/apt ... .8.de.html
SUPPORTED KEYRING FILES

Alternatively, if all systems which should be using the created keyring have at least apt version >= 1.4 installed, you can use the ASCII armored format with the "asc" extension instead which can be created with gpg --armor --export.

Benutzeravatar
TRex
Moderator
Beiträge: 8325
Registriert: 23.11.2006 12:23:54
Wohnort: KA

Re: Scripting Contest

Beitrag von TRex » 21.05.2018 16:56:24

Ich hab wieder was neues (nix neues im Kontext Internet, hab ne Menge Lösungen gefunden):

Produziere ein Histogramm für die Größe des Inhalts eines Verzeichnisses.

Einschränkungen sind glaub nicht notwendig. Von meinem eigenen Use-Case könnte man drei Schwierigkeitsgrade ableiten: 1. nur Text und Zahlen, 2. grafisches Histogramm, 3. dynamische Granularität.

Disclaimer: ich war mit Variante 1 schon glücklich ;)
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Scripting Contest

Beitrag von Meillo » 21.05.2018 19:09:07

@TRex: Interessante Aufgabe, kannst du die Ziele bitte etwas detaillierter formulieren. Was ist mir ``Text und Zahlen'' gemeint? ASCII-Grafik? Oder ist das schon ``grafisch''? Wie verhaelt sich deine Aufgabe zu du(1)? ncdu(1) wird wohl das was du dir wuenschst, fertig bieten. Sowas aehnliches also in selbstgemacht?
Use ed once in a while!

Benutzeravatar
TRex
Moderator
Beiträge: 8325
Registriert: 23.11.2006 12:23:54
Wohnort: KA

Re: Scripting Contest

Beitrag von TRex » 21.05.2018 19:29:13

Meillo hat geschrieben: ↑ zum Beitrag ↑
21.05.2018 19:09:07
kannst du die Ziele bitte etwas detaillierter formulieren
Du hast auf einer Achse die Größe einer Datei oder eines Verzeichnis, und auf der anderen, wie oft das vorkommt. Was du damit auf einen Blick erkennen kannst, ist die Verteilung verschiedener Dateigrößen. Mit ncdu geht das nicht besser als mit du und sort (aber damit kann man sich was scripten), außer die Menge an Dateien ist trivial überschaubar.

Erklärung: https://de.wikipedia.org/wiki/Histogramm
Beispiel: https://cloud.addictivetips.com/wp-cont ... togram.png

Mit Text und Zahlen war gemeint, die Balken (der Grafik oben) nicht grafisch darzustellen, sondern einfach eine nach den Bins sortierte Liste mit Zahlen auszugeben.

Edit: nachdem ich den Wiki-Artikel überflogen hab, fiel mir auf, dass 3. vermutlich nicht besonders sinnvoll ist. Aber das werden Bastler schon sehen :)
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Scripting Contest

Beitrag von Meillo » 21.05.2018 21:20:53

Jetzt verstehe ich, danke.
Use ed once in a while!

Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Re: Scripting Contest

Beitrag von heinz » 21.05.2018 21:31:19

Code: Alles auswählen

du -aSd1 --block-size=1M|sort -n|cut -f1 -d'.'|uniq -c
So was in der Art?

eggy
Beiträge: 3334
Registriert: 10.05.2008 11:23:50

Re: Scripting Contest

Beitrag von eggy » 21.05.2018 22:13:30

Wollen wir uns nochmal über die "Lösungen erst posten wenn Zeitpunkt x erreicht ist"-Regel verständigen? Ich geh grade von Sonntagabend (18:00?) aus, aber wie wärs wenn der Aufgabensteller das jeweils mit in die Aufgabe schreibt?

Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Re: Scripting Contest

Beitrag von heinz » 22.05.2018 01:10:23

Oh, Tschuldigung... :oops:

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Scripting Contest

Beitrag von Meillo » 24.05.2018 10:47:00

Ich habe eine Loesung der Kategorie 2 in awk fertig. Diese werde ich ab Sonntag Abend posten.
Use ed once in a while!

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Scripting Contest

Beitrag von Meillo » 27.05.2018 19:54:28

Hier nun meine Loesung:

Code: Alles auswählen

#!/bin/sh
# Histogram of file sizes
# https://debianforum.de/forum/viewtopic.php?f=34&t=156724


du -s "$@" | awk '

function getpow(n) {
	i = 0
	while (2^i < n) {
		i++
	}
	return i
}

function stars(n) {
	s = ""
	while (n--) {
		s = s "*"
	}
	return s;
}

{
	e = getpow($1)
	if (e > maxe) {
		maxe = e
	}
	hist[e]++
}

END {
	for (i=0; i<=maxe; i++) {
		printf("< %10d KB: %s\n", (2^i), stars(hist[i]))
	}
}
'
Ich habe mich entschieden, beliebige Datei-/Verzeichnisargument zu erlauben. Der uebliche Aufruf wird wohl als `size-hist *' erfolgen, um die Dateien (und Unterverzeichnisse) des aktuellen Verzeichnisses analysieren zu lassen.

Mein Programm gibt Balken als ASCII-Grafik aus -- ein Stern entspricht einer Datei.

Ich die einzig sinnvolle generelle Klassenbildung fuer Datenmengen verwendet, naemlich Zweierpotenzen. Alle anderen haetten Know-How ueber die Dateien benoetigt, was vielleicht ja Sinn der Sache gewesen waere, aber die Sache natuerlich komplexer gemacht haette. Da habe ich mich drumrum gedrueckt. Optimal ist mein Ansatz nicht, aber er funktioniert wenigstens immer.


... und nun, da ich meine ``Pflicht'' erfuellt habe, bin ich auf eure viel kuerzeren und besseren Loesungen gespannt. ;-)
Use ed once in a while!

Antworten