แสดงฟังก์ชั่นบูลีนทั้ง 16 รายการด้วยตัวดำเนินการที่น้อยกว่า


15

มีฟังก์ชั่นบูลีน 16 แบบสำหรับตัวแปรไบนารีสองแบบคือ A และ 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   

ตัวดำเนินการที่น้อยกว่า<ซึ่งตามปกติจะไม่คิดว่าเป็นตัวดำเนินการเชิงตรรกะเช่น NOT, AND หรือ OR เป็นจริงหนึ่งในฟังก์ชันเหล่านี้ (F4) เมื่อใช้กับค่าบูลีน:

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

ที่น่าสนใจที่เราสามารถจำลองการใด ๆของฟังก์ชั่นอื่น ๆ 15 ()<AB10ใช้นิพจน์ที่มีเพียงสัญลักษณ์ นิพจน์เหล่านี้อ่านและประเมินผลเช่นเดียวกับในภาษาการเขียนโปรแกรมมาตรฐานเช่นวงเล็บต้องจับคู่และ<ต้องมีอาร์กิวเมนต์ในแต่ละด้าน

โดยเฉพาะนิพจน์เหล่านี้ต้องเป็นไปตามไวยากรณ์ต่อไปนี้ (ระบุในรูปแบบ Backus-Naur ):

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

ซึ่งหมายความว่าA<B<1ไม่อนุญาตให้มีparethes และนิพจน์ในแบบฟอร์มที่ไร้ประโยชน์

ดังนั้นการแสดงออกA<Bตรงกับ F4 ฟังก์ชั่นและA<B<1ต้องมีการเปลี่ยนแปลงไปหรือ(A<B)<1A<(B<1)

เพื่อพิสูจน์ว่า 15 ฟังก์ชันอื่น ๆ สามารถเปลี่ยนเป็นนิพจน์ได้ก็เพียงพอที่จะสร้างชุดของนิพจน์ที่สมบูรณ์ตามหน้าที่เพราะจากนั้นตามนิยามแล้วฟังก์ชันเหล่านั้นสามารถประกอบเป็นนิพจน์สำหรับฟังก์ชันใด ๆ

หนึ่งชุดดังกล่าวของการแสดงออกเป็นx<1(ที่xเป็นAหรือB) ซึ่งเป็น¬xและซึ่งเป็น(((B<A)<1)<A)<1 A → Bการปฏิเสธ ( ¬) และการอนุมาน ( ) เป็นที่ทราบกันว่าสมบูรณ์ตามหน้าที่

ท้าทาย

ใช้อักขระ()<AB10เขียน 16 นิพจน์ในรูปแบบที่อธิบายไว้ข้างต้นซึ่งเทียบเท่ากับฟังก์ชันบูลีนที่แตกต่างกัน 16 รายการ

เป้าหมายคือทำให้แต่ละนิพจน์สั้นที่สุดเท่าที่จะทำได้ คะแนนของคุณคือผลรวมของจำนวนอักขระในแต่ละ 16 นิพจน์ของคุณ คะแนนต่ำสุดชนะ Tiebreaker ไปที่คำตอบแรกสุด (หากพวกเขาไม่ได้แก้ไขคำตอบในภายหลังด้วยการแสดงออกสั้นลงจากคนอื่น)

คุณไม่จำเป็นต้องเขียนโค้ดจริงสำหรับการแข่งขันครั้งนี้ แต่อย่างใด แต่ถ้าคุณเขียนโปรแกรมใด ๆ เพื่อช่วยคุณในการสร้างการแสดงออกคุณควรโพสต์ข้อความเหล่านั้น

คุณสามารถใช้กองย่อยนี้เพื่อตรวจสอบว่าการแสดงออกของคุณทำสิ่งที่คาดหวัง:


8
-1 ปัญหาง่ายเกินไป
isaacg

2
ดีผมคิดว่ามีจุดโพสต์ไม่มีอีกคำตอบดังนั้นนี่คือความพยายามของฉัน
Sp3000

