TeXwelt wurde neu installiert. Es funktionieren noch nicht alle Features und auch an den deutschsprachigen Formulierungen wird verbessert. Danke für eure Geduld.

Für die 4-Menge a,b,c,d gibt es die alt text 3-Kombinationen in lexikographischer Reihenfolge

1. a,b,c
2. a,b,d
3. a,c,d
4. b,c,d

Ich habe mich gefragt: kann man diese Ausgabe irgendwie mit foreach-Schleifen o.ä. erzeugen?

Hinweis: In meinem konkreten Problem geht es um die 455 3-Kombinationen einer 15-Menge: alt text

gefragt 07 Mär '19, 19:31

cis's gravatar image

cis
9.3k22216382
Akzeptiert-Rate: 29%

2

Ist das nicht eher eine Frage für ein Matheforum? Algorithmisch ist das IMHO so etwas wie:

Öffne in Overleaf
a=15
while a >= 3 {
  b=a-1
  while b >= 2 { 
    c=b-1
    while c >= 1 { 
      print a b c
      c=c-1
    }
    b=b-1
  }
  a=a-1
}

Wobei Du natürlich noch die Zahlen in Buchstaben wandeln musst.

(07 Mär '19, 20:38) Ijon Tichy

Naja, ich möchte das ja automatisch ausgeben mit LaTeX. Allerdings ist es vielleicht tatsächlich ein CAS-Problem.

(07 Mär '19, 21:45) cis

Eigentlich kann man den Algorithmus von Ijon auch direkt mit LaTeX, ganz ohne Pakete umsetzen. Ich drehe hier mal nur zur Vereinfachung die Schleifen um:

Öffne in Overleaf
\documentclass[a4paper]{article}

\makeatletter
\newcommand*{\whilenum}{\@whilenum}
\makeatother

\newcounter{a}\renewcommand*{\thea}{\alph{a}}
\newcounter{b}\renewcommand*{\theb}{\alph{b}}
\newcounter{c}\renewcommand*{\thec}{\alph{c}}
\newcounter{n}

\begin{document}

\raggedright
\setcounter{a}{1}
\setcounter{n}{1}
\whilenum \value{a}<14 \do {%
  \setcounter{b}{\numexpr \value{a}+1\relax}%
  \whilenum \value{b}<15 \do {%
    \setcounter{c}{\numexpr \value{b}+1\relax}%
    \whilenum \value{c}<16 \do {%
      \textbf{\then.} \thea\theb\thec\\
      \stepcounter{c}%
      \stepcounter{n}%
    }%
    \stepcounter{b}%
  }%
  \stepcounter{a}%
}

\end{document}

Oder mit LaTeX3 (dieses Mal nahezu wörtlich umgesetzt):

Öffne in Overleaf
\documentclass[a4paper]{article}

\usepackage{xparse}

\ExplSyntaxOn
\int_new:N \l__threeoffifteen_a_int
\int_new:N \l__threeoffifteen_b_int
\int_new:N \l__threeoffifteen_c_int
\int_new:N \l__threeoffifteen_n_int

\NewDocumentCommand \threeoffifteen { O{\\} }
{%
  \int_set:Nn \l__threeoffifteen_n_int { 1 }
  \int_set:Nn \l__threeoffifteen_a_int { 15 }
  \int_while_do:nn { \l__threeoffifteen_a_int >= 3 }
  {%
    \int_set:Nn \l__threeoffifteen_b_int { \l__threeoffifteen_a_int - 1 }
    \int_while_do:nn { \l__threeoffifteen_b_int >= 2 }
    {%
      \int_set:Nn \l__threeoffifteen_c_int { \l__threeoffifteen_b_int - 1 }
      \int_while_do:nn { \l__threeoffifteen_c_int >= 1 }
      {%
        \textbf{ \int_to_arabic:n { \l__threeoffifteen_n_int } . }
        \nobreakspace
        \int_to_alph:n { 16 - \l__threeoffifteen_a_int }
        \int_to_alph:n { 16 - \l__threeoffifteen_b_int }
        \int_to_alph:n { 16 - \l__threeoffifteen_c_int }
        #1
        \int_incr:N \l__threeoffifteen_n_int
        \int_decr:N \l__threeoffifteen_c_int
      }%
      \int_decr:N \l__threeoffifteen_b_int
    }
    \int_decr:N \l__threeoffifteen_a_int
  }
}
\ExplSyntaxOff

\begin{document}

\raggedright\threeoffifteen
%\noindent\threeoffifteen[ ]

\end{document}

Verwendet man die Zeile \noindent\threeaboutfifteen[ ] statt der Zeile \raggedright\theeaboutfifteen, ist die Ausgabe:

alt text

Eine Abwandlung für \threeofN, wobei N ein zusätzliches Argument im Wertebereich 3 <= N <= 26 ist, wäre dabei einfach umzusetzen.

Es muss also nicht immer pgf sein. Natürlich ist gut, wenn man pgf beherrscht. LaTeX3 zu lernen hat allerdings auch viele Vorteile.

Permanenter link

beantwortet 09 Mär '19, 13:28

saputello's gravatar image

saputello
10.5k93760
Akzeptiert-Rate: 51%

bearbeitet 20 Mär '19, 17:11

Jetzt fehlt eigentlich nur noch, dass @Henri eine schöne ConTeXt-Lösung erstellt. Wobei das vermutlich eigentlich eine Lua-Lösung wäre, die man daher auch mit LuaLaTeX-Umsetzen könnte. ;-)

(09 Mär '19, 13:36) saputello
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×21
×12

gestellte Frage: 07 Mär '19, 19:31

Frage wurde gesehen: 874 Mal

zuletzt geändert: 20 Mär '19, 17:11