Anzeige:
Ergebnis 1 bis 3 von 3

Thema: Verständnisfrage zu Luacode

  1. #1
    Registrierter Benutzer
    Registriert seit
    12.11.2008
    Beiträge
    193

    Verständnisfrage zu Luacode

    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
    Code:
    % !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}

  2. #2
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.779
    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
    Code:
    % !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
    Rainer
    There's nothing a good whack with a hammer won't fix!

  3. #3
    Registrierter Benutzer
    Registriert seit
    12.11.2008
    Beiträge
    193
    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

    Code:
    	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

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •