Übungen / Aufgaben zu Ruby

1 Lösung Lösung noch nicht öffentlich
Symmetrische Primzahlen
Anfänger - Ruby von hollst - 03.04.2017 um 13:55 Uhr
Wieviele Primzahlen P < 1.000.000 sind rückwärts gelesen auch eine Primzahl, jedoch ungleich sich selbst?

Anmerkung: Die (Prim)zahlen 2, 3, 5, 7, 11 erfüllen nicht die Bedingungen (sind rückwärts gelesen sich selbst gleich),
als erste erfüllt die 13 die Bedingungen.
0 Lösungen
Endliche Kettenbrüche rationaler Zahlen
Anfänger - Ruby von hollst - 30.03.2017 um 11:10 Uhr
Mit einem Kettenbruch K = a0 + 1/(a1 + 1/(a2 + 1 /(....))) - mit a0 als ganze Zahl und a1, a2 ... als
positve natürliche Zahlen ungleich Null - lässt sich bekanntlch jede reelle Zahl darstellen.
In der Praxis sind Kettenbrüche etwas unhandlich und man bevorzugt die Schreibweise
K = [a0; a1, a2, a3 ...]. Ist der Kettenbruch endlich, können damit alle rationale Zahlen beschrieben werden.

Die meisten Anwendungen finden Kettenbrüche in der Zahlentheorie, aber auch für Informatiker können sie
nutzbringend sein, insbesondere wenn man Rundungsprobleme umgehen muss. Z. B.

Quellcode ausblenden C#-Code
Double x = 1.0E+15 + 1.0 / 3;
WriteLine(x.ToString());
WriteLine((x / 1.0E+15).ToString());


gibt als Ergebnisse 1E+15 und 1 hervor. Der Term (1.0 / 3) wird ohne jegliche Vorwarnung einfach verschluckt
und man bekommt gegebenenfalls am Ende einer Rechnung völligen Unfug heraus, ohne es zu merken
(einer der schlimmsten Fallstricke für den Programmierer).

Würde man x als Kettenbruch darstellen

x = 3.000.000.000.000.001 / 3 = [1.000.000.000.000.000; 3]

blieben alle Informationen erhalten und die Welt wäre wieder in Ordnung.

Nun, wir wollen keine komplette Algebra mit Kettenbruchobjekten entwickeln,
sonder lediglich folgende Aufgabenstellungen lösen:

Schreibe ein Programm, das

1.) zwei Zahlen (ZAEHLER und NENNER mit NENNER != 0) entgegennimmt
und eine entsprechende Kettenbruchdarstellung zurückgibt und

2.) diese Kettenbruchdarstellung wieder rücktransformiert.

Das Interessante an Teilaufgabe 2.) ist, dass sich der Bruch ZAEHLER/NENNER
automatisch selbst kürzt, also z. B. ZAEHLER = 50 und NENNER = 100 -> [0; 2],
rücktransformiet führt dies richtig zu ZAEHLER = 1 und NENNER = 2. Bei negativen
Zahlen ist allerdings nicht entscheidbar, ob der ZAEHLER oder der NENNER negativ ist
(möglicherweise ein neuer Fallstrick, das Programmiererleben ist manchmal sehr schwer).
0 Lösungen
Gewinn durch multiblen Devisenhandel
Fortgeschrittener - Ruby von hollst - 26.03.2017 um 14:02 Uhr
Derzeit gibt es weltweit über 160 offizielle Währungen, wobei ein gutes Dutzend voll konvertierbar ist.
In der Tabelle sind die Kaufopsionen für acht von ihnen aufgelistet (leider bessere Formatierung in dieser Ansicht wohl nicht möglich,
hier sollte Gustl dankenswerter Weise noch etwas tun):

EUR USD JPY GBP CHF CAD AUD NZD
EUR 1,0000 1,0795 120,184 0,8658 1,0701 1,4423 1,4141 1,5323
USD 0,9264 1,0000 111,329 0,8021 0,9909 1,3377 1,3120 1,4234
JPY 0,0083 0,0090 1,00000 0,0072 0,0089 0,0120 0,0118 0,0127
GBP 1,1545 1,2467 138,860 1,0000 1,2361 1,6687 1,6354 1,7718
CHF 0,9335 1,0083 112,310 0,8081 1,0000 1,3486 1,3216 1,4357
CAD 0,6933 0,7478 83,2120 0,5993 0,7402 1,0000 0,9816 1,0647
AUD 0,7061 0,7622 84,7950 0,6110 0,7545 1,0188 1,0000 1,0803
NZD 0,6503 0,7025 78,2000 0,5629 0,6965 0,9392 0,9208 1,0000

http://www.onvista.de/devisen/cross-rates/

Durch geschickte Ausnutzung von Kursschwankungen ist es denkbar, dass man durch einen gestaffelten
Kauf und Weiterverkauf von Währungen einen Gewinn erzielen kann. In der Praxis wird dieser Gewinn
im Falle kurzfristiger Aktionen allerdings sofort durch Transaktionsgebühren wieder aufgefressen. Für die
folgende Aufgabe seien Transaktionsgebühren unberücksichtigt.

Wir steigen mit einer beliebigen Einheit einer Währung ein und suchen einen Handelsweg, der uns am Ende
mehr abwirft, als wir am Anfang eingesetzt haben. Grundlage sei die momentane Währungstabelle,
auch cross-rates-table genannt.

Folgende Einschränkungen: Es müssen nicht alle möglichen Währungspaare in der Kette auftauchen, jedoch
jedes Paar höchstens einmal. Die letzte Transaktion muss wieder zu unsere Ausgangswährung zurückführen.

Aufgabe: Schreibe ein Programm, dass dir alle Transaktionswege mit positivem Ergebnis ausgibt bzw.,
wenn es keinen einzigen Weg gibt, dies entsprechend mitteilt.
0 Lösungen
Biorhytmus - zuerst Top oder Down?
Anfänger - Ruby von hollst - 13.03.2017 um 12:44 Uhr
Die Biorhytmen sind eine "Entdeckung" des Wiener Psychologen Swoboda und des Berliner Arzt Fließ zu Beginn des 20. Jahrhunderts.
Es soll beim Menschen drei Arten davon geben, den körperlichen Biorhythmus mit einer Periodendauer von 23 Tagen, den emotionalen
Biorhythmus (28 Tage) und den geistigen Biorhythmus (genannt Intellekt, Periodendauer 33 Tage). Die Existenz dieser Rhytmen ist
nicht bewiesen und eine praktische Nutzbarkeit kaum erkennbar. Allerdings sind sie sehr nützlich z. B. bei Ausreden. Wurde eine Prüfung
vermasselt, kann man das leicht auf einen schlechten Wert in der geistigen Periode schieben, war die Leistung auf dem Fußballplatz
miserabel, so lag es am Tiefpunkt beim körperlichen Schwingungswert.

Die Perioden beginnen mit dem Tag der Geburt - bereits ein Kritikpunkt, warum nicht mit dem Tag der Befruchtung oder noch früher?
Diesen gemeinsamen Nullpunkt aller drei Rhytmen wird man erst wieder in 21.252 Tagen erreichen, also nach dem 58. Geburtstag.
Ein gemeinsamer Nullpunkt ist allerdings von untergeordnetem Interesse, schlimmer wäre es, wenn alle drei Rhytmen gleichzeitig im Tiefpunkt
wären, also alle drei den Wert -1 hätten. Ein Glückstag wäre dagegen ein Tag, bei dem alle drei Werte den Topwert +1 hätten.

Die Frage lautet, was passiert im Leben zuerst, alle drei Werte DOWN (sehr nahe oder gleich -1) oder alle drei Werte TOP (sehr nahe oder
gleich +1). Nach wievielen Tagen (Jahren) tritt dies jeweils erstmalig ein?

Als Programmieraufgabe eignet sich die Biorhytmusproblematik gut zum Üben der Entwicklung einer GUI-Anwendung (siehe Abb.). Man kann
es sehr einfach in fast allen Programmiersprachen erlernen und realisieren. Wenn man dies so tut, bekommt man schnelle ein Gefühl dafür,
welche Programmiersprache einem von der Stilistik und Per­for­manz hinsichtlich der grafischen Mensch-Maschine-Kommunikation am
symphatischsten ist.
0 Lösungen
Der Leidensweg eines Betrunkenen durch einen Tunnel
Anfänger - Ruby von hollst - 07.03.2017 um 09:40 Uhr
Ein leicht angetrunkener Mann muss für seinen Nachhauseweg durch einen Tunnel der Länge L (z. B. = 10 m)
und der Breite B (z. B. = 5.5 m). Zum Glück ist der Tunnel mit quadratischen Terrazzoplatten ausgelegt, nach denen
er sich zu richten versucht. Die Platten haben eine Gräße von 0.5 x 0.5 m². Somit besteht der Weg aus hier z. B. 20 Reihen a 11 Platten.

Der Mann startet in der ersten Reihe auf der Mittelplatte. Er möchte durch den Tunnel gehen, indem er bei jedem
Schritt auf eine benachbarte Platte tritt. Leider hat er in seinem Zustand völlig die Richtungsorientierung verloren,
so dass sein Schritt rein zufällig in eine der acht möglichen Richtungen verläuf, unabhängig davon,
dass zwei Wände links und rechts den Weg versperren. Wenn der Mann gegen eine der Wände läuft, gilt sein Versuch
den Tunnes zu durchlaufen als gescheitert, da er bewußtlos zu Boden stürzt und liegen bleibt. Als gescheiterter Versuch gilt auch,
wenn sein Weg ihn nicht zum Tunnelausgang, sondern nach einigen Schritten oder schon bereits beim ersten zurück vor den Eingang führt.

