Переставляемый код боулинг


14

Code-Bowling Challenge

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


Оценка Панграм

  • Ваша оценка - это количество уникальных символов в вашем исходном коде.

    Программа с исходным кодом AJBбудет иметь оценку 3
    A, программа с исходным кодом AAJбудет иметь оценку 2
    A Программа с исходным кодом 111будет иметь оценку:1

  • Это вариант . Программа с самым высоким счетом выигрывает!

(Для вашего удобства здесь создан инструмент автоматического подсчета очков )


Правила вызова

  1. Входные данные
    Программа / функция может принимать входные данные, хотя это совершенно необязательно.

  2. Выходные данные
    Эти выходные данные могут быть любыми , но они должны быть ненулевыми, ненулевыми, непустыми и не содержать ошибок. (Для этого вывод должен быть не менее 1 байта)

  3. Перестановка
    Независимо от того, как перекомпонован исходный код, вывод должен быть одинаковым.

    Пример:
       Программа: ABJвыходы hello world, как это делает программы: [ AJB, JAB, JBAи т.д.]

Это вариант . Программа с наибольшим количеством символов выигрывает!


1
Без какой-либо конкретной задачи эта задача, на мой взгляд, слишком широка.
Деннис

2
Что значит не ноль?
Деннис

2
Хотя оценка вашей панграммы - это попытка заставить код играть в боулинг, я не уверен, что эти проблемы действительно должны быть помечены как код боулинг . Механизм скоринга весьма отличается от того, каким должен быть боулинг кода, поэтому я бы сказал, что используйте code-challenge или создайте новый тег.
Мартин Эндер

1
Я должен согласиться с Мартином. Например, эта задача не является кодом-гольфом. Как только вы забиваете что-либо, кроме общего количества символов (или байтов), это больше не вызов для боулинга
Натан Меррилл

3
Должна ли программа / функция заканчиваться? (например, могу ли я печатать 0вечно?)
MildlyMilquetoast

Ответы:


18

Lenguage, 1 112 064 баллов, если UTF-8

Моя программа состоит из всех возможных символов UTF-8. Он печатает «Hello world» и использует 1,75 * 1076 йоттабайт пространства.

(Чтобы сгенерировать программу, вам просто нужно сделать файл с 17498005810995570277424757300680353162371620393379153004301136096632219477184361459647073663110750484 символов, обеспечив, чтобы в файле содержался каждый возможный символ UTF-8)


2
Вы, сэр, гений. И подожди, почему мой компьютер ломается? : 'P
HyperNeutrino

Я думал, что Unicode имеет 1114112 символов?
MilkyWay90

14

Много языков, 2 балла

0.

Производит 0.0как 0.или .0. Требуется синтаксический разбор либеральных чисел, это нормально с десятичной точкой в ​​начале или конце, принимая 0 за отсутствующую целую или десятичную часть. 0000000.даст тот же счет.

Это также работает на следующих языках (в некоторых случаях с другим выводом, как указано):

  • Python REPL
  • Javascript REPL
  • MATLAB (производит ans = 0)
  • Октава (производит ans = 0)
  • MATL (производит 0)
  • CJam
  • Сетчатка (производит 0)
  • С накоплением (производит 0)

Я думаю, что для Python это единственный способ получить оценку выше 1, поскольку возможности могут быть исчерпаны.

  • Любой бинарный или унарный оператор потерпит неудачу как последний символ
  • Любой из них [](){}требует совпадения и потерпит неудачу, если первым будет заключительный
  • Вкладки или пробелы не могут начинать строку. Новые строки не могут быть использованы в REPL.
  • Не , может быть первым персонажем
  • #Помещен первый комментарий будет все , и производить не выход
  • Старт \- неверное продолжение строки
  • Backticks (Python 2) должны быть парными, а их отсутствие - ошибка
  • $, !, ?, И @не может быть использован без других непригодных символов

Это оставляет буквы, цифры _, .и котировки.

  • С кавычками любая не строковая строка вне их выдает ошибку.
  • Буквы с возможными цифрами и _именами переменных, какой-либо перестановки всегда не существует.

Листья цифры а .. Перестановка разных цифр дает другое число, если не все цифры 0. Так что я считаю нули и .это единственный способ получить счет выше 1. Но я плохо знаю лексер Python, так что я мог что-то упустить.


