Scripting Contest

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
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.02.2021 09:41:40

inne hat geschrieben: ↑ zum Beitrag ↑
27.02.2021 18:00:40
smutbert hat geschrieben: ↑ zum Beitrag ↑
27.02.2021 12:43:34
Müssen wir mit der Abgabe wirklich noch bis Ende März warten – bis dahin habe ich ja vergessen, dass es einen Scripting Contest gibt? :mrgreen:
Nein! Ich wäre auch fertig!
Wollen wird dann bis nächsten So. (7. März) noch warten (Damit die anderen es auch mitbekommen) und dann unsere Lösungen zeigen?
Auf die Zusatzaufgaben bin ich sehr gespannt, was andere wohl so gezählt haben. Und ob es eine favorisierte Programmiersprache für Mathematik gibt.

Anders könnten wir auch bis zum 31. März nur die Zusatz aufgaben zeigen :mrgreen:

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

Re: Scripting Contest

Beitrag von eggy » 28.02.2021 09:57:04

@inne: ja gibt es, die ist aber alles andere als mein Favorit, sogar ziemlich genau das Gegenteil davon :mrgreen:
schade, dass es keinen spoilertag gibt, ich schick Dir den Link mal per pm

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.02.2021 10:52:24

Danke für die PN, man beachte auch den Beiträge von heisenberg zur Aufgabe "rtgen" damals.

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

Re: Scripting Contest

Beitrag von heinz » 11.03.2021 15:05:02

Hallo Zusammen,

jetzt da der "Abgabetermin" naeherrueckt, fallt mir noch eine Frage zur Aufgabenstellung ein.
inne hat geschrieben: ↑ zum Beitrag ↑
15.02.2021 08:22:43
Aufgabe: Berechnen der Fibonacci-Folge bis zu einem vom User gegebenen Wert.
Was genau ist dieser Wert?
Ist es die Soundsovielte Fibunacci-Zahl?
z.B.
WERT=7
Fibunacci-Zahl=13

Oder die naechst kleinere Fibunacci-Zahl in der naehe von WERT?
z.B.
WERT=1000
Fibunacci-Zahl=987

Gruss,
heinz

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.03.2021 15:23:23

Ich ermittel die Fibonacci-Folge bis Fibonacci-Zahl >= Zahl und geben dann Ja Zahl ist ein Fibonacci-Zahl oder Nein Zahl ist keine Fibonacci-Zahl aus. Wobei ich es erlaube, beliebig viele Zahlen an das Skript zu übergeben. Optimal ist meine Lösung nicht unbedingt, weil ich die komplette Fibonacci-Folge im Speicher behalte.
heinz hat geschrieben: ↑ zum Beitrag ↑
11.03.2021 15:05:02
jetzt da der "Abgabetermin" naeherrueckt,
Der 31. war wohl doch etwas zu weit hin von mir.
Zuletzt geändert von inne am 12.03.2021 10:42:53, insgesamt 3-mal geändert.

Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Scripting Contest

Beitrag von smutbert » 11.03.2021 16:10:35

An der Stelle kann ich mir nicht verkneifen darauf hinzuweisen, dass der Name des Herrn Fibunacci soweit ich weiß Leonardo Fibonacci war ☺

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

Re: Scripting Contest

Beitrag von heinz » 12.03.2021 09:16:51

inne hat geschrieben: ↑ zum Beitrag ↑
11.03.2021 15:23:23
Ich ermittel die Fibonacci-Folge bis Fibonacci-Zahl >= Zahl und geben dann Ja Zahl ist ein Fibonacci-Zahl oder Nein Zahl ist keine Fibonacci-Zahl aus.
Alles klar...
smutbert hat geschrieben: ↑ zum Beitrag ↑
11.03.2021 16:10:35
dass der Name des Herrn Fibunacci soweit ich weiß Leonardo Fibonacci war ☺
Ups... sorry... Hast natürlich recht... :oops:
Zu meiner Verteidigung:
Im Script hab ich es zu 99% richtig... :mrgreen:

Gruss,
heinz

Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Scripting Contest

Beitrag von smutbert » 23.03.2021 18:01:49

So, jetzt ist der Abgabetermin verstrichen, oder?
(Es hat aber auch niemand etwas gesagt ☺)

Naja, es nie zu früh und selten zu spät - oder so ähnlich. Bei mir ist diese mir offensichtlich scheinende Lösung herausgekommen:

Code: Alles auswählen

                                           
#!/bin/sh

