Таблиці правди LaTeX


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спокої ... І так, у цій таблиці всі пробіли та нові рядки необов’язкові, але я б уникав порожніх рядків.
Хеймдалл

Відповіді:


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. (Це просто роздільник, оскільки девербосифікатор відмовляється вставити ¦.)


3
Як ніби вражає те, що вугілля на сьогоднішній день є переможцем, враховуючи, що це завдання не є таким, для чого він призначений.
Erik the 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}, відповідно з цим Латекс гольф наконечника . Це *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, тому що Протон теоретично ніколи не повинен програти Python lol (на практиці я поганий xD). Я можу вкрасти деякі хитрощі у xnor; P

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

І ми ідемо, -6 байт, використовуючи кілька прийомів протонного гольфу.


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 з пакету епонімів не набагато коротше, оскільки потрібно вказати безліч варіантів, щоб відповідати специфікації, крім включення пакета:

R , 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.