
내 목록은 1000개의 정수가 있는 l[]입니다. 알고리즘에서는 이 목록에서 상위 n개의 정수를 선택합니다. 이를 위해 라텍스 코드를 어떻게 작성합니까?
목록이나 해당 인덱스에서 최대 k 값을 선택하기 위해 argmax 연산자를 사용할 수 있습니까?
답변1
TeX 기본 요소와 기본 Plain TeX 매크로만을 기반으로 하는 솔루션은 다음과 같습니다.
\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
답변2
나는 당신이 pdftex
태그를 사용하고 있다는 것을 알고 있지만 만일의 경우에 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}
간단히 말해서:
- 명령 의 LaTeX 어디든 Lua 코드를 삽입할 수 있습니다
\directlua
. - 모든
\directlua
블록은 "링크"되어 있으므로 콘텐츠를 한 블록에서 다음 블록으로 재사용할 수 있습니다. - Lua가 결과를 LaTeX로 보내려면 이
tex.print
함수가 필요합니다.
가장 큰 요소를 추출하기 위해 배열을 정렬하는 방식은 가장 우아한 접근 방식은 아니지만 아이디어를 얻을 수 있습니다.
답변3
다음은N쉼표로 구분된 목록에서 가장 큰 정수입니다.
\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}