เล่นกอล์ฟทุกตัวละคร ASCII ใน 99


11

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

ใน99คุณสามารถพิมพ์อักขระ ASCIIแต่ละรายการไปยัง stdout ได้ แต่เนื่องจากข้อ จำกัด ของภาษาจึงไม่ชัดเจนว่าจะพิมพ์อักขระเฉพาะอย่างรัดกุมที่สุดเท่าที่จะทำได้

สำหรับอักขระ 128 ASCII แต่ละตัวให้เขียนโปรแกรม99โปรแกรมที่ไม่มีอินพุตและเอาต์พุตที่เป็นอักขระตัวเดียว คุณสามารถเขียนคำตอบเหล่านี้ด้วยตนเองหรือเขียนโปรแกรมอื่น (ในภาษาที่คุณชอบ) เพื่อสร้างคำตอบให้คุณ

ผลรวมของตัวละครในแต่ละโปรแกรม128 99ของคุณคือคะแนนของคุณ คะแนนต่ำสุดชนะ ขึ้นบรรทัดใหม่นับเป็นหนึ่งอักขระ

โปรดจำไว้ว่าใน99ตัวแปรที่มีขนาดเท่ากันเช่น9999อักขระ ASCII ของเอาต์พุต (ตัวแปรขนาดคี่จำนวนเต็มที่ส่งออก) ค่าของพวกเขาจะถูกหารด้วย 9 และจากนั้นนำมา mod 128 ดังนั้นค่าไม่จำเป็นต้องอยู่ในช่วงที่แน่นอนในการแมปกับอักขระ ASCII ยกตัวอย่างเช่นค่าภายใน 297, 1449 และ -855 ตรงทุกตัวละคร!เพราะเมื่อพวกเขาโดยแบ่งเป็น 9 และนำ mod 128 พวกเขาทั้งหมดกลายเป็น 33 !ซึ่งเป็นรหัสอักขระสำหรับ

หากคุณต้องการล่ามสำหรับ99ผมขอแนะนำให้แม็คคำตอบหลาม

ฉันรู้ว่าฉันกล่าวว่าความท้าทายต่อไปของฉันจะเป็นแบบโต้ตอบได้มากขึ้น แต่ฉันยังคงทำงานกับสิ่งนั้นอยู่

คำตอบ:


7

หนึ่งการมอบหมาย, 2075 (เหมาะสมที่สุด)

นี่ควรเป็นค่าที่ดีที่สุด (เว้นแต่ฉันจะมีข้อผิดพลาดใหญ่ในการให้เหตุผลหรือการทดสอบของฉัน sucks)

ก่อนอื่นเลย มีเพียง 7 หมายเลขที่แตกต่างกัน (mod 128) คุณสามารถแสดงเป็น 99 ค่าทั้งหมด 7 หรือมากกว่า 9 ประเมินเป็นหมายเลขเดียวกัน 71 (เพราะ 10 ^ 8 mod 128 == 0, 10 ^ 9 mod 128 == 0, ... )

หากหนึ่งใน 4 ค่าที่คุณสามารถแสดงออกด้วยจำนวนเก้าแม้การส่งออกจำนวนนี้เป็นทางออกที่ดีที่สุดอย่างชัดเจน

มิฉะนั้นฉันพยายามที่จะไปให้ถึงจำนวนที่มีหนึ่งคำสั่งมอบหมาย (มอบหมายให้ 99) และพิมพ์ 99 เพราะปรากฎขนาดโปรแกรมสูงสุดด้วยวิธีนี้คือ 22 ถ่าน การใช้ Goto ชัดเจนยิ่งกว่านั้นแน่นอน ความเป็นไปได้เพียงอย่างเดียวที่อาจมีการเอาชนะโซลูชันที่ได้รับมอบหมายเดียวคือโซลูชันที่มีสองการมอบหมาย ฉันทดสอบนี้ (หวังว่าจะไม่มีข้อผิดพลาดรหัสสำหรับสิ่งนี้ค่อนข้างยุ่ง) และไม่พบวิธีแก้ปัญหาสำหรับ ASCII char ใด ๆ

ดังนั้นการตรวจสอบเฉพาะหมายเลข 4 โดยตรงและวิธีการกำหนดหนึ่งเดียวควรเพียงพอที่จะค้นหาโซลูชันที่เหมาะสมที่สุด โปรแกรม Python (เข้ากันได้ 2 และ 3) ต่อไปนี้สร้างโปรแกรมทั้งหมดและสรุปความยาวของมัน ใช้วิธีการ IDA * แบบง่าย