previous=0
current=1

if ! test "${1}" -gt 0; then
        echo "Ganze Zahl größer 0 erwartet."
        exit 1
fi

while test ${current} -le ${1}; do
        echo ""
        echo -n "${current}"
        new_current=$(echo "${current} + ${previous}" | bc)
        previous=${current}
        current=${new_current}
done

if test ${previous} -eq ${1}; then
        echo " ist eine Fibonacchi-Zahl."
        exit 0
else
        echo "Die angebene Zahl ${1} ist keine Fibonacchi-Zahl."
        exit 2
fi

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 » 23.03.2021 18:10:46

Ok, ich suche meins dann auch mal raus.

Zu deinem (ich habe es als /tmp/foo.sh abgespeichert):

Code: Alles auswählen

$ bash /tmp/foo.sh 9999999999999999999
/tmp/foo.sh: Zeile 6: test: 9999999999999999999: Ganzzahliger Ausdruck erwartet.
Ganze Zahl größer 0 erwartet.
Meins kann schon mal viel viel größere Zahlen prüfen :idea:

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

Re: Scripting Contest

Beitrag von heinz » 23.03.2021 18:13:40

Aehnlich sah meine Loesung zuerst auch aus aber die Geschwindigkeit und die Probleme bei Zahlen > 64bit int brachten mich dann zu dieser Loesung:

Code: Alles auswählen

#!/bin/bash
#
# Aufgabe: von inne >> 15.02.2021 08:22:43
# Berechnen der Fibonacci-Folge bis zu einem vom User gegebenen Wert.
# Schreibe ein Skript das die Fibonacci-Folge bis zu einem vom Benutzer
# angebenden Wert berechnet und pr.fe ob der Wert eine Fibonacci-Zahl ist.
# R.ckgabewert soll 0 bei ja und nicht 0 bei nein sein.
#
# Loesung von heinz
#
# bc rechnet so lange Fibonacci-Zahlen aus, bis eine Zahl groesser als der
# eingegebene Wert ist.
# Danach wird die Zahl ausgegeben und getestet, ob sie eine Fibonacci-Zahl ist.
#



# Wurde ein Wert uebergeben?
if test -z "$1"
then
    echo -e "\a\n${0##*/} MAX-WERT\n"
    exit 1
else
# Ist uebergebener Wert eine Zahl?
    if test -n "$(tr -d [:digit:] <<<"$1")"
    then
        echo -e "\a\nEs duerfen nur ganze Zahlen angegeben werden!\n"
        exit 1
    fi
fi



