Латексные таблицы истинности


11

Напишите программу или функцию, которая принимает список выходов из логической функции и выводит код LaTeX для своей таблицы истинности.

Входные данные должны быть помечены как строчные буквы a-z, а выходные данные должны быть помечены как F. Длина списка входов всегда будет короче 2^25, что означает, что количество входов всегда будет меньше 25, поэтому вы можете использовать буквы из строчных букв для имен входов.

вход

Число nвходов и список длины 2^nдвоичных чисел, которые представляют собой выходы логической функции.

Выход

LaTeX-код, который создает таблицу истинности для этой функции. Входные и выходные значения должны быть центрированы в строках. Между заголовком таблицы и ее значениями, а также между входами и выходами должна быть строка, поэтому код должен быть таким, как показано ниже.

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

пример

Входные данные:

2
[0, 0, 0, 1]

Выход:

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

Который при отображении в LaTeX показывает следующую таблицу истинности

Таблица правды

Основные правила


3
Требуется ли для этой задачи точно такой же вывод или любой вывод, который может дать то же самое в TeX?
TSH

2
Любой вывод, который производит то же самое в TeX
drobilc

2
Здесь я нахожу хитроумным, не зная TeX, хорошо то, что могут быть другие более короткие способы написания таблицы, форматирующей код TeX, или даже какой-то другой способ (пакет?) Для создания таблицы. Какой бы язык я не использовал, TeX Golf - часть проблемы. Существует ли онлайн-переводчик для TeX для удобства и, возможно, чтобы сделать однозначную точную реализацию?
xnor

1
Совет: Код TeX, кажется, работает со всеми удаленными пробелами и символами новой строки.
xnor

1
Любой, кто не знает, как это сделать в LaTeX, следуйте приведенному выше примеру. Если n = 5, просто поставить cccccвместо cc, но оставить в |cпокое ... И да, в этой таблице все пробелы и новые строки являются необязательными, но я бы избегал пустых строк.
Heimdall

Ответы:


10

Древесный уголь , 70 байт

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

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

≔tabularζ

Сохраните эту строку в переменной, чтобы избежать дублирования.

\ζ{*θc|c}⸿

Выведите начальную \tabular{*2c|c}строку (2 или любое другое значение, которое qимеет первый вход ).

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

Получите первые qбуквы из предопределенной переменной bи вставьте &s между ними, затем добавьте &F\\и также напечатайте \hlineв следующей строке.

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

Цикл по символам во втором входе. Для каждого его индекс преобразуется в двоичный файл с длиной q, символ объединяется, результат объединяется с &s и \\добавляется. Результирующие строки неявно печатаются на отдельных строках.

⁰\endζ

Распечатать \endtabular. (Это просто разделитель, поскольку девербозатор не позволяет вставлять ¦.)


2
Впечатляет то, что Charcoal в настоящее время является победителем, учитывая, что этот вызов на самом деле не предназначен для этого.
Эрик Outgolfer

6

Python 2 , 153 байта

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

Попробуйте онлайн!

Выходы как

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

\tabularи \endtabularиспользуются как более короткие \begin{tabular}и \end{tabular}, согласно этому наконечнику гольфа LaTeX . Это *2cсокращение для определения 2 столбцов.


5

Haskell, 164 155 байт

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"]

Попробуйте онлайн!

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' 

Изменить: использовать \tabularвместо \begin{tabular}(украдено из ответа @ xnor ).


3

Python 2 , 192 168 166 байт

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)])))

Попробуйте онлайн!

Довольно печатная версия:

Python 2 , 234 229 218 209 205 203 байта

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

Попробуйте онлайн!


2

Протон , 142 байта

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

Попробуйте онлайн!

Выход в гольф LaTeX форме; спасибо xnor за этот трюк!

Это должно быть в состоянии быть короче, чем ответ Python xnor, потому что Proton теоретически никогда не должен проигрывать Python lol (на практике я плохой xD). Я могу украсть некоторые уловки у xnor; P

Теперь мне удалось стать короче, превратив некоторые вещи в переменные, что, как я только что заметил, xnor также сделал: P

И вот, 6 байт, мы используем некоторые трюки Proton для игры в гольф.


1

R , 196 187 171 байт

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="&")}

Попробуйте онлайн!

Вывод похож на ответ древесного угля . expand.gridиз этого ответа .

Напомним, использование xtableиз пакета eponym не намного короче, поскольку необходимо указать множество параметров, соответствующих спецификации, в дополнение к включению пакета:

р 187 байт

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)

Попробуйте онлайн!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.