11

CJam , оценка 15

T U
V	LMOQR[]0q

Попробуйте онлайн!

Всегда печатает 0000:

  • 0 просто толкает ноль.
  • T, U, VЯвляются переменными , которые предварительно инициализирован в ноль.
  • L, M, O, Q, RЯвляются переменными , которые предварительно инициализируется в пустой список, так что они не отображаются на выходе.
  • [и ]может или не может обернуть вещи в списке, но они не должны быть сопоставлены правильно, и вывод все равно будет распечатан для печати.
  • q читает входные данные, которые являются пустыми и, следовательно, не отображаются в выходных данных.
  • перевод строки, пробел и табуляция игнорируются парсером.

Это отличный ответ для такого языка, как CJam! Ницца
Альберт Реншоу

Можно ли добавить строчную букву, rвыполнив что-то похожее на строчную q?
Альберт Реншоу

1
@AlbertRenshaw, вы не можете иметь их обоих, потому что в EOF произойдет ошибка.
Мартин Эндер

9

MATL , 3 5 6 баллов

Идея добавить пробел была взята из ответа Биджана .

lv
 T1

Код или любая его перестановка выводит три из них, разделенных символами новой строки.

Попробуйте онлайн!

объяснение

  • Функция lпо умолчанию помещает номер один в стек.
  • Literal 1делает то же самое.
  • Буквальные Tтолчки true, которые отображаются как номер один.
  • Пробел и перевод строки являются разделителями, и здесь ничего не делается.
  • vобъединяет весь стек до столбца-вектора. Например, vпосле того T, как первые два числа будут объединены в столбец (а затем будет выдвинут следующий номер). Инициал vбудет производить пустой массив.

В конце кода неявно отображается стек со следующими правилами:

  • Каждый элемент или массив в стеке отображается в отдельной строке.
  • Векторы столбцов отображаются с каждым элементом в отдельной строке.
  • Пустой массив не вызывает вывода.

Таким образом, любая перестановка входных символов производит 1три раза в разных строках.


Объяснение? Мне интересно, как это работает.
Товарищ SparklePony

@Sparkle Добавлено объяснение
Луис Мендо

Ницца! Также просто хотел отметить, что у меня был этот текст в конкурсе Removing any part of the source code however should cause that specific output to not be produced.на момент публикации, я не хотел его добавлять, и он был удален. Может быть, это поможет вам увеличить счет, возможно, немного
Альберт Реншоу

1
@AlbertRenshaw Спасибо за хедз-ап! Еще два очка
Луис Мендо

Я обвиняю тебя в краже моей идеи. Это не проблема, хотя.
Биджан

6

Желе , оценка 53 101

¶ ¤$¥&+ABDFHNPQSUVX^_aborv|®²×ȧȯḄḅḌḞḢḤḷṀṂṚṛṠṢṪẠạị«»()kquƁƇƊƑƘⱮƝƤƬƲȤɓɗƒɦƙɱɲƥʠɼʂƭʋȥẸẈẒẎŻẹḥḳṇọụṿẉỵẓḋėġṅẏ

Использование только символов, которые являются частью кодовой страницы Jelly .

Jelly имеет неявный ввод 0, и первая половина (вплоть до включительно ạị«») приведенной выше строки кода состоит в основном из монадических (верхний регистр) и диадических (нижний регистр и символы) атомов, которые при задании нуля или списка, содержащего только один ноль ( или два таких входа в случае диад) возвращают ноль или список, содержащий только один ноль.

Исключения:

  • Пробел: он игнорируется (даже если он находится в кодовой странице).

  • Стрелка разделяет ссылки (как и перевод строки - но это действительно тот же байт), но никакие другие байты не будут ссылаться на код перед ним в любом случае.

  • скарабей, ¤инструктирует парсер обрабатывать все, что осталось, начиная с nilad (или константы) как константу (и работает как первый атом).

  • Доллар, $поручите парсеру рассматривать две ссылки на него как монаду (и, что удивительно, работает как первый атом)

  • Yen, ¥аналогично, инструктирует синтаксический анализатор обрабатывать две ссылки на него как на диаду.

  • Рекомендованное, ®изначально, возвращает значение реестра 0(его копирайтное право), ©разрывается при использовании в качестве самого первого атома, так как арность находится из арности ссылки слева, которая еще не установлена).