# Fibonacci-Zahl berechnen
ergebnis=$(echo "
    wert=$1

    a=1
    b=0
    c=0
    stelle=1

    while (wert > c)
    {
    c=a+b
    a=b
    b=c
    stelle=stelle+1
    print c,\"\n\"
    }

    quit
"|bc|tr -d ' \\')

# Ergebnis ausgeben
echo "$ergebnis"



# Ergebnis testen
rueckgabe=$(echo "
    wert=$1

    a=1
    b=1
    c=0
    stelle=2

    while (c < wert)
    {
    c=a+b
    a=b
    b=c
    stelle=stelle+1
    }
    
    if (b == wert) print 0
    
    quit
"|bc)
    
# Rueckgabe 0=Ergebnis ist eine Fibonacci-Zahl, 1=Ergebnis ist keine Fibonacci-Zahl
exit ${rueckgabe:-1}

Musste meines nochmal anpassen, um den gleichen Output wie bei Euch zu erhalten.
Zuletzt geändert von heinz am 23.03.2021 18:41:19, insgesamt 3-mal geändert.

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 » 23.03.2021 18:15:09

Meine Lösung:

Code: Alles auswählen

#!/usr/bin/env perl
# Fibonacci-Folge

use bignum;
use diagnostics;
use locale;
use strict;
use utf8;
use warnings;

binmode( STDIN,  ":encoding(UTF-8)" );
binmode( STDOUT, ":encoding(UTF-8)" );
binmode( STDERR, ":encoding(UTF-8)" );

# Zahlen aufsteigend sortieren, damit die letzte in der Liste die größte
# ist: $numbers[-1] # largest number

my @numbers = sort { $a <=> $b } ( (@ARGV) ? @ARGV : <STDIN> );

# Anfang der Fibonacci-Folge
my @fibonaccis = ( 0, 1 );

print "Fibonacci-Folge:\n";
print "@fibonaccis\n";

# Fibonacci-Folge bis zur größten Zahl s.o. weiterführen

while ( $fibonaccis[-1] < $numbers[-1] ) {
    push @fibonaccis, $fibonaccis[-2] + $fibonaccis[-1];
    print $fibonaccis[-1], "\n";
}

print "…\n";

# Zahl darauf hin prüfen, ob diese in der Fibonacci-Folge vorkommt und
# es sich somit um eine Fibonacci-Zahl handelt.

my $founds;
for my $number (@numbers) {
    chomp $number;
    if ( grep { $_ eq $number } @fibonaccis ) {
        print "Ja; $number ist eine Fibonacci-Zahl 😇\n";
        $founds++;
    }
    else {
        print "Nein; $number ist keine Fibonacci-Zahl 😈\n";
    }
}

exit !$founds;
Anwenundgen damit (Zusatzaufgabe):

Code: Alles auswählen

perl fibonacci.pl $(dpkg -l | grep ^ii | wc -l) | tail -1

Code: Alles auswählen

dpkg-query -W -f='${Package}\n' | while read; do echo $REPLY; perl fibonacci.pl $(dpkg -L $REPLY | wc -l) | tail -1; done | \grep -B 1 "ist eine"

Code: Alles auswählen

dpkg-query -W -f='${Package}\n' | while read; do echo $REPLY; perl fibonacci.pl $(dpkg -L $REPLY | wc -l) | tail -1; done | \grep "ist eine" | wc -l

Code: Alles auswählen

perl fibonacci.pl $(find / | wc -l) | tail -1

Code: Alles auswählen


$ cat ~/Dokumente/Computa/perl/bin/fibonacci-filecounts.bash 
#!/bin/bash
# With help from AWK people :-)

find "$1" 2>/dev/null | while read; do
	file -b --mime-type "$REPLY";
done | sort | uniq -c | awk '
{
	printf("%s: ", $0);

	# We must use a seperate file-descriptor for every call of the function /system/ (pipe)
	cmd=sprintf ("/usr/bin/env perl ./fibonacci.pl %d | tail -1", $1);
	cmd | getline l;
	close(cmd);

	# Instead of simply run this; that does not work at this point ;-)
	#sprintf ("/usr/bin/env perl ./fibonacci.pl %d | tail -1", $1) | getline l;

	print l;
}'


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

Re: Scripting Contest

Beitrag von thoerb » 23.03.2021 18:53:52

Mein Lösung ist ähnlich der von @smutbert.

Code: Alles auswählen

#!/usr/bin/python3
import sys

z = int(sys.argv[1])
a = 0
b = 1
fz = 0

while fz <= z:
	print(fz)
	fz = a + b
	a = b
	b = fz

if (a == z):
	print (z, "ist eine Fibonacci-Zahl")
else:
	print (z, "ist keine Fibonacci-Zahl")

Huo
Beiträge: 778
Registriert: 26.11.2017 14:03:31
Wohnort: Freiburg

Re: Scripting Contest

Beitrag von Huo » 24.03.2021 20:07:31

@thoerb: Schöne Lösung! Auf die Hilfsvariable fz kannst Du allerdings verzichten, was dem Code einen noch eleganteren Anstrich verleiht. :wink:

Code: Alles auswählen

#!/usr/bin/python3
import sys

z = int(sys.argv[1])
a = 0
b = 1

while b <= z:
    print(b)
    a, b = b, a + b

if (a == z):
    print (z, "ist eine Fibonacci-Zahl")
else:
    print (z, "ist keine Fibonacci-Zahl")

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

Re: Scripting Contest

Beitrag von thoerb » 24.03.2021 20:14:58

Huo hat geschrieben: ↑ zum Beitrag ↑
24.03.2021 20:07:31
Auf die Hilfsvariable fz kannst Du allerdings verzichten, was dem Code einen noch eleganteren Anstrich verleiht. :wink:
Stimmt! :wink:

tobo
Beiträge: 2336
Registriert: 10.12.2008 10:51:41

Re: Scripting Contest

Beitrag von tobo » 24.03.2021 22:04:48

Huo hat geschrieben: ↑ zum Beitrag ↑
24.03.2021 20:07:31
[...]einen noch eleganteren Anstrich verleiht. :wink:
Da wäre (neben der Initialisierung) weiter unten auch noch Potenzial:

Code: Alles auswählen

print("{} ist {} Fibonacci-Zahl".format(z, "eine" if a==z else "keine"))

Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Scripting Contest

Beitrag von smutbert » 24.03.2021 22:12:19

python ist ja so cool

Code: Alles auswählen

print("{} ist {}eine Fibonacci-Zahl".format(z, "" if a==z else "k"))
8)

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

Re: Scripting Contest

Beitrag von Phineas » 17.04.2021 12:04:18

Wie wäre es denn mit einer Fleißarbeit? Ich stelle mir einen Rentenrechner vor: Rentendatum und Bundesland eingeben und das Skript berechnet, wieviele Arbeitstage es noch bis zur Rente sind.

(Ja: Ich war mal Wehrpflichtiger.)

reox
Beiträge: 2515
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: Scripting Contest

Beitrag von reox » 20.04.2021 15:31:21

smutbert hat geschrieben: ↑ zum Beitrag ↑
24.03.2021 22:12:19
python ist ja so cool
python wird immer cooler ;)

