ตารางความจริงของ 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 เป็นส่วนหนึ่งของความท้าทาย มีล่ามออนไลน์สำหรับ 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พิมพ์ ( ตัวแยกนี้เป็นตัวแยกส่วนในกรณีที่ตัว deverbosifier ลืมที่จะใส่ a ¦)


3
มันช่างน่าประทับใจที่ Charcoal เป็นผู้ชนะในปัจจุบันเนื่องจากความท้าทายนี้ไม่ใช่สิ่งที่ออกแบบมาสำหรับมัน
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}ตามคำแนะนำ 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 ได้เพราะในทางทฤษฎีแล้วโปรตอนไม่ควรแพ้ 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จากแพคเกจ eponym นั้นไม่ได้สั้นนักเนื่องจากต้องระบุตัวเลือกจำนวนมากเพื่อให้ตรงกับข้อมูลจำเพาะนอกเหนือจากการรวมแพ็คเกจด้วย:

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)

ลองออนไลน์!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.