Код из круглых скобок, (и так )далее, в настоящее время являются неиспользуемыми кодовыми точками, все они анализируются, и каждая вызывает новую цепочку (во многом как новая строка, хотя они не имеют эффекта создания вызываемых ссылок, как новая строка, но это не проблема здесь, поскольку ничто не пытается сделать это).


1
Вы можете добавить все символы вне кодовой страницы бесплатно, так как интерпретатор удаляет их перед обработкой кода. Я все еще не знаю, что означает не ноль.
Деннис

1
Я думаю, что дух вызова, вероятно, заключается в том, что персонажи должны быть на странице. Я спросил о не ноль, и ответ должен был указать минимальный вывод 1 байта.
Джонатан Аллан

@ Денис, есть идеи о правильной терминологии, что происходит с разбором в скобках?
Джонатан Аллан

Все неиспользуемые символы начинаются с новой ссылки, также как и с новой строки.
Денис

1
Давайте назовем их неопределенным поведением. : P
Деннис

4

TI-Basic (серия 83), 93 балла (99 на TI-84 Plus)

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZθnπeiAnsrandgetKeyZXsclZYsclXsclYsclXminXmaxYminYmaxTminTmaxθminθmaxZXminZXmaxZYminZYmaxZθminZθmaxZTminZTmaxTblStartPlotStartZPlotStartnMaxZnMaxnMinZnMinΔTblTstepθstepZTstepZθstepΔXΔYXFactYFactTblInputNI%PVPMTFVP/YC/YPlotStepZPlotStepXresZXresTraceStep

Все цифры, все однобайтовые переменные (включая θ и n , независимые переменные для полярного и последовательного построения графиков), константы π, е , и я , некоторые не совсем переменные ( Ans, randи getKey), и 59 отличаются переменные окна (все те, которые гарантированно будут определены).

Подразумеваемое умножение гарантирует, что результатом будет 0, если мы примем это в любом порядке. Если это выполняется на новом калькуляторе, все переменные будут 0; даже если нет, getKeyбудет 0, потому что нет времени нажимать клавишу до того, как программа вернет значение.

На TI-84 Plus или выше, мы можем получить больше 6 очков, добавляя маркеры getDate, getTime,startTmr , getDtFmt, getTmFmt, isClockOn. Результат теперь всегда будет {0 0 0}потому что getDateи getTimeвозвращает списки длины 3, и подразумеваемое умножение распределяется по элементам.

Я думаю, что это все возможные токены, которые можно использовать: любые фактические команды - это префикс, инфикс или постфикс (то есть они не будут работать в начале или конце программы), а любые другие переменные могут быть неопределенными (и вызывать ошибку, когда используемый).


Это умно. Не особенно впечатляет, ха-ха, но действительно умный! +1
Альберт Реншоу

3

(неконкурентный) Brainf-ck, 63 байта

Ну, я не знаю, считается ли это обманом, но ...

.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789

Точка печатает текущий символ (0x00), а остальные символы ничего не делают. Технически это можно расширить до бесконечности, поэтому, пожалуйста, дайте мне знать, если это считается мошенничеством.


Я бы посчитал, что выходной ноль
Альберт Реншоу

О, я должен удалить свой ответ или пометить его как не конкурирующий?
brianush1

1
Есть 97 набираемых символов, 7 из которых вы не можете использовать (8-1), поэтому я бы сказал, 90.
Биджан

@ brianush1 вы можете оставить его неконкурентоспособным, чтобы другие могли видеть. Я отредактирую вопрос немного дальше, чтобы объяснить, что вывод должен быть не менее 1 байта
Альберт Реншоу

15
@AlbertRenshaw (извините за все эти комментарии) Если выходные данные должны быть 1 байтом, то символ NULL должен считаться, так как он является байтом, хотя один со значением 0.
brianush1

3

Хаскелл, 3 очка

+ 1

Независимо от того, как реорганизован этот код, он всегда возвращает функцию, которая увеличивает ввод. Примеры использования в repl:

>(+ 1) 1
2
>(1+ ) 1  
2
>( +1) 1
2

2

√ å ı ¥ ® Ï Ø ¿ , 128 234 (?) Очка

Я прибыл в 128 234 с помощью @DestructibleLemon. Эта программа использует все символы Unicode (128,237) , за исключением o, Oи ł. Как ни странно, две из них являются выходными командами.

