Wie lautet der Code zum Auswählen der obersten n Ganzzahlen aus einer Liste in Latex innerhalb eines Algorithmus?

Wie lautet der Code zum Auswählen der obersten n Ganzzahlen aus einer Liste in Latex innerhalb eines Algorithmus?

Meine Liste ist l[] mit 1000 Ganzzahlen. Im Algorithmus wähle ich die besten n Ganzzahlen aus dieser Liste aus. Wie schreibe ich den Latex-Code dafür?

kann ich den Operator Argmax verwenden, um maximal k-Werte aus der Liste oder ihre entsprechenden Indizes auszuwählen?

Antwort1

Die Lösung, die nur auf TeX-Grundelementen und grundlegenden Plain-TeX-Makros basiert, finden Sie hier:

\newcount\selected  

\def\alist{}
\def\scanlist#1 {%
   \ifx;#1\else
      \addtoalist\alist{#1}%
      \ifnum\selected>0 \advance\selected by-1
      \else \remlast\alist \fi
      \expandafter\scanlist
   \fi 
}
\def\remlast#1{\edef#1{\expandafter}\expandafter\remlastA#1{} }   
\def\remlastA #1 #2 {%
   \if^#2^\else
      \edef\alist{\alist#1 }\afterfi{\remlastA #2 }%
   \fi
}
\def\addtoalist#1#2{\def\tmp{#2}\edef#1{\expandafter}\expandafter\addtoalistA#1; }
\def\addtoalistA #1 {%
   \ifx;#1\edef\alist{\alist \tmp\space}\else
      \ifnum\tmp>#1 \edef\alist{\alist\tmp\space#1 }%
         \afterfi{\afterfi{\addtoalistB}}%
      \else \edef\alist{\alist #1 }%
         \afterfi{\afterfi{\addtoalistA}}%
      \fi
   \fi
}
\def\addtoalistB#1; {\edef\alist{\alist#1}}
\def\afterfi#1#2\fi{\fi#1}

%% test:

\def\list{12 18 32 127 123 432 456 456 890 543 654 234 12 18 87 96 } 
\selected=5 % number of selected numbers

\expandafter\scanlist\list; % does the job, result is in \alist

\meaning\alist % macro-> 800 654 543 456 456

\bye

Antwort2

Ich bin mir bewusst, dass Sie das Tag verwenden pdftex, aber nur für den Fall hier eine Lösung mit LuaLaTeX:

\documentclass{article}
\usepackage{luacode}

\directlua{
    function sortf(x, y)
        return x > y
    end

    function maxlist(L, n)
        table.sort(L, sortf)
        local M = {}
        for i = 1, n do
            M[i] = L[i]
        end
        return M
    end

    a = {1, 3, 2, 7, 4, 0}
    n = 3
}

\begin{document}
The list is \directlua{tex.print(a)} and its \directlua{tex.print(n)} biggest elements are \directlua{tex.print(maxlist(a, n))}.

\end{document}

Kurzgesagt:

  • \directluaSie können Lua-Code überall in LaTeX in Befehlen einfügen .
  • Alle \directluaBlöcke sind „verknüpft“, sodass Sie Inhalte von einem Block zum nächsten wiederverwenden können.
  • Die tex.printFunktion ist für Lua erforderlich, um Ergebnisse an LaTeX zu senden.

Die Art und Weise, wie ich das Array sortiert habe, um die größten Elemente zu extrahieren, ist nicht der eleganteste Ansatz, aber Sie verstehen, was ich meine.

Antwort3

Hier ist ein Beispiel, das dieNgrößte Ganzzahlen aus einer durch Kommas getrennten Liste.

Bildbeschreibung hier eingeben

\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\listmax}{mm}{ % #1: list, #2: n
    \clist_set:Nn \l_tmpb_clist {#1}
    \clist_sort:Nn \l_tmpb_clist
      { \int_compare:nTF { ##1 < ##2 } { \sort_return_swapped: } { \sort_return_same: } }
    \clist_clear:N \l_tmpa_clist
    \int_step_inline:nn { #2 } { \clist_put_right:Nn \l_tmpa_clist {\clist_item:Nn \l_tmpb_clist { ##1 }} }
    \clist_use:Nn \l_tmpa_clist {,~}
}
\ExplSyntaxOff
\begin{document}
\listmax{2,11,13,8,4,1,3,5,7,9,20,6,101}{10}

\listmax{1,6,4,7,8,9}{4}
\end{document}

verwandte Informationen