Chơi golf mọi nhân vật ASCII trong 99


11

99 là ngôn ngữ lập trình tôi đã phát minh ra vào đầu tuần này cho thử thách của tôi Viết một thông dịch viên cho 99 . (Được phát minh nhưng không bao giờ cần phải thực hiện nhờ một nửa tá bạn.)) Thông số ngôn ngữ đầy đủ nằm trong thử thách đó vì vậy tôi không buồn đăng lại tất cả ở đây.

Trong 99, bạn có thể in các ký tự ASCII riêng lẻ thành thiết bị xuất chuẩn, nhưng do các ràng buộc của ngôn ngữ, không phải lúc nào cũng rõ ràng làm thế nào để in một ký tự cụ thể càng chính xác càng tốt.

Đối với mỗi 128 ký tự ASCII, hãy viết chương trình 99 không có đầu vào và đầu ra ký tự duy nhất đó. Bạn có thể viết mã bất kỳ hoặc tất cả các câu trả lời này bằng tay hoặc bạn có thể viết một chương trình khác (bằng bất kỳ ngôn ngữ nào bạn muốn) để tạo chúng cho bạn.

Tổng số các ký tự trong mỗi chương trình 128 99 của bạn là điểm số của bạn. Điểm thấp nhất sẽ thắng. Dòng mới được tính là một ký tự.

Hãy nhớ rằng, trong 99 , chỉ các biến có kích thước chẵn như các 9999ký tự ASCII đầu ra (số nguyên đầu ra của biến có kích thước lẻ). Giá trị của chúng được chia cho 9 và sau đó lấy mod 128, vì vậy các giá trị không cần phải nằm trong một phạm vi nhất định để ánh xạ tới các ký tự ASCII. Ví dụ, các giá trị bên trong 297, 1449 và -855 đều tương ứng với ký tự !vì khi chúng được chia cho 9 và lấy mod 128, tất cả chúng trở thành 33, đó là mã ký tự cho !.

Nếu bạn cần một trình thông dịch cho 99 , tôi đề nghị câu trả lời Python của Mac .

Tôi biết tôi đã nói thử thách tiếp theo của tôi sẽ tương tác nhiều hơn nhưng tôi vẫn đang làm việc với những thứ đó.

Câu trả lời:


7

Một nhiệm vụ, 2075 (tối ưu)

Đây phải là giá trị tối ưu (trừ khi tôi có một lỗi lớn trong lý luận hoặc thử nghiệm của tôi tệ).

Đầu tiên. Chỉ có 7 số khác nhau (mod 128) bạn có thể biểu thị bằng 99. Tất cả các giá trị của 7 hoặc nhiều hơn 9 đánh giá cho cùng một số 71. (Vì 10 ^ 8 mod 128 == 0, 10 ^ 9 mod 128 == 0, ...)

Nếu một trong 4 giá trị bạn có thể biểu thị với số lượng chẵn thì hơn đầu ra con số này rõ ràng là giải pháp tối ưu.

Mặt khác, tôi cố gắng đạt được số bằng một câu lệnh gán (gán cho 99) và in 99. Vì hóa ra kích thước chương trình tối đa với cách tiếp cận này là 22 char. Rõ ràng sử dụng Goto chắc chắn sẽ nhiều hơn thế. Khả năng duy nhất là giải pháp một nhiệm vụ có thể bị đánh bại là một giải pháp có hai nhiệm vụ. Tôi đã thử nghiệm điều này (hy vọng không có lỗi, mã cho việc này khá lộn xộn) và không tìm thấy giải pháp nào cho bất kỳ char ASCII nào.

Do đó, chỉ kiểm tra 4 số trực tiếp và cách tiếp cận một bài tập là đủ để tìm ra giải pháp tối ưu. Chương trình Python (tương thích 2 và 3) sau đây tạo ra tất cả các chương trình và tính tổng độ dài của chúng. Nó sử dụng một cách tiếp cận IDA * đơn giản.

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))