7
@isaacg คุณพูดถูก ฉันว่ามันไกลจากการประกวด PPCG ที่ง่ายที่สุดเท่าที่เคยมีมา แต่ความจริงที่ว่าคำตอบที่ดีที่สุดจะเหมือนกันเกือบทั้งหมดทำให้มันน่าเบื่อเหมือนกับการแข่งขัน แต่ผมไม่คิดว่ามันจะทำหน้าที่อย่างสมบูรณ์ดีเช่นการออกกำลังกายส่วนบุคคลโดยเฉพาะอย่างยิ่งสำหรับคนที่ไม่ได้เป็นผู้เชี่ยวชาญในตรรกะ ฉันแน่ใจว่าอย่างน้อยครึ่งหนึ่งของผู้คนใน PPCG อยู่ที่นี่เพื่อความสนุกไม่ใช่เพื่อที่จะได้รับชัยชนะหรืออื่น ๆ ไม่มีใครที่จะตอบคำถามด้วยการส่งที่ไม่ชนะ
งานอดิเรกของ Calvin

ผมอาจจะเปรียบเทียบกับการโต้เถียงฝึกกอล์ฟ นี่เป็นคำถามที่สนุกและน่าสนใจถ้าเป็นเรื่องง่าย
Sp3000

2
หากใครสนใจนี่คือ 3 ตัวแปร การแสดงออกที่ยาวที่สุดตรงตามลักษณะที่และ(0, 0, 0, 1, 0, 1, 1, 0) (0, 1, 1, 0, 1, 0, 0, 0)
Sp3000

คำตอบ:



9

มีตัวเลือกไม่กี่ตัวเลือกเหล่านี้ดังนั้นชุด 100 อักขระนี้ไม่เหมือนกับชุดที่โพสต์ก่อนหน้านี้

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

หลักฐานที่ง่ายกว่าที่ทำให้การ<ใช้งานสมบูรณ์นั้นคือA<(B<1)NOR

รหัสที่ฉันใช้ในการค้นหานี้เป็นการลดความซับซ้อนของรหัสการเพิ่มประสิทธิภาพ Boolean บางอย่างที่ฉันเคยใช้กับความท้าทายก่อนหน้านี้โดยมีการเปลี่ยนแปลงเล็กน้อยสองประการ:

  1. ทำให้คะแนนของนิพจน์เป็นความยาวของสตริงแทนที่จะเป็นจำนวนของการดำเนินการ
  2. ทำให้สตริงหลีกเลี่ยงวงเล็บที่ไม่จำเป็นเพื่อลดความยาว
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;
        }
    }
}

จำนวนตัวละครทั้งหมดคืออะไร?
user253751

@immibis, 100 chars เหมือนกับที่อื่น ๆ
Peter Taylor

"หลีกเลี่ยงวงเล็บที่ไม่จำเป็นเพื่อลดความยาว" ไม่ให้คุณหลีกเลี่ยงเพื่อให้สั้นลง แต่จะปฏิบัติตามกฎ
Erik the Outgolfer

@EriktheOutgolfer ฉันไม่แน่ใจ 100% ว่าคุณหมายถึงอะไร แต่สิ่งที่ฉันคาดเดาได้ดีที่สุดก็คือคุณกำลังอ้างถึง " ซึ่งหมายความว่าA<B<1ไม่อนุญาตให้มีความผิดทางเพศและการแสดงออกของแบบฟอร์ม " หากเป็นเช่นนั้นให้ตรวจสอบเวลา: การแก้ไขที่ทำหลังจากคำตอบนี้
Peter Taylor

2

100 ตัวอักษร

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 ตัวอักษร

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

เฮ้มันไม่เหมือนกับคนอื่น ๆ ฉันใช้เวลาประมาณ 10 นาทีในเรื่องนี้ดังนั้นมันจึงคุ้มค่ากับการโพสต์แม้ว่าจะมีอายุ 2 ปีก็ตาม


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