Das Buch der Weissagungen (Schleifen)
Die Chinesische Weissagung I-Ging (I-Ching) bedient sich zweier Muster
- ------ = Yang und
- -- -- = Yin,
die an 6 Plätzen auftreten können. Dadurch ergeben sich 64 sog. Hexagramme, von denen jedem eine bestimmte Bedeutung zukommt. So bedeutet zum Beispiel das folgende Symbol "Die Sammlung":
Schreiben Sie ein Programm, das alle 64 möglichen I-Ging-Hexagramme ausgibt.
Beispiel in Textform:
-- --
------
------
-- --
-- --
-- --
1 Kommentare
6 Lösung(en)
public class Yijing {
public static void main(String[] args) {
new Yijing().top(); }
void top() {
int muster = 0;
while(muster < 64) {
ausgabe(muster);
muster = muster + 1;
}
}
void ausgabe(int muster) {
int pos = 5;
System.out.println("Muster zu Nummer " + (muster+1) + ":");
while(pos >= 0) {
if(muster % 2 == 0) {
System.out.println(" -- --");
} else {
System.out.println(" ------");
}
muster = muster / 2;
pos = pos - 1;
}
System.out.println("********************");
}
} // end of class Yijing
// processing
int breite = 50; //Linienbreite in px
int hoehe = 12; //Zeilenhoehe in px
int drittelBreite;
int abstand;
void setup() {
drittelBreite = int(breite / 3);
abstand = drittelBreite;
background(255);
stroke(0);
smooth();
size(abstand + (breite + drittelBreite) * 8, (hoehe * 6 + abstand) * 8);
int muster = 0;
while(muster < 64) {
ausgabe(muster);
muster = muster + 1;
}
}
void ausgabe(int muster) {
int pos = 5;
int zeile;
int spalte;
int x;
int y;
strokeWeight(int(hoehe/2));
spalte = muster % 8;
zeile = int(muster / 8);
x = abstand + spalte * (breite + drittelBreite);
y = abstand + zeile * 7 * hoehe;
while(pos >= 0) {
if(muster % 2 == 0) {
line(x, y + pos * hoehe, x + breite, y + pos * hoehe);
}
else {
line(x, y + pos * hoehe, x + drittelBreite, y + pos * hoehe);
line(x+ 2* drittelBreite, y + pos * hoehe, x + breite, y + pos * hoehe);
}
muster = muster / 2;
pos = pos - 1;
}
}
%!PS-Adobe-2.0 EPSF-2.0
%%Creator: phi@gress.ly "the geek" (März 2010)
%%Title: iging (Yijing) symbole. 64 Hexagramme der asiatischen Weissagung
%%Pages: 1
%%BoundingBox: 0 0 200 200
%%EndComments
% Zeichne alle 64 I-Ging (Yijing) Symbole
/quadratseite 25 def
/rahmenbreite 2 def
/symbolbreite quadratseite rahmenbreite 2 mul sub def
/linienhoehe symbolbreite 12 div def
/durchgezogenelinie {
newpath
0 0 moveto
symbolbreite 0 lineto
stroke
} def
/unterbrochenelinie {
newpath
0 0 moveto
symbolbreite 3 div 0 lineto
stroke
newpath
symbolbreite 3 div 2 mul 0 moveto
symbolbreite 0 lineto
stroke
} def
/rauf {
0 linienhoehe 2 mul translate
} def
/liniezeichnen {
1 eq {durchgezogenelinie}
{unterbrochenelinie} ifelse
} def
/naechstelinie {
dup 2 mod liniezeichnen rauf 2 idiv
} def
/symbol {
gsave
rahmenbreite rahmenbreite translate
6 {naechstelinie} repeat
pop %% TODO: Warum dieses POP hier??
grestore
} def
/positionieresymbol {
dup
symbol
1 add 8 mod
0 eq {quadratseite 7 mul neg quadratseite translate}
{quadratseite 0 translate} ifelse
} def
gsave
linienhoehe setlinewidth
0 0 translate
0 1 63 {positionieresymbol} for
grestore
showpage
function getAllYijingHexagramSymbols() {
let allYijingHexagramSymbols = [];
for (let i = 19904; i <= 19967; i++)
allYijingHexagramSymbols.push(String.fromCharCode(i));
return allYijingHexagramSymbols;
}
document.write(getAllYijingHexagramSymbols().join(' ')); // lissalanda@gmx.at
Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)
// NET 6.x | C# 10.x | VS-2022
var sb = new System.Text.StringBuilder();
var lst = Enumerable.Range(19904, 64).Select(x => (char)x);
for (var i = 0; i < 64; i += 8)
sb.Append(string.Join(" ", lst.Skip(i).Take(8))).AppendLine();
// Ausgabe in eine Textdatei auf dem Windows-Desktop (Pfad ggf. anpassen)
try { File.WriteAllTextAsync(@$"C:\Users\{Environment.UserName}\Desktop\Hexagramme.txt", sb.ToString()); }
catch (Exception ex) { Console.WriteLine(ex.Message); }
Lösung von: Jens Kelm (@JKooP)
// C++ 14 | VS-2022
// Diese Lösung ist angelehnt an die 1. Java-Lösung.
// Die eigene Leistung bestand lediglich in der Überführung in 'modern C++'.
#include <iostream>
#include <vector>
struct hexa {
size_t num;
std::string sign;
};
inline const auto get_hexagram(size_t num_) {
auto line{ 6 };
std::string out;
while (line--) {
out.append(num_ & 1 ? "------" : "-- --") += "\n";
num_ /= 2;
}
return out;
}
inline const auto get_yin_yan(size_t begin_ = 1, size_t end_ = 64) {
std::vector<hexa> out;
if (begin_ < 1) begin_ = 1;
if (end_ > 64) end_ = 64;
for (size_t i{ begin_ - 1 }; i < end_; ++i)
out.push_back({i + 1, get_hexagram(i)});
return out;
}
inline const std::ostream& operator<<(std::ostream& os_, const hexa& val_) {
return os_ << "Hexa No." << val_.num << "\n" << val_.sign << "\n";
}
inline const auto print(const std::vector<hexa>& val_) noexcept {
for (const auto& el : val_) std::cout << el;
}
int main() {
print(get_yin_yan(5, 10));
print(get_yin_yan());
}
Lösung von: Jens Kelm (@JKooP)
Verifikation/Checksumme:
Alle 64 Hexagramme:
Aktionen
Neue Lösung hinzufügen
Bewertung
Durchschnittliche Bewertung:
Meta
Zeit: | 1 |
Schwierigkeit: | k.A. |
Webcode: | 95ew-4rif |
Autor: | Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch) |
Kommentare (1)