Tabele prawdy LaTeX

11

Napisz program lub funkcję, która akceptuje listę wyników funkcji logicznej i wyświetla kod LaTeX dla swojej tabeli prawdy.

Dane wejściowe powinny być oznaczone małymi literami a-z, a dane wyjściowe - F. Długość listy danych wejściowych zawsze będzie krótsza niż 2^25, co oznacza, że ​​liczba danych wejściowych zawsze będzie mniejsza niż 25, więc możesz używać liter z małych liter alfabetu do nazw danych wejściowych.

Wejście

Liczba ndanych wejściowych i lista długości 2^nliczb binarnych reprezentujących dane wyjściowe funkcji logicznej.

Wynik

Kod LaTeX, który tworzy tabelę prawdy dla tej funkcji. Wartości wejściowe i wyjściowe powinny być wyśrodkowane w rzędach. Między nagłówkiem tabeli a jej wartościami oraz między danymi wejściowymi i wyjściowymi musi znajdować się linia, więc kod powinien być podobny do poniższego.

\begin{tabular}{c * <NUMBER OF INPUTS>|c}
<INPUTS>&F\\
\hline
<INPUT VECTOR i>&<OUTPUT>\\
\end{tabular}

Przykład

Wejście:

2
[0, 0, 0, 1]

Wynik:

\begin{tabular}{cc|c}
a & b & F \\
\hline
0 & 0 & 0 \\
0 & 1 & 0 \\
1 & 0 & 0 \\
1 & 1 & 1 \\
\end{tabular}

Które wyświetlane w LaTeX pokazują następującą tabelę prawdy

Tabela prawdy

Główne zasady

drobilc
źródło
3
Czy to wyzwanie wymaga dokładnie takich samych danych wyjściowych, czy jakiegokolwiek wyjścia, które może wytworzyć to samo w TeX-ie?
tsh
2
Wszelkie dane wyjściowe, które produkują to samo w
TeXie
2
Coś, co uważam za trudne, nie znając TeXa tak dobrze, jest to, że mogą istnieć inne krótsze sposoby na napisanie kodu TeX formatującego tabelę, lub nawet inny sposób (pakiet?) Na utworzenie tabeli. Niezależnie od tego, jakiego języka używam, TeX golf stanowi część wyzwania. Czy dla wygody dostępny jest tłumacz online dla TeXa, a może jednoznaczny, co to dokładnie jest implementacja?
xnor
1
Wskazówka: wydaje się, że kod TeX działa ze wszystkimi spacjami i znakami nowej linii.
xnor
1
Każdy, kto nie wie, jak to zrobić w LaTeX, postępuj zgodnie z powyższym przykładem. Jeśli n = 5, po prostu wstaw ccccczamiast zamiast cc, ale zostaw w |cspokoju ... I tak, w tej tabeli wszystkie spacje i znaki nowej linii są opcjonalne, ale unikałbym pustych linii.
Heimdall,

Odpowiedzi:

10

Węgiel drzewny , 70 bajtów

≔tabularζ\ζ{*θc|c}⸿⪫✂β⁰Iθ¹&⁰&F\\⸿\hline⸿Eη⁺⪫⁺⮌EIθI﹪÷κX²λ²⟦ι⟧&¦\\⁰\endζ

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

≔tabularζ

Zapisz ten ciąg w zmiennej, aby uniknąć powielania.

\ζ{*θc|c}⸿

Wydrukuj \tabular{*2c|c}wiersz początkowy (2 lub dowolną wartość, którą qma pierwsze wejście ).

⪫✂β⁰Iθ¹&⁰&F\\⸿\hline⸿

Pobierz pierwsze qlitery ze wstępnie zdefiniowanej zmiennej bi wstaw &je między nimi, a następnie dodaj, &F\\a także wydrukuj \hlinew następnym wierszu.

Eη⁺⪫⁺⮌EIθI﹪÷κX²λ²⟦ι⟧&¦\\

Pętla nad znakami na drugim wejściu. Dla każdego z nich jego indeks jest konwertowany na dwójkowy o długości q, znak jest konkatenowany, wynik jest łączony &si i \\jest dołączany. Powstałe ciągi są domyślnie drukowane na osobnych wierszach.

⁰\endζ

Wydrukuj \endtabular. (Jest to tylko separator, ponieważ deverbosifier zapomniał wstawić a ¦.)

Neil
źródło
3
To trochę imponujące, że węgiel drzewny jest obecnie zwycięzcą, biorąc pod uwagę, że to wyzwanie nie jest tak naprawdę przeznaczone do tego.
Erik the Outgolfer
6

Python 2 , 153 bajty

