Paragraph X (Kleinprojekte)
§ XXII besagt: Dieser Paragraph sei 22 (in Worten: zweiundzwanzig, binär: 10110) Zeichen lang.
Das geübte Auge bemerkt sieht sofort: dieser Paragraph widerspricht sich. Er ist nicht 22, sondern ganze 94 Zeichen lang.
Ihre Aufgabe:
Finden Sie alle widerspruchsfreien Paragraphen in der Form:
§ [R] besagt: Dieser Paragraph sei [D] (in Worten: [W], binär: [B]) Zeichen lang.
(Wobei [R] = Länge des Satzes als römische Zahl, [D] = Länge des Satzes als Dezimalzahl, [B] = Länge des Satzes als Binärzahl.)
Sollten Sie bereits die Programmieraufgaben
- »Römische Zahlen« (Webcode sv9k-jktq) o.ä.
- »Zahlensystemumrechner --- Dual/Binär, Hexadezimal und Dezimal« (Webcode wbc9-3sou) o.ä.
- »Deutsche Zahlnamen« (Webcode s8y6-rqfn)
erfüllt haben, setzen Sie Ihren dort deponierten Code unmodifiziert zur Umformung ein (Stichwort: Wiederverwendbarkeit).
Machen Sie sich außerdem zuvor Gedanken über die untere und obere Grenze der zu prüfenden Zahlen.
1 Kommentare
3 Lösung(en)
import { romanNumerals } from '../römischeZahlen/code.js';
import { Number.prototype.verbalDe } from '../deutscheZahlnamen/code.js';
let i = 78, j = i * 2;
for (i; i < j; i++) {
let phrase = (`
§ ${romanNumerals(i)} besagt: Dieser Paragraph sei ${i}
(in Worten: ${i.verbalDe()}, binär: ${i.toString(2)}) Zeichen lang.
`);
if (phrase.length == i) console.log(phrase);
}
Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)
// NET 6.x | C# 10.x | VS-2022
var rn = new RomanNumber();
var sn = new NumberSpelling();
for (int i = 70; i < 200; i++) {
var t = $"§ {rn.DecToRom(i)} besagt: Dieser Paragraph sei {i} (in Worten: {sn.NumSpell(i)}, binär: {Convert.ToString(i, 2)}) Zeichen lang.";
if (t.Length == i)
Console.WriteLine(t);
}
/*
§ XCV besagt: Dieser Paragraph sei 95 (in Worten: fünfundneunzig, binär: 1011111) Zeichen lang.
§ XCVIII besagt: Dieser Paragraph sei 98 (in Worten: achtundneunzig, binär: 1100010) Zeichen lang.
*/
Lösung von: Jens Kelm (@JKooP)
// C++ 14 | VS-2022
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <bitset>
std::string number_spelling(int);
std::string dec_to_rom(int);
int main() {
for (auto i{ 70 }; i < 200; i++) {
const auto R{ dec_to_rom(i) };
const auto D{ std::to_string(i) };
const auto W{ number_spelling(i) };
const auto B{ std::bitset<8>(i).to_string()};
const std::string t{ "\43 " + R + " besagt: Dieser Paragraph sei " + D + " (in Worten: " + W + ", bin\341r: " + B + ") Zeichen lang." };
if (t.length() - 1 == i)
std::cout << t << "\n";
}
}
struct RomNum {
std::string rom_str{};
int rom_val{ 0 };
};
std::string dec_to_rom(int n) {
const std::vector<RomNum>& rom_num{ {"M", 1000}, {"CM", 900}, {"D", 500}, {"CD", 400}, {"C", 100}, {"XC", 90}, {"L", 50}, {"XL", 40}, {"X", 10}, {"IX", 9}, {"V", 5}, {"IV", 4}, {"I", 1} };
auto i{ 0 };
std::string res{};
while (n) {
auto t{ rom_num[i].rom_val };
while (n >= t) {
res += rom_num[i].rom_str;
n -= t;
}
i++;
}
return res;
}
std::string number_spelling(int n) {
std::string r{};
const std::vector<std::string>& v{ "null", "ein|s", "zwei", "drei", "vier", "f\365nf", "sech|s", "sieb|en", "acht", "neun", "zehn", "elf", "zw\357lf" };
const auto fst{ [&v](int k) { return v[k].substr(0, v[k].find('|')); } };
const auto all{ [&v, &fst](int k) { return fst(k) + (v[k].find('|') == -1 ? "" : v[k].substr(v[k].find('|') + 1)); } };
const auto _0_12{ [&]() { r += all(n); } };
const auto _13_19{ [&]() { r += fst(n % 10) + "zehn"; } };
const auto _20_99{ [&]() {
if (n % 10 != 0) r += (n % 10 == 1 ? fst(n % 10) : all(n % 10)) + "und";
if (n / 10 == 2) r += "zwanzig";
else if (n / 10 == 3) r += "drei\341ig";
else r += fst(n / 10) + "zig"; }
};
const auto _100_999{ [&]() {
r += (n / 100 == 1 ? fst(n / 100) : all(n / 100)) + "hundert";
if (n % 100 != 0) {
n %= 100;
if (n < 13) _0_12();
else if (n < 20) _13_19();
else _20_99();
} }
};
if (n < 0 || n > 999) return "unknown";
else if (n < 13) _0_12();
else if (n < 20) _13_19();
else if (n < 100) _20_99();
else _100_999();
return r;
}
Lösung von: Jens Kelm (@JKooP)
Verifikation/Checksumme:
Es gibt zwei Lösungen dieser Aufgabe im Zahlenraum 1–1000. Die eine ist:
Aktionen
Neue Lösung hinzufügen
Bewertung
Durchschnittliche Bewertung:
Kommentare (1)
Die Form sei diese:
§ [R] besagt: Dieser Paragraph sei [D] (in Worten: [W], binär: [B]) Zeichen lang.