Code: Alles auswählen

print(f"{z} ist {'' if a == z else 'k'}eine Fibonacci-Zahl")

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 » 29.06.2022 13:49:09

Hallo,

ich hätte eine Idee für eine neue Aufgabe, aber ich weiss nicht so recht, ob es so viel Sinn macht diese als Skript zu Lösen oder doch besser als Programm in C.

Die Aufgabe wäre: Wandle ein Zeichenkette, die eine gültige Zahl in Dezimalschreibweise enthält (also z.B. "123.056"), in einen double Wert um. Nun haben Skriptsprachen i.d.R. keine Typenunterscheidung in dem Sinn. Deswegen die Frage nach dem Sinn.
Was denkt ihr? Natürlichen wären Funktionen wie int oder atoi usw. tabu, wo bei ich diese auch einmal nutze im Grunde, weil es damit weniger Code ist. Es ginge auch ohne.

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

Re: Scripting Contest

Beitrag von Meillo » 29.06.2022 14:48:12

Eine Umsetzung mit scanf(3) ist simpel.

Wenn man es von Hand machen soll (d.h. z.B. Einlesen nur mit getchar(3)), dann stellt sich (fuer den professionellen Programmierer) hoffentlich gleich Frage, wie es sich mit der Problematik von Rundungsfehlern bei Fliesskommazahlen verhaelt. :roll: Aber vielleicht vernachlaessigen wir dieses Thema zunaechst einmal. ;-) Dann finde ich das eine gute Aufgabe ... weniger eine Scriptingaufgabe als eine Rechnenaufgabe aber dennoch eine gute Fingeruebung. :THX:
Use ed once in a while!

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 » 29.06.2022 14:54:57

Meillo hat geschrieben: ↑ zum Beitrag ↑
29.06.2022 14:48:12
Eine Umsetzung mit scanf(3) ist simpel.
Auch tabu :-)

Du hast ganz recht, es geht wenn um die Mathematik dahinter!

Also bist Du dabei, dann gilt es die Aufgabe bis zum Sonntag den 9. Juli zu Lösen, oder später? Das wäre dann eine Woche und Sonntag als Stichtag. Und ich sage mal der Einfachheit halber sind auch Skripte erlaubt solange man erkennt, dass nicht "geschummelt" wurde.

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

Re: Scripting Contest

Beitrag von Meillo » 29.06.2022 15:04:56

Ich habe eine Loesung in C fertig. Die poste ich dann ab dem Abgabedatum.

Kannst du bitte noch Beispielinput und -output bereitstellen, damit man sein Programm testen kann und unserer Programme einigermassen einheitlich und vergleichbar werden.
Use ed once in a while!

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 » 29.06.2022 15:10:00

Code: Alles auswählen

sol 123.056
123.056 ist 123.056
Das sol steht für Solution und ist der Kommandoaufruf, mit Eingabewert als Zeichenkette.

Hast Du aus der Standardbibliothek kopiert, ich bin gespannt ob meine Lösung dann im Vergleich doch nichts taugt :mrgreen:

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

Re: Scripting Contest

Beitrag von TRex » 29.06.2022 15:19:04

Und dann geb ich das als String aus. :twisted:
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

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

Re: Scripting Contest

Beitrag von Meillo » 02.07.2022 09:08:57


Die weitere Diskussion zur Umsetzung in C und Fragen dazu welche Zahlen wie erkannt werden sollen ist nach viewtopic.php?t=184511 abgespalten worden.
Use ed once in a while!

Antworten