99ですべてのASCII文字をゴルフ


11

99は、チャレンジのために今週初めに発明したプログラミング言語です。99のインタープリターを作成します。(発明されましたが、半ダースのおかげで実装する必要はありませんでした。))完全な言語仕様がその課題にあるため、ここですべてを再投稿することはありません。

では99あなたは、個々の印刷できるASCIIの stdoutに文字を、しかし、言語の制約のため、簡潔できるだけ特定の文字を印刷する方法を必ずしも明確ではありません。

128個のASCII文字のそれぞれについて、入力を一切行わず、その唯一の文字を出力する99プログラムを作成します。これらの回答の一部またはすべてを手作業でコーディングするか、別のプログラムを(好きな言語で)作成して生成することができます。

128 99の各プログラムの文字の合計がスコアです。最も低いスコアが勝ちます。改行は1文字としてカウントされます。

99では、9999出力ASCII文字(奇数サイズの変数は整数を出力)のようなサイズの変数のみを思い出してください。それらの値は9で除算され、mod 128で取得されるため、ASCII文字にマップするために値が特定の範囲内にある必要はありません。たとえば、内部値297、1449、および-855はすべて文字に対応し!ます!。これは、9で割ってmod 128を取得すると、すべて33になり、これがの文字コードであるためです。

99のインタープリターが必要な場合は、MacのPythonの回答をお勧めします

次の挑戦はもっとインタラクティブになると言ったのは知っていますが、私はまだその課題に取り組んでいます。

回答:


7

1つの割り当て、2075(最適)

これは最適な値である必要があります(推論に大きな誤りがない場合、またはテストで問題がある場合を除きます)。

まず第一に。99で表現できる7つの異なる数値(mod 128)のみがあります。7以上の9の値はすべて同じ数値71に評価されます(10 ^ 8 mod 128 == 0、10 ^ 9 mod 128 == 0、 ...)

4つの値のいずれかを9の偶数で表現できる場合、この数を出力することが明らかに最適なソリューションです。

それ以外の場合は、1つの割り当てステートメント(99に割り当て)で数値に到達して99を印刷しようとします。判明したように、このアプローチでの最大プログラムサイズは22文字です。明らかにGotoの使用にはそれ以上のものが必要です。1つの割り当てソリューションが破られる可能性がある唯一の可能性は、2つの割り当てを持つソリューションです。私はこれをテストし(うまくいけばエラーがなく、これのコードはかなり乱雑です)、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文字)のcharはvertical tab - 11プログラムの長さが2で、最長のプログラム(22文字)のcharはbell - 7and A - 65です。

すべてのプログラムの合計は2075です。

ところで、私はtmartinのk / qインタープリターを使用しました。私は他の問題(Python、Perl、CJam)とのかなりのトラブルを嫌っています。それが私のせいだったかどうかはわかりません。


あなたがどんな問題を抱えているかを説明できれば、通訳者の実装者に役立ちます。素晴らしい答え。
コアダンプ

3

さまざまなテクニック、42109

数値については、大きなASCII文字を計算する代わりに、数値の値を計算しました。あなたはキャラクターを出力できるとだけ言ったので、これはまだ動作するはずです。

編集:ASCII文字を使用するように番号を切り替えたので、無視してください。Javaコードに元の番号コードを残しましたが、誰かがそれを使用したい場合に備えてコメントアウトしました。

これらのいくつかは手作業で行いましたが、ほとんどはタイプするプログラムを書いただけです。

これらはそれぞれ1〜4行で構成されているため、プログラムにコピーして貼り付けるだけでもかなり使いやすいです。生成されたコードが変数の状態を保持していないため、連続して機能しないことに注意してください。

ここで使用される最も一般的な手法は、orlpのアプローチと同じでした。

99から9を引いて出力します。

私のバージョンは、いくつかのカスタムケースを使用し、多くの数学をたった1行で構成している点が異なります。カスタムケースは、文字を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、最後にすべてのプログラムを修正する必要があります。
カルビンの趣味

ああ、それでは申し分なく、すぐに修正します。
ブルー

何かを見逃さない限り、今すぐ修正する必要があります。私は元のコードを残しましたが、誰かがそのような数字を使いたい場合に備えてコメントアウトしました。Pastebinも編集されました。
ブルー

すごい。一部の人にとっては、追加したばかりだと思います99 999\n99(再割り当て99999て、キャラクターとして印刷します)。
カルビンの趣味

1

繰り返される減算、65280

比較する簡単なソリューション。99から9を引いて出力します。ASCII文字10の例:

99 99 9
99

プログラムは128個あります。最初のプログラムの長さは2文字(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.