lambda n,l:r'\tabular{*%dc|c}%s&F\\\hline%s\endtabular'%(n,q(map(chr,range(97,97+n))),r'\\'.join(q(bin(2**n+i)[3:]+x)for i,x in enumerate(l)))
q='&'.join

Wypróbuj online!

Wyjścia jak

\tabular{*2c|c}a&b&F\\\hline0&0&0\\0&1&0\\1&0&0\\1&1&1\endtabular

\tabulari \endtabularsą używane jako krótsze \begin{tabular}i \end{tabular}, zgodnie z tą wskazówką golfową LaTeX . *2cJest skrótem do zdefiniowania 2 kolumny.

xnor
źródło
5

Haskell, 164 155 bajtów

s%f=((:"&")=<<s)++f:"\\\\"
n#r=unlines$("\\tabular{"++('c'<$[1..n])++"|c}"):take n['a'..]%'F':"\\hline":zipWith(%)(mapM id$"01"<$[1..n])r++["\\endtabular"]

Wypróbuj online!

unlines                               -- take a list of strings and join it with NL.
                                      -- the strings are:
   "\\tabular{"++('c'<$[1..n])++"|c}" -- tabular definition with n times 'c'
   take n['a'..]%'F'                  -- table header
   "\\hline"                          -- hline
   zipWith(%)(mapM id$"01"<$[1..n])r  -- table content
   ["\\endtabular"]                   -- end of tabular definition

Table header and content are built via function '%'

s%f=                                  -- take a string 's' and a char 'f'
    ((:"&")=<<s)                      -- append a "&" to each char in 's'
    ++f:"\\\\"                        -- and append 'f' and two backslashes

Table header:

take n['a'..] % 'F'                   -- s: the first n letters from the alphabet
                                      -- f: char 'F'
Table content:

zipWith(%)                            -- apply '%' pairwise to
    mapM id$"01"<$[1..n]              -- all combinations of '0' and '1' of length n
    r                                 -- and the string 'r' 

Edycja: za pomocą \tabularzamiast \begin{tabular}(skradziony z odpowiedzi @ xnor ).

nimi
źródło
3

Python 2 , 192 168 166 bajtów

lambda n,l:r'\begin{tabular}{*%dc|c}%s\end{tabular}'%(n,r'\\'.join(map('&'.join,[map(chr,range(97,97+n))+[r'F\\\hline']]+[bin(2**n+i)[3:]+l[n]for i in range(2**n)])))

Wypróbuj online!

Wersja dość drukowana:

Python 2 , 234 229 218 209 205 203 bajtów

n,l=input()
print'\\begin{tabular}{'+'c'*n+'|c}\n'+' & '.join(chr(i+97)for i in range(n)+[-27]),'\\\\\n\hline'
i=0
for r in l:print' & '.join(bin(i)[2:].rjust(n,'0')+`r`),r'\\';i+=1
print'\\end{tabular}'

Wypróbuj online!

TFeld
źródło
2

Proton , 142 bajty

n=>x=>"\\tabular*#{n}c|c#{j(map(chr,97..97+n))}&F\\\\\hline"+'\\\\'.join(j(bin(i)[2to].zfill(n)+x[i])for i:0..len(x))+"\\endtabular"j="&".join

Wypróbuj online!

Dane wyjściowe są w postaci golfa LaTeX; dzięki xnor za tę sztuczkę!

To powinno być w stanie grać w golfa krótszą niż odpowiedź xnora na Python, ponieważ Proton teoretycznie nigdy nie powinien przegrać z Python lol (w praktyce jestem zły xD). Mogę ukraść niektóre sztuczki z Xnora; P

Udało mi się teraz być krótszym, zmieniając niektóre rzeczy w zmienne, co właśnie zauważyłem, że xnor też: P

I proszę, -6 bajtów, używając kilku sztuczek golfowych Proton.

HyperNeutrino
źródło
1

R , 196 187 171 bajtów

function(m,n){cat("\\tabular{*",n,"c|c}")
write(c(letters[1:n],"F\\\\\\hline",rbind(t(rev(expand.grid(rep(list(0:1),n)))),paste0(m,"\\\\")),"\\endtabular"),1,n+1,sep="&")}

Wypróbuj online!

Wyjście podobne do odpowiedzi na węgiel drzewny . expand.gridz tej odpowiedzi .

Dla przypomnienia, korzystanie xtablez pakietu eponimowego nie jest dużo krótsze, ponieważ oprócz określenia pakietu należy podać wiele opcji, aby dopasować specyfikację:

R 187 bajtów

function(m,n){u=rbind(apply(expand.grid(rep(list(0:1),n)),1,rev),m)
rownames(u)=c(letters[1:n],"F")
print(xtable(t(u),dig=0,align=c(rep("c",n+1),"|c}")),hl=0,include.r=F)}
library(xtable)

Wypróbuj online!

JayCe
źródło