Esprimi tutte le 16 funzioni booleane con l'operatore meno di


15

Esistono 16 funzioni booleane distinte per due variabili binarie, A e B:

A B | F0 | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | F13 | F14 | F15
-----------------------------------------------------------------------------------------
0 0 | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 0  | 1  | 1  | 1   | 1   | 1   | 1   | 1   | 1  
0 1 | 0  | 0  | 0  | 0  | 1  | 1  | 1  | 1  | 0  | 0  | 0   | 0   | 1   | 1   | 1   | 1  
1 0 | 0  | 0  | 1  | 1  | 0  | 0  | 1  | 1  | 0  | 0  | 1   | 1   | 0   | 0   | 1   | 1  
1 1 | 0  | 1  | 0  | 1  | 0  | 1  | 0  | 1  | 0  | 1  | 0   | 1   | 0   | 1   | 0   | 1   

L'operatore minore di <, che normalmente non è considerato un operatore logico come NOT, AND o OR, è in effetti una di queste funzioni (F4) quando applicata a valori booleani:

A B | A < B
-----------
0 0 | 0
0 1 | 1
1 0 | 0
1 1 | 0

È interessante notare che possiamo simulare una qualsiasi delle altre 15 funzioni usando espressioni che contengono solo i simboli ()<AB10. Queste espressioni vengono lette e valutate come in molti linguaggi di programmazione standard, ad esempio le parentesi devono corrispondere e <devono avere argomenti su entrambi i lati.

Nello specifico, queste espressioni devono rispettare la seguente grammatica (indicata in forma di Backus-Naur ):

element ::= A | B | 1 | 0
expression ::= element<element | (expression)<element | element<(expression) | (expression)<(expression)

Ciò significa che A<B<1non sono consentite inutili paretesi ed espressioni del modulo .

Quindi l'espressione A<Bcorrisponde alla funzione F4 e A<B<1deve essere cambiata in (A<B)<1o A<(B<1).

Per dimostrare che tutte le 15 altre funzioni possono essere trasformate in espressioni, è sufficiente formare un insieme di espressioni funzionalmente complete , perché quindi, per definizione, possono essere composte in espressioni per qualsiasi funzione.

Una di queste serie di espressioni è x<1(dove xè Ao B), che è ¬xe (((B<A)<1)<A)<1che è A → B. Negazione ( ¬) e implicazione ( ) sono noti per essere funzionalmente completi.

Sfida

Usando i caratteri ()<AB10, scrivi 16 espressioni nella forma sopra descritta che sono equivalenti a ciascuna delle 16 distinte funzioni booleane.

L'obiettivo è rendere ciascuna delle espressioni il più breve possibile. Il tuo punteggio è la somma del numero di caratteri in ciascuna delle tue 16 espressioni. Vince il punteggio più basso. Tiebreaker arriva alla prima risposta (a condizione che non abbiano modificato la loro risposta in seguito con espressioni più brevi prese da qualcun altro).

Tecnicamente non è necessario scrivere alcun codice reale per questo concorso, ma se hai scritto programmi per aiutarti a generare le espressioni, sei fortemente incoraggiato a pubblicarle.

Puoi utilizzare questo frammento di stack per verificare se le tue espressioni fanno ciò che è previsto:


8
-1, il problema è troppo semplice.
Isaacg,

2
Beh, immagino non abbia senso pubblicare un'altra risposta, quindi ecco il mio tentativo .
Sp3000,

7
@isaacg Hai ragione. Direi che è ben lungi dall'essere il concorso PPCG più semplice di sempre, ma il fatto che le risposte ottimali siano quasi identiche lo rende un po 'noioso come una competizione. Tuttavia, ho farlo credo che serve perfettamente bene come esercizio personale, soprattutto per le persone che non sono esperti di logica. Sono sicuro che almeno la metà delle persone su PPCG è qui per divertimento, non solo per vincere, altrimenti nessuno risponderebbe mai a una domanda con una proposta non vincente.
Calvin's Hobbies,

Probabilmente lo confronterei con la controversa pratica del golf . Questa è stata una domanda divertente e interessante, se un po 'facile.
Sp3000,

2
Se qualcuno è interessato, ecco 3 variabili. Le espressioni più lunghe corrispondono a (0, 0, 0, 1, 0, 1, 1, 0)e (0, 1, 1, 0, 1, 0, 0, 0).
Sp3000,

Risposte:


5

100 caratteri

