LaTeXの真理値表


11

論理関数からの出力のリストを受け入れ、その真理値表のLaTeXコードを出力するプログラムまたは関数を作成します。

入力には小文字のラベルを付けa-z、出力にはのラベルを付けますF。入力リストの長さは常により短くなり2^25ます。つまり、入力数は常に25未満になるため、入力名には小文字のアルファベットを使用できます。

入力

論理関数の出力を表す、n入力の数と2^n2進数の長さのリスト。

出力

その関数の真理値表を生成する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代わりに単純にputしますが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事前定義された変数から最初の文字を取得し、それらの間にs bを挿入してから、次の行に&追加して&F\\印刷\hlineします。

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

2番目の入力の文字をループします。それぞれについて、そのインデックスはlengthのバイナリに変換されq、文字は連結され、結果は&sで結合\\されて追加されます。結果の文字列は、暗黙的に別の行に出力されます。

⁰\endζ

を印刷し\endtabularます。(デバーボシファイヤがを挿入するのを忘れたため、これは単なるセパレータ¦です。)


2
このチャレンジが実際に設計されたものではないことを考えると、Charcoalが現在勝者であるのはちょっと印象的です。
エリックアウトゴルファー

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' 

編集:(@xnorの回答から盗まれた)の\tabular代わりに使用します。\begin{tabular}


3

Pythonの2192の 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)])))

オンラインでお試しください!

プリティ印刷版:

パイソン2234の 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に感謝します!

これはxnorのPythonの答えよりも短くすることができるはずです。なぜなら、Protonは理論的にはPythonを失うことは決してないからです(実際、私は悪いxDです)。私はxnorからいくつかのトリックを盗みます; P

いくつかのものを変数にすることで、短くすることができましたが、xnorでもそうであることに気付きました:P

そして、Protonゴルフトリックを使用して-6バイトに進みます。


1

R196187171バイト

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.