Die Frage lautet: Wie groß ist die Wahrscheinlichkeit dafür, dass er den Tunnel mit einem einzigen Versuch schadlos durchquert?
Die Wahrscheinlichkeit (Erwartungswert) soll anhand genügend vielen Simulationen abgeschätzt werden.
0 Lösungen
Kaprekar-Konstanten für Hexadezimalzahlen
Fortgeschrittener - Ruby von hollst - 27.02.2017 um 19:32 Uhr
Man finde für Zahlen in Hexadezimaldarstellung (Basis 16) alle Kaprekar-Konstanten (sofern vorhanden)
für 3, 4 ... 8stellige Zahlen entsprechend dem Algorithmus aus Aufgabe #165. Die Methode ist
so zu formulieren, dass sie leicht für alle Zahlenbasen von 2 bis 256 verwendbar ist.
0 Lösungen
Existiert die Kaprekar-Konstante?
Anfänger - Ruby von hollst - 23.02.2017 um 13:29 Uhr
Man weise numerisch nach, ob die Behauptung des indischen Mathematikers Kaprekar richtig ist.

Kaprekar hat folgendes behauptet (1949):

1.) Man nehme eine vierstellige Dezimalzahl D, wobei nicht alle vier Stellen identisch sein dürfen
(also 1111, 2222 etc. sind nicht erlaubt, aber z. B. 0001 ist erlaubt).
2.) D überführe man in zwei Zahle D1 und D2, indem bei D1 die Digits in absteigender und bei D2 in aufsteigender Reihenfolge
angeordnet werden (also z. B. D = 1724 -> D1 = 7421 und D2 = 1247; oder D = 1 -> D1 = 1000 und D2 = 1).
3.) Man subtrahiere nun D2 von D1; mit dem Ergebnis (Dneu = D1 - D2) wiederhole man Pkt. 2 durch Ersetzen von D durch Dneu solange,
bis sich nichts mehr ändert.

Die unglaubliche Behauptung ist, dass bei diesem Algorithmus stets das gleiche Ergebnis herauskommt (die sogenannte Kaprekar-Konstante),
egal, mit welchem D man beginnt.

Frage: Wie lautet die Kaprekar-Konstante?
0 Lösungen
Funktion über eine Natürliche Zahl
Anfänger - Ruby von hollst - 20.02.2017 um 09:02 Uhr
Man schreibe ein Funktion f(n) mit dem Definitionsbereich (n) und dem Wertebereich (f(n)) der natürlichen Zahlen.

Die Funktion f(n) sei wie folgt zu konstruieren:

1.) Schreibe die Zahlen 1 ... n in absteigender Reihenfolge nebeneinander: n, n - 1, n - 2 ... 5, 4, 3, 2, 1
2.) Wandle diese Zahlen in ihre binärer Darstellen ohne führende Nullen: n, n - 1, n -2 ... 101, 100, 11, 10, 1
3.) Entferne jetzt das Komma zwischen den Binärzahlen, die sich damit ergebende neue Binärzahl ist f(n).

Beispiel: f(6) => 6, 5, 4, 3, 2, 1 => 110, 101, 100, 11, 10, 1 => 11010110011101 = 13725 (dezimal).

Fragen: Welchen Wert hat f(99)?

0 Lösungen
Programmiere ein kleines Banksystem
Anfänger - Ruby von Allocortex - 17.02.2017 um 11:01 Uhr
Programmiere ein kleines Banksystem!

GUI nicht notwendig. Aber:

Biete mehrere Auswahlmöglichkeiten bezüglich der Erstellung eines neuen Kontos, dem bearbeiten eines existierenden Kontos, dem Löschens eines bestehenden Kontos und dem Ausgeben aller Konten in sortierter Reihenfolge (nach Realgeld, siehe weiter unten)

Konten sollen einen Inhaber samt Namen (ggf. Alter) , einen Kontostand, einen Möglichen Kreditrahmen, eine laufende Kreditsumme und das Realgeld besitzen (Realgeld entspricht Kontostand abzüglich des durch Kredit vorhandenen Geldes).
Verwende Private Variablen, Getter und Setter

Nicht alle Konten dürfen einen Kredit besitzen (erst ab 18!)