from itertools import count

def nines_to_dec(nines):
    return ((10**nines - 1) // 9) % 128

def shortest_representation(ascii_value):
    # try simple output,
    # max code length is 8, (8 nines == 10 nines == 12 nines == ...)
    # if this works, than this is the shortest representation

    for nines in range(2, 9, 2):
        if nines_to_dec(nines) == ascii_value:
            return "9" * nines

    # otherwise try one assignment
    for length in count(1):
        result = assignment(ascii_value, length, [])
        if result:
            return "99 " + result + "\n99"

def assignment(value, left, nines_list):
    if left == 0:
        eval_numbers = [nines_to_dec(nines) for nines in nines_list]

        if (sum(eval_numbers[::2]) - sum(eval_numbers[1::2])) % 128 == value:
            return " ".join("9" * nines for nines in nines_list)
        else:
            return False

    for nines in range(1, 8):
        left2 = left - nines - 1 # -1 for space
        if left2 >= 0:
            result = assignment(value, left2, nines_list + [nines])
            if result:
                return result

    return False

lengths = []
for i in range(128):
    program =shortest_representation(i)
    lengths.append(len(program))
    print("ASCII-value: {}, ASCII-char: {}".format(i, chr(i)))
    print(program)

print(sorted(lengths))
print(sum(lengths))

ผลลัพธ์เป็นรูปแบบต่อไปนี้:

....
ASCII-value: 65, ASCII-char: A
99 9 999999 9999999
99
ASCII-value: 66, ASCII-char: B
99 9 99 9999 99
99
ASCII-value: 67, ASCII-char: C
99 9 99 9 99 9999
99
....

คุณสามารถค้นหาผลลัพธ์ที่สมบูรณ์ได้ที่: http://pastebin.com/bKXLAArq

ถ่านกับโปรแกรมที่สั้นที่สุด (2 ถ่าน) เป็นvertical tab - 11ที่มีความยาวโปรแกรมของ 2, ตัวอักษรที่มีโปรแกรมที่ยาวที่สุด (22 ถ่าน) เป็นและbell - 7A - 65

ผลรวมสำหรับโปรแกรมทั้งหมดคือ 2075

และโดยวิธีการที่ผมใช้ล่าม k / q จาก tmartin ฉันหมวกค่อนข้างมีปัญหากับคนอื่น (Python, Perl, CJam) ไม่แน่ใจว่ามันเป็นความผิดของฉันหรือไม่


มันจะช่วยผู้ดำเนินการของล่ามหากคุณสามารถอธิบายปัญหาที่คุณมี คำตอบที่ดี
coredump

3

เทคนิคที่หลากหลาย, 42109

สำหรับตัวเลขแทนที่จะคำนวณอักขระ ASCII ขนาดใหญ่ฉันแค่คำนวณค่าของตัวเลข คุณบอกว่าจะสามารถส่งออกตัวละครเท่านั้นดังนั้นสิ่งนี้ยังคงทำงาน

แก้ไข: เปลี่ยนตัวเลขเพื่อใช้อักขระ ASCII ดังนั้นไม่ต้องสนใจ ฉันทิ้งรหัสต้นฉบับไว้ในโค้ด Java แต่ใส่ความคิดเห็นในกรณีที่ใครก็ตามที่ต้องการใช้

สิ่งเหล่านี้ที่ฉันทำด้วยมือส่วนใหญ่ฉันเพิ่งเขียนโปรแกรมเพื่อพิมพ์ออกมา

สิ่งเหล่านี้ประกอบด้วย 1-4 บรรทัดแต่ละรายการดังนั้นพวกเขาจึงค่อนข้างเป็นมิตรเพียงแค่คัดลอกและวางลงในโปรแกรม ควรสังเกตว่าพวกเขาไม่ทำงานอย่างต่อเนื่องเนื่องจากรหัสที่สร้างขึ้นของฉันไม่รักษาสถานะตัวแปร

เทคนิคที่พบมากที่สุดที่ใช้ที่นี่เป็นเช่นเดียวกับวิธีการของ orlp:

ทำการลบ 9 จาก 99 จากนั้นออกผลลัพธ์

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

โปรแกรม

ฉันใส่ผลลัพธ์ลงไปใน Pastebin สำหรับคนที่ไม่รู้สึกว่ากำลังใช้งานโปรแกรม:

http://pastebin.com/Cs6WZUfb

ฉันใช้รหัส Java:

public class AsciiGen99 {

  public static void main(String[] args) {
    long totalsize = 0;
    for (int i = 0; i < 128; i++) {
      System.out.println("\n The program for ASCII code " + i + " is as follows:\n");
      String yea = find(i);
      if (yea != null) {
        System.out.println(yea);
        totalsize += yea.length();
      } else {
        String v = "99 9 9\n9 99 9";
        if (i != 0) {
          v += "\n99";
          for (int j = 0; j < i; j++) {
            v += " 99 9";
          }
        }

        v += "\n99";

        System.out.println(v);
        totalsize += v.length();
      }
    }
    System.out.println(totalsize);
  }

  public static String find(int i) {
    switch (i) {
      case '\0':
        return "99 9 9\n99";
      case '\1':
        return "99 9\n99";
    }
//    if (48 <= i && i <= 57) {
//      switch (i) {
//        case '0':
//          return "9 9 9\n9";
//        case '1':
//          return "9";
//        case '2':
//          return "999 9 9\n9 999 9\n999 999 9 999 9\n999";
//        case '3':
//          return "999 9 9\n9 999 9\n999 999 9 999 9 999 9\n999";
//        case '4':
//          return "999 9 9\n9 999 9\n999 999 9 999 9 999 9 999 9\n999";
//        case '5':
//          return "999 9 9\n9 999 9\n999 999 9 999 9 999 9 999 9 999 9\n999";
//        case '6':
//          return "99 9 9\n9 99 9\n999 99 9 99 9 99 9 99 9 99 9 99 9\n999";
//        case '7':
//          return "99 9 9\n9 99 9\n999 99 9 99 9 99 9 99 9 99 9 99 9 99 9\n999";
//        case '8':
//          return "99 9 9\n9 99 9\n999 99 9 99 9 99 9 99 9 99 9 99 9 99 9 99 9\n999";
//        case '9'://ironic
//          return "99 9 9\n9 99 9\n999 99 9 99 9 99 9 99 9 99 9 99 9 99 9 99 9 99 9\n999";
//      }
//    }
    int x, a;
    for (x = 0; x < 100000; x++) {
      a = i + 128 * x;
      String s = "" + a*9;
      if (containsOnly9(s) && (s.length() & 1) == 0) {
        return ("" + (a * 9));
      }
    }

    return null;
  }
  public static boolean containsOnly9(String s) {
    for (char c : s.toCharArray()) {
      if (c != '9' && c != ' ' && c != '\n' && c != '\r' && c != '\t') {
        return false;
      }
    }
    return true;
  }
}

คุณต้องเอาท์พุทตัวละครไม่ใช่แค่ตัวเลข ดังนั้นโปรแกรมทั้งหมดที่มี999ในตอนท้ายจะต้องได้รับการแก้ไข
งานอดิเรกของ Calvin

อ่าไม่เป็นไรฉันจะแก้ไขมันในไม่ช้า
Bloo

ควรได้รับการแก้ไขแล้วเว้นแต่ฉันจะพลาดบางอย่าง ฉันทิ้งรหัสเดิมไว้ แต่ให้ความเห็นในกรณีที่มีคนต้องการใช้ตัวเลขเช่นนั้น Pastebin ก็แก้ไขได้เช่นกัน
bloo

ยิ่งใหญ่ แม้ว่าสำหรับบางคนฉันคิดว่าคุณสามารถเพิ่มได้99 999\n99(เพื่อมอบหมายใหม่999เพื่อ99ให้มันพิมพ์ออกมาเป็นตัวละคร)
งานอดิเรกของ Calvin

1

การลบซ้ำหลายครั้ง, 65280

ทางออกเล็กน้อยในการเปรียบเทียบกับ ทำการลบ 9 จาก 99 จากนั้นออกผลลัพธ์ ตัวอย่างอักขระ ASCII 10:

99 99 9
99

มี 128 โปรแกรม โปรแกรมแรกคือความยาวสองตัวอักษร (99), แต่ละอันหลังจากนั้นคือ 8 ตัวอักษร (99 99 9 \ n) ที่ยาวกว่าตัวอักษรก่อนหน้า

โปรแกรมการสร้างโปรแกรม Python คั่นด้วยบรรทัดว่างและคะแนนการคำนวณ:

score = 0
for n in range(128):
    program = "99 99 9\n" * n + "99"
    score += len(program)
    print(program + "\n")

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