¿Cuál es el código para seleccionar los n primeros números enteros de una lista en Latex dentro de un algoritmo?

¿Cuál es el código para seleccionar los n primeros números enteros de una lista en Latex dentro de un algoritmo?

Mi lista es l[] con 1000 números enteros. En el algoritmo, estoy seleccionando los n primeros números enteros de esta lista. ¿Cómo escribo el código de látex para hacer esto?

¿Puedo usar el operador argmax para seleccionar los valores k máximos de la lista o sus índices correspondientes?

Respuesta1

La solución basada únicamente en primitivas TeX y macros básicas de Plain TeX está aquí:

\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

Respuesta2

Soy consciente de que estás usando la pdftexetiqueta, pero por si acaso, aquí tienes una solución con 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}

En una palabra:

  • Puede insertar código Lua en cualquier lugar de LaTeX en \directlualos comandos.
  • Todos \directlualos bloques están "vinculados" para que puedas reutilizar el contenido de uno a otro.
  • La tex.printfunción es necesaria para que Lua envíe resultados a LaTeX.

La forma en que ordené la matriz para extraer los elementos más grandes no es el enfoque más elegante, pero se entiende la idea.

Respuesta3

A continuación se muestra un ejemplo que selecciona elnorteenteros más grandes de una lista separada por comas.

ingrese la descripción de la imagen aquí

\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}

información relacionada