Bezüglich der Auswahlmöglichkeiten: Diese sollen per Texteingabe oder Button auswählbar sein, und bei Auswahl vertiefende Fragen stellen (vertierendere Auswahlmöglichkeiten bieten) .. z.B. bei bearbeiten eines Kontos "Welches Konto", dann noch tiefer "Welche Eigenschaft", "Welcher Wert".

Das ganze soll dann wieder zum Ursprung springen und die selben Möglichkeiten bieten --> Solange, bis der Benutzer das Programm durch einen bestimmten Text, ein Zeichen, oder einen Button im GUI beendet.
0 Lösungen
Google Calendar API - Events auslesen - Event löschen - Event hinzufügen
Fortgeschrittener - Ruby von Gustl - 08.02.2017 um 11:52 Uhr
Erstelle ein Programm welches als CronJob nutzbar ist, einen GoogleKalender ausliest und den Eventnamen mit Beginn des Termins ausgibt.
Danach soll das 1. Event gelöscht werden, ein neues Event hinzugefügt werden und der Google Kalender über die API aktualisiert werden.
0 Lösungen
Spielerei mit der Zahl 2017
Anfänger - Ruby von hollst - 01.02.2017 um 10:26 Uhr
Die Zahl 2017 wird uns in diesem Jahr sicherlich besonders häufig begegnen.
Eine Besonderheit von ihr: sie ist eine Primzahl, was sicherlich die Zahlenmystiker wachrütteln wird.

Nun gut, was kann man mit 2017 noch so anfangen? Z. B. könnte man ihre vier Digits (2, 0, 1, 7)
untereinander vertauschen und so neue Zahlen erzeugen (z. B. 217, 7102 usw.).

Man könnte auch folgendermaßen neue Zahlen erzeugen: Zwischen jeweils zwei Digits
wird einer der folgenden Operatoren geschrieben: '+', '-', '*', '/' oder 'join'.
Die ersten vier Operatoren stehen für Addition, Subtraktion, Multiplikation und Division.
Der Operator 'join' steht für "Zahlenverbinder" , z. B.

2 + 0 + 1 join 7 = 2 + 0 + 17 = 19 oder
1 + 7 join 0 * 2 = 1 + 70 * 2 = 141

und hat die höchste Priorität (gefolgt von '*', '/' und '+', '-', wie üblich).

Möglich ist auch das:

7 / 2 + 0 * 1 = 3.5 oder
2 / 0 + 1 * 7 = unendlich
etc.

Folgende Aufgabenstellung:

Auf Basis der vier Digits (2, 0, 1, 7)
und der fünf Operatoren ('+', '-', '*', '/', ' ') [das Leerzeichen ' ' stehe für 'join']

sind alle möglichen Natürliche Zahlen (inc. Null) entsprechend obiger Beispiele zu erzeugen,
wobei die vier Digits jeweils einmal vorkommen müssen.
Die Operatoren können mehrfach verwendet werden (z. B. 1 + 0 * 2 + 7 = 8).
Eine Klammersetzung (z. B. (1 + 0) * 2 + 7 = 9) ist nicht erlaubt (bzw. optional, wer es weiter verkomplizieren möchte).

Beispiele:

0 = 0 * 217 = 72 * 1 * 0 = ...
...
3 = 2 + 1 + 0 * 7 = 1 + 2 + 0 * 7 = 1 + 7 * 0 + 2 etc.

Frage:
Welches ist die kleinste Natürliche Zahl, die auf diese Weise nicht dargestellt werden kann?

Anmerkung:
Bei den Zahlen zwischen 0 und 100 gibt es immerhin 58, die laut Aufgabenstellung mittels 2017 nicht darstellbar sind.
Dagegen lässt sich z. B. die 9 auf 126 verschiedene Arten berechnen (bei Umgehung des Kommutativgesetzes).
0 Lösungen
Überprüfen von Email Adressen
Anfänger - Ruby von ZRX88 - 08.01.2017 um 12:38 Uhr
Hintergrund:
Angenommen du hast eine Internetadresse und sammelst dort Emails über ein Newsletter anmelden Formular ein.
Dadurch generierst eine Zahl x an Email Adressen aller Art.
Das Ziel ist nun zu bestimmen, Eigenschaften deiner Adressen auszuwerten. Typische Fragen sind hier beispielsweise Verteilung der Geschlechter, Alter?


Daher soll ein Programm geschrieben werden, welches eine Liste mit Email-Adressen entgegen nimmt und dann folgende Eigenschaften ausgibt:

* Valide Email? ( Ist es überhaupt eine Email...)
* Domain
* Land der Domain
* Email enthält Zahlen?
* Geburtsjahr?
* ... ( Gibt sicher noch einige spannende Eigenschaften.. Up to you!)

Optional:
* Geschlecht?

Anmerkung: Der Prozess muss nicht perfekt sein.