Scripting Contest

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
smutbert
Moderator
Beiträge: 8316
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: 348
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: 2459
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: 3273
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: 8782
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: 3273
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: 8782
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: 3273
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: 8038
Registriert: 23.11.2006 12:23:54
Lizenz eigener Beiträge: MIT Lizenz
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: 8782
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!

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 » 10.07.2022 13:32:06

Hier nun meine Lösung, wie gesagt ohne Fehlerbehandlung.
Es müssen also immer auch die Nachkommastellen mit angegeben werden.

Bin gespannt, wie andere das rechnen!

Code: Alles auswählen

// Die Character beginnen bei 48 + abgebildeter Zahlwert 0 bis 9
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
	double dbl, multipli;
        char *str = argv[1], *c = index(str, '.');
	size_t end;

	multipli = 1;
	end = str - 1;
	for (char *i = c - 1; i > end; i-- ) {
	        dbl      += (str[i-str] - '0') * multipli;
		multipli *= 10;
	}

	multipli = .1;
	end = str + strlen(str);
	for (char *i = c + 1; i < end; i++ ) {
		dbl      += (str[i-str] - '0') * multipli;
		multipli /= 10;
	}

	printf("number is: %.3lf\n", dbl);
}
PS: Nachdem Meillo mir nochmal die Syntax zum Rechnen mit Zeigern in C gezeigt hat, lasse ich meine Lösung mit strtok weg. Welche auch langsamer war.

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

Re: Scripting Contest

Beitrag von Meillo » 10.07.2022 14:03:37

Ach ja, da war ja noch so eine Programmieraufgabe. :-)


Hier meine Umsetzung:

Code: Alles auswählen

#include <stdio.h>
#include <ctype.h>

int
main(int argc, char *argv[])
{
        double num=0.0, dec=0.0;
        int n, decimal=0, found=0;
        char *c;

        if (argc != 2) {
                fprintf(stderr, "Usage: %s NUMBER\n", argv[0]);
                return 1;
        }

        for (c=argv[1]; *c; c++) {
                if (*c == '.' && !decimal) {
                        decimal = 1;
                        continue;
                } else if (!isdigit(*c)) {
                        break;
                }
                found = 1;
                n = *c - '0';
                if (decimal) {
                        dec *= 10;
                        dec += n;
                        decimal++;
                } else {
                        num *= 10;
                        num += n;
                }
        }
        if (!found || *c || *(c-1) == '.') {
                puts("no number");
                return 1;
        }
        while (decimal-- > 1) {
                dec /= 10;
        }
        printf("number is: %.3lf\n", num + dec);
        return 0;
}
Die while-Schleife wollte ich mir eigentlich noch sparen, indem ich das Dezimalverschieben gleich oben mache, allerdings hatte ich dann keine Lust mehr darauf, weiter rumzuprobieren ...

Wenn ich jetzt innes Ansatz aufgreifen wuerde, waere das wohl kein Problem mehr. Ich war damals bloss zu doof dazu, zu sehen wie einfach es geht. :-D

... und inne hat nicht gesehen, dass es auch ganz einfach ist, den Ganzzahlteil von vorne nach hinten zu verarbeiten. Da ergaenzen sich unsere Programme sehr gut. ;-)
Use ed once in a while!

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 » 10.07.2022 14:17:36

Das schöne an deiner Lösung ist, dass Du nicht wissen musst, wann der String endet. Es wird am Dezimaltrenner erkannt. Ersteres dachte ich mir schon und meinte ich mit Stream vs. Matrix. Das finde ich gelungen!

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 » 02.11.2022 07:28:08

Hallo,

auf Intagram habe ich von der Kaprekar-Konstante gehört, und fand es eine schöne Aufgabe ein Skript zu schreiben, das die Behauptung, es gäbe die Kaprekar-Konstante für alle vierstelligen Zahlen prüft. Darum wollte ich diese Aufgabe hier vorstellen. Interessant ist das vor allem, wenn man vorher die Kaprekar-Konstanten noch nicht kannte.

