PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verständnisfrage zu Luacode



MC3330
22-03-2020, 08:33
Hallo,

ich fange gerade an, mich mit Luacode in Latex auseinanderzusetzen und habe eine Verständnisfrage. Ich habe eine Tabelle, die ich zufällig neu anordnen möchte. Dazu habe ich hier (https://gist.github.com/Uradamus/10323382) eine Funktion gefunden. Da klappt soweit auch gut, allerdings wird dabei die ursprüngliche Tabelle umsortiert. Ich würde es gerne hinbekommen, dass eine neu Tabelle erstellt wird.
In meinem MB ist shuffle1 die Funktion, die ich gefunden habe. Dabei wird die Tabelle t1 einfach zufällig umsortiert.

In shuffle2 habe ich versucht es so anzupassen, dass ich erst eine neue Tabelle erstelle und diese dann zufällig anordne und an die Tabelle t2 zurückgebe. Das klappt soweit auch, allerdings wird dabei auch die Tabelle t1 genau wie t2 umsortiert.


Ich vermute, dass der Befehl "local result = tbl" scheinbar keine einmalige absolute Zuordnung ist, sondern eine Art Verknüpfung zwischen den beiden Tabellen. Stimmt das so? Kann ich es irgendwie hinbekommen, dass ich die Tabelle "result" ändern kann, ohne dass es sich auf die Tabelle "tbl" auswirkt?

MB


% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{luacode}
\setlength\parindent{0pt}

\begin{document}
\begin{luacode}
function shuffle1(tbl)
for i = #tbl, 2, -1 do
local j = math.random(i)
tbl[i], tbl[j] = tbl[j], tbl[i]
end
end

function shuffle2(tbl)
local result = tbl
for i = #result, 2, -1 do
local j = math.random(i)
result[i], result[j] = result[j], result[i]
end
return result
end
\end{luacode}

\directlua{
t1={1,2,3}
}
Shuffle 1\\
Vor der Funktion shuffle1\\
t1: \directlua{tex.print(t1)}\\\\
\directlua{
shuffle1(t1)
}
Nach der Funktion shuffle1\\
t1: \directlua{tex.print(t1)}\\\\

Shuffle 2\\
\directlua{
t1={1,2,3}
}
Vor der Funktion shuffle2\\
t1: \directlua{tex.print(t1)}\\
t2: \directlua{tex.print(t2)}\\\\
\directlua{
t2 = shuffle2(t1)
}
Nach der Funktion shuffle2\\
%\tableshuffle
t1: \directlua{tex.print(t1)}\\
t2: \directlua{tex.print(t2)}\\

\end{document}

rais
29-03-2020, 18:34
Auf lua-Ebene kenn ich mich zu wenig aus, aber behelfen könntest Du Dir, indem Du die Ausgabe von shuffle/tex.print in ein Makro umleitest, etwa


% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{luacode}
\setlength\parindent{0pt}

\newcommand*\tbla{?}
\newcommand*\tblb{!}

\begin{luacode}
function shuffle(tbl)
for i = #tbl, 2, -1 do
local j = math.random(i)
tbl[i], tbl[j] = tbl[j], tbl[i]
end
end

\end{luacode}

\newcommand*\tblinit[1]{%
\directlua{
t={#1}
}%
}

\newcommand*\tblshuffle[1]{%
\edef#1{\directlua{
shuffle(t)
tex.print(t)
}%
}
}
\begin{document}
(1/2) \tbla/\tblb\par mische 1\ldots

\tblinit{1,2,3}
\tblshuffle{\tbla}
(1/2) \tbla/\tblb\par mische 2\ldots

\tblinit{4,5,6}
\tblshuffle{\tblb}
(1/2) \tbla/\tblb\par mische nochmal 1\ldots

\tblshuffle{\tbla}
(1/2) \tbla/\tblb
\end{document}

VG

MC3330
29-03-2020, 18:44
Danke, mittlerweile habe ich eine Lösung gefunden, die für mich funktioniert.
Habe ganz vergessen, sie hier rein zu schreiben.

Wenn man es über einen Rückgabewert macht, sind die beiden Tabellen nicht mehr verknüpft.

Viele Grüße



function table.shuffle(tbl)
local tbl2={}
for i = 1,#tbl,1 do
tbl2[i]= tbl[i]
end
for i = #tbl2, 2, -1 do
local j = math.random(i)
tbl2[i], tbl2[j] = tbl2[j], tbl2[i]
end

return tbl2
end