99에서 모든 ASCII 문자를 골프


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에 대한 통역사가 필요하다면 Mac의 Python answer을 제안 합니다.

내가 알고 내가 말한 나의 다음 도전은 더 상호 작용하는 것하지만, 난 여전히 하나의 물건에 일하고 있어요.

답변:


7

과제 1 개, 2075 (최적)

이것은 추론에 큰 오류가 있거나 테스트가 짜증나 지 않는 한 최적의 값이어야합니다.

가장 먼저. 99로 표현할 수있는 7 개의 다른 숫자 (mod 128) 만 있습니다. 7 이상의 9의 모든 값은 같은 숫자 71로 평가됩니다. (10 ^ 8 mod 128 == 0, 10 ^ 9 mod 128 == 0, ...)

4 개의 값 중 하나를 짝수로 표현할 수있는 경우이 숫자를 출력하는 것보다 최적의 솔루션이됩니다.

그렇지 않으면 하나의 할당 문으로 번호에 도달하고 (99로 할당) 99를 인쇄하려고 시도합니다.이 방법으로 최대 프로그램 크기는 22 자입니다. 분명히 Goto를 사용하는 것은 그 이상을 필요로합니다. 하나의 할당 솔루션이 이길 수있는 유일한 가능성은 두 가지 할당이있는 솔루션입니다. 나는 이것을 테스트하고 (오류없이 코드를 작성하면 상당히 지저분하다) ASCII 문자에 대한 해결책을 찾지 못했습니다.

따라서 최적의 솔루션을 찾기 위해서는 4 개의 직접 숫자와 1- 할당 방식 만 확인하면 충분합니다. 다음 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입니다.

그리고 저는 tmartink / q 인터프리터를 사용했습니다 . 나는 다른 것들 (Python, Perl, CJam)과 상당히 어려움을 겪습니다. 그것이 내 잘못인지 확실하지 않습니다.


어떤 문제가 생겼는지 설명 할 수 있으면 통역가에게 도움이됩니다. 좋은 대답입니다.
coredump 2015 년

3

다양한 기술, 42109

숫자의 경우 큰 ASCII 문자를 계산하는 대신 숫자 값을 계산했습니다. 당신은 문자를 출력 할 수 있다고 말했기 때문에 여전히 작동합니다.

편집 : ASCII 문자를 사용하도록 숫자를 전환 했으므로 무시하십시오. Java 코드에 원래 숫자 코드를 남겨 두었지만 다른 사람이 사용하려는 경우 주석 처리했습니다.

이 중 일부는 손으로 직접 작성했으며 대부분 입력하기위한 프로그램을 작성했습니다.

이들은 각각 1-4 줄로 구성되어 있으므로 프로그램에 복사하여 붙여 넣는 것이 매우 친숙합니다. 변수 상태를 유지하지 않는 생성 된 코드로 인해 연속적으로 작동하지 않습니다.

여기에 사용 된 가장 일반적인 기술은 orlp의 접근 방식과 동일합니다.

99에서 9를 계속 빼고 출력합니다.

내 버전은 일부 사용자 지정 사례를 사용하고 많은 수학을 한 줄에 작성하여 다릅니다. 커스텀 케이스는 문자를 단지 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 's Hobbies

아, 그럼, 곧 고칠 게요.
bloo

내가 뭔가를 놓치지 않으면 지금 수정해야합니다. 나는 원래 코드를 그대로 두었지만 누군가가 그런 숫자를 사용하기를 원한다면 주석을 달았습니다. Pastebin도 편집되었습니다.
bloo

큰. 일부 사용자에게는 방금 추가 할 수 있다고 생각하지만 99 999\n99(재 할당 999하여 99문자로 인쇄 할 수 있습니다).
Calvin 's Hobbies

1

뺄셈 반복, 65280

비교할 사소한 솔루션입니다. 99에서 9를 계속 빼고 출력합니다. 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.