Đầu ra có dạng sau:

....
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
....

Bạn có thể tìm thấy đầu ra hoàn chỉnh tại: http://pastebin.com/bKXLAArq

Char có chương trình ngắn nhất (2 char) vertical tab - 11có độ dài chương trình là 2, ký tự có chương trình dài nhất (22 char) là bell - 7A - 65.

Tổng số cho tất cả các chương trình là 2075.

Và nhân tiện, tôi đã sử dụng trình thông dịch k / q từ tmartin . Tôi ghét một số rắc rối với những người khác (Python, Perl, CJam). Không chắc đó là lỗi của tôi.


Nó sẽ giúp người thực hiện phiên dịch nếu bạn có thể mô tả những rắc rối bạn gặp phải. Câu trả lời chính xác.
coredump

3

Một loạt các kỹ thuật, 42109

Đối với các số, thay vì tính toán ký tự ASCII lớn, tôi chỉ tính giá trị của số. Bạn chỉ nói là có thể xuất ký tự, vì vậy điều này vẫn hoạt động.

EDIT: Chuyển đổi số để sử dụng các ký tự ASCII, vì vậy bỏ qua điều đó. Tôi đã để lại mã số gốc trong mã Java nhưng nhận xét trong trường hợp bất kỳ ai muốn sử dụng nó.

Một số trong số này tôi đã làm bằng tay, hầu hết tôi chỉ viết một chương trình để loại.

Chúng được tạo thành từ 1-4 dòng mỗi dòng, vì vậy chúng khá thân thiện để chỉ sao chép và dán vào một chương trình. Cần lưu ý rằng chúng không hoạt động liên tiếp do mã được tạo của tôi không bảo toàn các trạng thái biến.

Kỹ thuật phổ biến nhất được sử dụng ở đây cũng giống như phương pháp của orlp:

Tiếp tục trừ 9 từ 99, sau đó xuất ra.

Phiên bản của tôi khác bằng cách sử dụng một số trường hợp tùy chỉnh và soạn nhiều toán học chỉ trên một dòng. Các trường hợp tùy chỉnh chỉ là nơi nhân vật có thể được biểu diễn chỉ bằng một bó 9 và không có mã toán học hoặc mã thế hệ của tôi có thể được rút ngắn.

Chương trình

Tôi đã đặt đầu ra trên Pastebin cho những bạn không thích chạy chương trình:

http://pastebin.com/Cs6WZUfb

Mã Java tôi đã sử dụng:

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;
  }
}

Bạn phải thực sự xuất ký tự, không chỉ là số. Vì vậy, tất cả các chương trình với 999cuối cùng cần phải được sửa chữa.
Sở thích của Calvin

À, được rồi, tôi sẽ sửa nó ngay lập tức.
bloo

Nên sửa ngay bây giờ trừ khi tôi bỏ lỡ điều gì đó. Tôi đã để lại mã gốc nhưng nhận xét trong trường hợp ai đó muốn sử dụng các số như thế. Pastebin cũng được chỉnh sửa.
bloo

Tuyệt quá. Mặc dù đối với một số người tôi nghĩ bạn có thể vừa thêm 99 999\n99(để gán lại 999để 99nó sẽ được in dưới dạng ký tự).
Sở thích của Calvin

1

Phép trừ lặp lại, 65280

Một giải pháp tầm thường để so sánh với. Tiếp tục trừ 9 từ 99, sau đó xuất ra. Ví dụ cho ký tự ASCII 10:

99 99 9
99

Có 128 chương trình. Chương trình đầu tiên dài hai ký tự (99), mỗi ký tự sau đó dài hơn 8 ký tự (99 99 9 \ n) so với chương trình trước.

Các chương trình tạo chương trình Python được phân tách bằng các dòng trống và điểm số tính toán:

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

print(score)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.