Behauptung ist also, dass die Kaprekar-Konstante für alle vierstelligen Zahlen 6174 ist.
Um die Kaprekar-Konstante zu berechnen nimmt man eine vierstellige Zahl z.B. 2134 und sortiert die einzelnen Ziffern einmal absteigend, so dass daraus die größt mögliche Zahl entsteht und einmal aufsteigend so dass daraus die kleinstmögliche Zahl entsteht.
Also hier 4321 und 1234.
Aus diesen Zahlen errechnet man die Differenz, in dem man die keinere Zahl von der größeren Zahl subtrahiert.
4321-1234=3087
Ist das Ergebnis wie hier nicht 6174, nimmt man die Differenz/Das Erbeniss, füllt ggf. führenen Nullen an, damit wieder vier Stellen vorhanden sind und berechnet mit dieser Zahl nochmal neu.
Das macht man solange, bis das Ergebnis 6174 ist.
PS: Es gibt Ausnahmen, wo diese Behauptung nicht zutrifft.

Für dreistellige Zahlen ist die Kaprekar-Konstante übrigens 495 und für zweistellige Zahlen gibt es eine Kaprekar-Konstanten-Folge die immer 81, 63, 27, 45, 9, 81, ... ist. Einstellige Zahlen zeigen nochmal warum es Ausnahmen gibt, wo diese Behauptung nicht zutrifft.

Hier ist der Wikipedia Auszug dazu:
https://de.wikipedia.org/wiki/Kaprekar-Konstante

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

Re: Scripting Contest

Beitrag von Phineas » 02.11.2022 21:50:12

Ist das hier denn immer noch ein Scripting Contest oder macht ihr mit C weiter?

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

Re: Scripting Contest

Beitrag von Meillo » 03.11.2022 07:44:27

Phineas hat geschrieben: ↑ zum Beitrag ↑
02.11.2022 21:50:12
Ist das hier denn immer noch ein Scripting Contest oder macht ihr mit C weiter?
Wir haben das nie so eng gesehen. Es ist freie Programmiersprachenwahl.

Btw: Den TCC kann man auch in die Shebangzeile schreiben und damit C-Code wie ein Script on the fly compilieren und ausfuehren lassen. Das ist dann auch nicht anders als es beispielsweise Python macht. ;-)
https://en.wikipedia.org/wiki/Tiny_C_Compiler
Use ed once in a while!

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 » 03.11.2022 12:17:05

Phineas hat geschrieben: ↑ zum Beitrag ↑
02.11.2022 21:50:12
Ist das hier denn immer noch ein Scripting Contest oder macht ihr mit C weiter?
Ist das so zu verstehen, dass Du Phineas dann zum Sonntag auch ein Lösung bereit hältst?

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

Re: Scripting Contest

Beitrag von Meillo » 03.11.2022 16:13:14

inne hat geschrieben: ↑ zum Beitrag ↑
03.11.2022 12:17:05
Phineas hat geschrieben: ↑ zum Beitrag ↑
02.11.2022 21:50:12
Ist das hier denn immer noch ein Scripting Contest oder macht ihr mit C weiter?
Ist das so zu verstehen, dass Du Phineas dann zum Sonntag auch ein Lösung bereit hältst?
:THX:
Use ed once in a while!

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

Re: Scripting Contest

Beitrag von Phineas » 03.11.2022 21:54:24

Möglich, dass ich eine Lösung finde und poste.

Mit Skript gegen C anzutreten wirkt auf mich, wie Kettcar gegen M8.

Benutzeravatar
GregorS
Beiträge: 2518
Registriert: 05.06.2008 09:36:37
Wohnort: Freiburg
Kontaktdaten:

Re: Scripting Contest

Beitrag von GregorS » 03.11.2022 21:56:52