0
(A<1)<B
B<A
A
A<B
B
((B<A)<((A<B)<1))<1
(A<(B<1))<1
A<(B<1)
(B<A)<((A<B)<1)
B<1
(A<B)<1
A<1
(B<A)<1
((A<1)<B)<1
1

9

Ci sono alcune opzioni per alcuni di questi, quindi questo set da 100 caratteri non è identico a quelli precedentemente pubblicati.

0
(B<A)<A
B<A
A
A<B
B
((A<B)<((B<A)<1))<1
(A<(B<1))<1
A<(B<1)
(A<B)<((B<A)<1)
B<1
(A<B)<1
A<1
(B<A)<1
((B<A)<A)<1
1

Una prova più semplice <funzionalmente completa sarebbe quella che A<(B<1)fornisce NOR.

Il codice che ho usato per trovare questo è una pesante semplificazione di alcuni codici di ottimizzazione booleani che ho usato nelle sfide precedenti, con due piccole modifiche:

  1. Fai in modo che il punteggio di un'espressione sia la lunghezza della sua stringa anziché il numero di operazioni.
  2. Fai in modo che la stringa eviti le parentesi non necessarie, per ridurre al minimo la lunghezza.
import java.util.*;

public class PPCG48193 {

    public static void main(String[] args) {
        Expr[] optimal = new Expr[16];
        int unfound = 16;

        PriorityQueue<Expr> q = new PriorityQueue<Expr>();
        q.offer(new Expr(0, "0"));
        q.offer(new Expr(15, "1"));
        q.offer(new Expr(3, "A"));
        q.offer(new Expr(5, "B"));
        while (unfound > 0) {
            Expr e = q.poll();
            if (optimal[e.val] != null) continue;

            optimal[e.val] = e;
            unfound--;
            for (Expr e2 : optimal) {
                if (e2 != null) {
                    Expr e3 = e.op(e2), e4 = e2.op(e);
                    if (optimal[e3.val] == null) q.offer(e3);
                    if (optimal[e4.val] == null) q.offer(e4);
                }
            }
        }

        for (Expr e : optimal) System.out.println(e.expr);
    }

    private static class Expr implements Comparable<Expr> {
        public final int val;
        public String expr;

        public Expr(int val, String expr) {
            this.val = val;
            this.expr = expr;
        }

        public Expr op(Expr e) {
            String l = expr.contains("<") ? String.format("(%s)", expr) : expr;
            String r = e.expr.contains("<") ? String.format("(%s)", e.expr) : e.expr;
            return new Expr((15 - val) & e.val, String.format("%s<%s", l, r));
        }

        public int compareTo(Expr e) {
            int cmp = expr.length() - e.expr.length();
            if (cmp == 0) cmp = val - e.val;
            return cmp;
        }
    }
}

Qual è il conteggio totale dei personaggi?
user253751

@immibis, 100 caratteri, uguale agli altri.
Peter Taylor,

"evita parentesi non necessarie, per minimizzare la lunghezza" no non le eviti in modo da accorciarle ma rispettare le regole.
Erik the Outgolfer,

@EriktheOutgolfer, non sono sicuro al 100% del tuo significato, ma la mia ipotesi migliore è che ti riferisci a " Ciò significa che A<B<1non sono consentite inutili paretesi ed espressioni del modulo . " In tal caso, controlla i timestamp: era una modifica effettuata dopo questa risposta.
Peter Taylor,

2

100 caratteri

0
(A<B)<B
B<A
A
A<B
B
((A<B)<((B<A)<1))<1
(B<(A<1))<1
B<(A<1)
(A<B)<((B<A)<1)
B<1
(A<B)<1
A<1
(B<A)<1
((A<B)<B)<1
1

1

100 caratteri

0
(A<1)<B
B<A
A
A<B
B
((A<B)<((B<A)<1))<1
((B<1)<A)<1
(B<1)<A
(A<B)<((B<A)<1)
B<1
(A<B)<1
A<1
(B<A)<1
((A<1)<B)<1
1

Ehi, non è esattamente lo stesso degli altri. Ho impiegato circa 10 minuti per questo, quindi vale la pena pubblicarlo comunque, anche se ha 2 anni.


0

100 caratteri

0
(A<1)<B
B<A
A
A<B
B
((A<B)<((B<A)<1))<1
(A<(B<1))<1
A<(B<1)
(A<B)<((B<A)<1)
B<1
(A<B)<1
A<1
(B<A)<1
((B<1)<A)<1
1
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.