Гольф кожного персонажа ASCII в 99


11

99 - мова програмування, яку я винайшов на початку цього тижня для свого завдання. Напишіть перекладача для 99 . (Винайдено, але ніколи не потрібно було його реалізовувати завдяки півдесятка з вас.;)) Повна специфікація мови в цьому виклику, тому я не намагаюся все це перекладати тут.

У 99 році ви можете надрукувати окремі символи ASCII для stdout, але через обмеження мови не завжди зрозуміло, як надрукувати певний символ якомога стисліше.

Для кожного з 128 символів ASCII напишіть програму 99, яка не займає введення та виводить цей єдиний символ. Ви можете кодувати будь-які або всі ці відповіді вручну, або ви можете написати іншу програму (будь-якою вашою мовою), щоб створити їх для вас.

Сума символів у кожній із ваших 128 99 програм - це ваша оцінка. Виграє найнижчий бал. Нові рядки вважаються одним символом.

Пам'ятайте, що в 99 лише змінні розміри, такі як 9999вихідні ASCII символи (змінні непарні розміри, виводять цілі числа). Їх значення ділиться на 9, а потім приймається мод 128, тому значення не потрібно знаходитись у певному діапазоні для відображення символів ASCII. Наприклад, внутрішні значення 297, 1449 та -855 всі відповідають символу, !оскільки коли вони діляться на 9 та приймають mod 128, вони стають 33, що є кодом символів !.

Якщо вам потрібен перекладач на 99 , я б запропонував відповідь Python Мака .

Я знаю, що сказав, що наступне моє завдання буде більш інтерактивним, але я все ще працюю над цим питанням.

Відповіді:


7

Одне завдання, 2075 р. (Оптимально)

Це повинно бути оптимальним значенням (якщо я не маю великих помилок в міркуванні або моє тестування відстійне).

Поперше. Є лише 7 різних чисел (мод 128), які можна виразити в 99. Усі значення 7 або більше 9 оцінюють на одне число 71. (Тому що 10 ^ 8 мод 128 == 0, 10 ^ 9 мод 128 == 0, ...)

Якщо одне з 4 значень ви можете виразити парним числом дев'яти, то виведення цього числа очевидно є оптимальним рішенням.

В іншому випадку я намагаюся досягти числа одним твердженням про призначення (призначити 99) і надрукувати 99. Як виявляється, максимальний розмір програми при такому підході становить 22 знаки. Очевидно, що використання Goto вимагає, безумовно, більше того. Єдина можливість побиття рішення з одним завданням - це рішення з двома призначеннями. Я перевірив це (сподіваюся, без помилок, код для цього досить безладний), і не знайшов рішення для жодної таблиці ASCII.

Тому для перевірки оптимального рішення повинно бути достатньо лише перевірки 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 char) має vertical tab - 11програму довжиною 2, знаки з найдовшими програмами (22 char) є bell - 7і A - 65.

Сума за всіма програмами - 2075.

І до речі, я використовував інтерпретатор k / q від tmartin . Я маю досить багато неприємностей з іншими (Python, Perl, CJam). Не впевнений, чи то я винен.


Це допоможе виконавцям перекладачів, якби ви могли описати, які у вас проблеми. Чудова відповідь.
coredump

3

Різноманітні методики, 42109

Для чисел, замість обчислення великого символу ASCII, я просто обчислив значення числа. Ви лише сказали, що зможете вивести персонажа, тому це все одно має працювати.

РЕДАКТУВАННЯ: Перемикайте числа для використання символів ASCII, тому нехтуйте цим. Я залишив оригінальний код номера в коді Java, але прокоментував його, якщо хтось захотів ним скористатися.

Деякі з них я робив вручну, більшість я просто написав програму, щоб набрати текст.

Вони складаються з 1-4 рядків кожен, тому вони досить дружні, щоб просто скопіювати та вставити в програму. Слід зазначити, що вони не працюють послідовно через те, що мій згенерований код не зберігає змінних станів.

Найпоширеніша методика, що використовується тут, була такою ж, як і підхід Орлпа:

Продовжуйте віднімати 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кінцем потрібно виправити.
Захоплення Кальвіна

Ага, добре, тоді я це виправлю за мить.
bloo

Слід виправити зараз, якщо я щось не пропустив. Я залишив початковий код, але прокоментував його, якщо хтось захотів використати такі номери. Пастебін також редагувався.
bloo

Чудово. Хоча для деяких я думаю, що ви могли щойно додати 99 999\n99(перепризначити 999його, 99щоб він надрукував як символ).
Захоплення Кальвіна

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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.