Phineas hat geschrieben: ↑ zum Beitrag ↑
03.11.2022 21:54:24
... Kettcar gegen M8.
Wie kann ein Kettcar gegen ein metrisches Gewinde antreten?
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])

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

Re: Scripting Contest

Beitrag von Phineas » 03.11.2022 22:13:03

:D

Ich meine eher dieses Kerlchen:
https://de.wikipedia.org/wiki/BMW_G15

Benutzeravatar
GregorS
Beiträge: 2518
Registriert: 05.06.2008 09:36:37
Wohnort: Freiburg
Kontaktdaten:

Re: Scripting Contest

Beitrag von GregorS » 03.11.2022 22:45:25

Phineas hat geschrieben: ↑ zum Beitrag ↑
03.11.2022 22:13:03
Ich meine eher dieses Kerlchen:
https://de.wikipedia.org/wiki/BMW_G15
Ach so.

Ja, das ist ein hübsches Auto.
Wenn man keine Probleme hat, kann man sich welche machen. ("Großes Lötauge", Medizinmann der M3-Hopi [und sog. Maker])

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

Re: Scripting Contest

Beitrag von Meillo » 03.11.2022 23:04:59

Phineas hat geschrieben: ↑ zum Beitrag ↑
03.11.2022 21:54:24
Mit Skript gegen C anzutreten wirkt auf mich, wie Kettcar gegen M8.
Sicher! Ein kleines, elegantes Script gegen ein fettes, schweres C-Programm. -- Es kommt immer auf die Betrachtungsweise an!

Diesbezueglich soll hier aber nicht gewertet werden. Es geht um den Spass an der Umsetzung, voellig egal in welcher Programmiersprache. Wenn du Lust hast, etwas zu programmieren, dann waere es toll, wenn du das tust.
Use ed once in a while!

Benutzeravatar
MSfree
Beiträge: 10686
Registriert: 25.09.2007 19:59:30

Re: Scripting Contest

Beitrag von MSfree » 04.11.2022 08:23:43

Meillo hat geschrieben: ↑ zum Beitrag ↑
03.11.2022 23:04:59
Ein kleines, elegantes Script gegen ein fettes, schweres C-Programm.
Das "kleine, elegantes Script" wird aber von einem fetten, schweren Interpreter ausgeführt, der für sich betrachtet die Schwere eines eigenständigen C-Programmes deutlich übertrifft.

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

Re: Scripting Contest

Beitrag von Meillo » 04.11.2022 08:50:54

MSfree hat geschrieben: ↑ zum Beitrag ↑
04.11.2022 08:23:43
Meillo hat geschrieben: ↑ zum Beitrag ↑
03.11.2022 23:04:59
Ein kleines, elegantes Script gegen ein fettes, schweres C-Programm.
Das "kleine, elegantes Script" wird aber von einem fetten, schweren Interpreter ausgeführt, der für sich betrachtet die Schwere eines eigenständigen C-Programmes deutlich übertrifft.
Und nichts davon uebertrifft die Schwere von Visual Studio Code, in dem man das Script oder Programm programmiert ... so dass es am Ende unerheblich ist, ob es nun ein Interpreter oder Compiler war. :-P

... es waere schon mal eine interessante Frage, wie fett die ganzen verwendeten Programme jeweils sind, im Verhaeltnis zum Script/Programm, das man eigentlich schreibt. Also einfach mal, um ein Gefuehl dafuer zu bekommen. Wenn man keine IDE einsetzt, dann wir der Compiler/Interpreter sicherlich immer die groesste Komponente sein. IDEs werden diese aber vermutlich uebertreffen. Wobei insgesamt die fetteste Komponente wohl der Browser ist, inklusive der Massen an JS-Code auf Stackoverflow, wenn man sich Codeschnipsel zusammensucht. :mrgreen:
Use ed once in a while!

Antworten