Конечно, ни один язык не может использовать все эти символы, верно? Ну, этот язык просто игнорирует команды, которые он не распознает. Проблема решена.

Этот язык по умолчанию выведет следующее:

===== OUTPUT =====



==================

которая не равна нулю, не равна нулю, не пуста и не содержит ошибок.

Примечание: если это нарушает какое-то неписанное правило, сообщите мне об этом в комментариях, и я изменю это. Если вы знаете мою оценку (при условии, что это разрешено), также оставляйте сообщения в комментариях.


Какой набор символов он использует? UTF 8? UTF-16? Использует ли он все Unicode?
Разрушаемый Лимон

@DestructibleLemon Глядя на страницу github, кажется, что для кодировки используется «CP-1252».
brianush1

@DestructibleLemon Все команды находятся в CP-1252 (Windows-1252), но он принимает любой символ Unicode в качестве допустимого синтаксиса.
caird coinheringaahing

По-видимому, есть 128 237 символов Юникода, так что у вас будет 128 234? en.wikipedia.org/wiki/Unicode#cite_note-24
Разрушаемый лимон

Согласно другим ответам, очевидно, есть 1112 064 юникода, так что я больше не уверен
Destructible Lemon

1

J, 3 байта

 1

Символы 1, пробел и перевод строки всегда будут печатать 1.


1

/// , 1 2 балла

\_

Попробуйте онлайн!

Я понятия не имею, как это сделать на любом другом языке, полном тьюринга. Конечно, есть HQ9, но это просто обманывает.

1 байт благодаря @Martin Ender.


это должно быть две точки, а не байты
Разрушаемый Лимон

@DestructibleLemon Извините, форматирование TIO.
Товарищ SparklePony

1

Точки , 1114111 символ (при использовании юникода).

<87 dots here> Every Unicode character except NUL and . here

Объяснение:

1                                           leading binary number
1010                                        010 increments the value under the pointer
1010111                                     111 prints out chr(1)

Таким образом, полученная двоичная строка 1010111, которая преобразована в десятичную, равна 87, поэтому нам нужно 87 точек.

Каждый другой символ является комментарием, поэтому мы используем каждый символ, кроме NUL, потому что Python3 прекращает чтение файла, и точку, потому что точки не являются комментариями.


0

прелюдия , оценка 1 112 051

(Если рассматривать только ASCII для печати [\t\n -~], оценка составляет 84. Если мы рассмотрим все кодовые точки Unicode , то оценка будет 1 112 051. )

!
" #$    %&'+,-./0:;<=>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

(затем добавьте все символы [\u{7f}-\u{10ffff}] после него.)

Всегда печатать 0 .


Prelude - это язык на основе параллельного стека, в котором стек предварительно заполнен бесконечными числами 0.

  • +: Вставьте два значения (всегда 0), добавьте их (0) и вставьте в стек.
  • -: Сложить два значения (всегда 0), вычесть их (0) и вставить в стек.
  • #: Вывести значение и отбросить его.
  • !: Вытолкнуть значение и вывести его в виде числа (всегда 0) (спецификация говорит «символ», но интерпретатор говорит «число»; в любом случае выводится байт)
  • 0: Толкает 0.
  • ^, v,V : Выталкивает верхнее значение предыдущих / следующих параллельных программ ( «голоса»), но штабеля всех «голоса» заполнены 0, поэтому они всегда нажмите 0.
  • другие персонажи: нет.

Поэтому нам нужно избегать только 13 символов:

  • (, ) : Непарная скобка вызовет ошибку
  • 1-9 : Мы только хотим вывести 0.
  • ?Мы не хотим ничего вводить.
  • *: Вызывает очень сложную проверку согласованности кода до и после строки, состоящей из одиночного *. Поэтому нам нужно либо удалить новую строку, либо удалить *. Эталонная реализация использует Python 2, .readline()который может означать \rили «новая строка» \n. Так что лучше просто удалить *.

0

Deadfish , оценка 86

o.ABCDEFGHIJKLMNOPQRSTUVWXYZabcefghjklmnpqrtuvwxyz?!|[]_-();'"*&^$#@!1234567890+=<>,/\:

Если это незаконно, то есть также

o

(оценка 1)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.