Напишите программу, которая использует все печатные не алфавитно-цифровые символы ASCII


17

В частности, используйте каждый из этих символов хотя бы один раз в вашем исходном коде:

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

Символы внутри комментариев, строковых литералов, регулярных выражений (или любых других типов литералов и т. Д.) Не учитываются (но их разделители, такие как /**/или имеют ""значение).

Программа не должна выполнять никаких действий. Он просто должен скомпилировать и ничего не делать при запуске.

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

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

Обновление: выигрывает самый короткий код (помеченный как code-golf ). Как и предполагалось, нам, скорее всего, понадобятся некоторые критерии разрыва связей. Я полагаю, что, если есть ничья, побеждает тот, в котором символы ASCII выглядят как можно более упорядоченными. Формально: отфильтруйте первое вхождение каждого из перечисленных символов из программы. Это приведет к перестановке перечисленных символов. Программа с меньшим числом инверсий своей перестановки выигрывает.

Обновление: я был бы рад видеть некоторые / больше решений на обычных / основных языках, таких как C (++), Java, Scala, Haskell и т. Д.


1
Можем ли мы иметь литеральное исключение для символов, которые не появляются ни в одном ключевом слове, синтаксисе или операторе на определенном языке? То есть ни то, @%ни обратный удар не могут появляться в c, кроме как как часть литерала (в достаточно новых версиях c %может появляться в орграфах). (и #появляется только в директивах препроцессора, но нам просто придется с этим жить)? То есть, я прошу, чтобы подход Мэтта был явно законным.
dmckee

2
самый короткий код выигрывает? я подозреваю, что должны быть критерии разрыва
связей

1
В JavaScript, персонажей #, @и `не являются законными вне всякого рода буквального
Питер Олсон

6
В основном это соревнование «найди язык, который может использовать все эти символы в качестве синтаксиса». Довольно дерьмовый код золота на мой взгляд
Earlz

1
Да, я согласен с @Earlz, я думаю, что было бы лучше, если бы ему пришлось делать что-то полезное в арендованном объеме кода, чтобы люди не могли просто запутаться, чтобы получить все символы, но это не было бы решением ardnew. , Потому что в нынешнем виде вы не можете стать короче этого, плюс любой язык, на котором некоторые символы недопустимы вне литералов - как было указано несколькими людьми - немедленно дисквалифицируется. Это означает, что есть только несколько не только приемлемых ответов, но и период правильных ответов.
Райан

Ответы:


18

Brainf * ck, 32 символа

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

Распечатывает смайлик (если ваша консоль может выводить символ ASCII 1)

Да, решение Branf * ck, которое превосходит Golfscript! :П

Если вы настаиваете на отсутствии вывода, просто поменяйте +и .:

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

6
Хм ... Я бы сказал, что это скрывает символы в комментариях, ну да ладно.
перестал поворачивать против часовой стрелки

5
@leftaroundabout: Они не технически комментарии , потому что вы не можете использовать их , чтобы закомментировать действительные инструкции. Они обрабатываются как пробелы. Кстати, я согласен с вами, что это бесстыдное растяжение правил.
вс

3
@vsz Нет ничего плохого в нарушении правил.
Гарет

1
Инверсионный номер этого решения - 24, поэтому он является победителем по правилам. У меня есть некоторые сомнения по этому поводу, поскольку игнорирование символов очень близко к комментариям, но я бы сказал, что это плохо, я не думал об этой возможности при написании вопроса.
Петр Пудлак

1
@BodoThiesen Действительно, это довольно старое, я думаю, это также может претендовать на выигрышное решение, хотя это лучше, хотя и немного растягивает правила.
Петр Пудлак

47

Perl, 32 символа

нет скрытых символов в комментариях, строковых литералах или регулярных выражениях. использует все символы точно один раз.

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

Описание

я попытался указать приоритет оператора с отступом: самые правые выражения оцениваются раньше, чем их слева

        $`            # scalar variable $ named `
      <               # numeric less-than inequality <
        @"            # array variable @ named "
                      #   (array evaluated in scalar context)
    ^                 # bitwise XOR ^
        [(\{_},)]     # array reference [] 
                      #   containing array () 
                      #     containing reference \
                      #       to anonymous hash reference {}
                      #         with one key "_" 
                      #           and no value (nothing following comma ,)
                      #             (reference evaluated in scalar context)
      /               # numeric division /
        +-~%'         # unary addition +
                      #   and unary negation -
                      #     and bitwise complement ~
                      #       on hash variable % named '
                      #         (hash evaluated in scalar context)
  ?                   # ternary conditional operator ?:
    &|                # code reference variable & named |
  :                   # ternary conditional operator ?:
    ! *.              # logical negation !
                      #   on typeglob variable * named .
                      #     (typeglob evaluated in scalar context)
  =>                  # fat comma => for compound expression
                      #   (evaluates LHS as string, RHS is empty)
;                     # end of expression ;
#                     # start of comment #

Поправьте меня, если я ошибаюсь, но вы только что сделали скаляр с именем `<@"^[(\{_},)]/+-~%'?&|:!*.=>?
Мистер Лама

2
@GigaWatt нет, это последовательность нескольких различных выражений. я добавлю описание того, как это оценивается
ardnew

@GigaWatt: Нет; в Perl символьные идентификаторы представляют собой отдельные символы. Из такого рода вещи, я думаю , что эта программа использует только $`, @", %'и *.(скаляр, массив, хэш, и тип - глобу, соответственно), хотя это очень трудно быть уверенным. , ,
Руах

23
Либо вы гений, либо любая случайная последовательность байтов является допустимой программой Perl. Или оба.
Угорен

4
Хотя по моим собственным правилам я должен был присудить решение Brainfuck, это мое любимое (тот же размер, но номер инверсии 279).
Петр Пудлак

9

Пробел, 32

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

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


3
можно утверждать, что все непробельные символы являются комментариями, и это недопустимо :)
NRGdallas

8

Python 65

a=lambda x:0.
@a#
def _():{[`'"$?'`,]};a<a!=a+a%a&a^a-a*a|~a>a/a\

Я использовал символы ?и $внутри строкового литерала. Эти символы недопустимы вне строковых литералов или комментариев.


Это содержит неверный синтаксис. В частности, {[`'"$?'`,]}недопустимо, так как создает словарь с ключом без связанного значения. Вы можете сделать его действительным с помощью еще двух символов, например так:{[`'"$?'`,]:0}
Strigoides

1
@ Strigoides Нет, это делает набор не диктатом. но даже если бы это было так (ключ dict без значения) он запускается, что было требованием, а не допустимым синтаксисом. (для работы нужен python> = 2.7)
Matt

Я вижу, я использовал Python 2.6, когда я тестировал его.
Стригоидес

8

PHP, 32 символа

Возможно, это немного тролль, эта PHP-программа также является QUINE и использует все символы в точном порядке, в котором они перечислены.

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

Выполненный из командной строки, вывод будет просто содержимым файла, так как нет <?phpнеобходимости вызывать интерпретатор.

$ cat > a.php
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

$ php a.php
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

4
ИМХО, это нарушает символы внутри комментариев, строковые литералы, регулярные выражения (или любые другие виды литералов и т. Д.) Не учитываются , так как вся программа является одним литералом.
Петр Пудлак

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

Это даже не анализируется PHP, так что это в значительной степени недопустимо
Роб

@RobQuist, конечно, его анализируют, он занят поиском неуловимого токена T_OPEN_TAG вплоть до самого конца
Ли

7

Perl 6 (43 символа)

Давайте определим инфиксный оператор с довольно необычным именем:

sub infix:<!"#$%&'()*+,-./:;=?@[]^_´\|~>{}

Это не литерал и не литерал в RE или что-то скрытое в комментарии. Ты мне не веришь? Запуск следующей программы выдаст «2»:

sub infix:<!"#$%&'()*+,-./:;=?@[]^_´\|~>($a, $b){ $a + $b }
say 1 !"#$%&'()*+,-./:;=?@[]^_´\|~ 1;

Но я совершенно уверен, что вы, придурки, будете расширять правила дальше, чтобы исключить переопределение самого языка, чтобы мы, perl lubbers, были несчастны. :(


Я бы сказал, что это нормально, использование символов в идентификаторе кажется разумным.
Петр Пудлак

7

Хаскелл, 53

a@""#%&*+/?^b|a'<-a!!0=(\_->a`b`[]);main=do{print$1}

Мы можем сделать это немного короче

45

a'@""#%&*+/?!<|^b=(\_->1`b`[]);main=do{main}

Однако эта программа не завершается, и использует большее количество символов ( '!', '<', '|') во вновь определенного инфикс.


5

к (33 знака)

Очень легко в к. К сожалению, "должны быть в паре.

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

5

GolfScript (33 символа)

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

"должен быть в паре. Потребовалось немного проб и ошибок, чтобы заставить его ничего не выводить - большинство других позиций :'результата в некотором выводе.


5

J, 33 знака

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

' необходимо удвоить, чтобы избежать синтаксических ошибок.

В моем первом ответе отсутствовали некоторые символы.


5

С, 48 символов

Вид обмана.

#define _ ~''*+,-./:<=>?[]`|\
@%^$&!
main(){"";}

2
Определенно раздвигая границы «мошенничества», так как большинство из них появляются в невостребованном макросе. Как насчет #define Q(_) "##_##"... char*c=Q(~''*+,-./:<=>?[]| \); `. Ничего в строке, он просто конвертируется в один ... Конечно, это будет длиннее.
dmckee

@ dmckee, я не думаю, что ваше предложение более честное, чем мое. В обоих случаях проблемные символы не заканчиваются в коде. Я мог бы переместить большинство из них в код (как я сделал с "";), но $@и backtick кажутся безнадежными.
Угорен

Без сомнения, мой тоже грязный, закулисный и подлый. Но это тоже весело.
dmckee

@dmckee, веселье - вот о чем. Кстати, вам нужно #define Q(_) #_. Препроцессор будет обрабатываться "##_##"как строковый литерал.
Угорен

5

Постскриптум - 32 символа

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

В результате получается объект в стеке, но в остальном эффект не имеет. Postscript допускает использование практически любого символа в идентификаторе, за исключением тех, <>()[]{}/которые являются специальными синтаксическими формами и %которые вводят комментарий. Программа размечена как

{                  % start a procedure object
!"#$&'             % an identifier
()                 % an empty string
*+,-.              % an identifier
/:;=               % a symbol
<>                 % an empty hex string
?@                 % an identifier
[\]                % an array
^_`~|              % an identifier
}                  % close the procedure object
%                  % a comment

3

C # (91 символ)

#define a 
class a{static int @Main(){return(char)1.1*""[0]/1%1-1+1!=1?1:~1^1>>1<<1&1+'\0';}}

Насколько я знаю, символ $ не является допустимым символом вне строковых литералов, поэтому я не использовал его в своем ответе.

РЕДАКТИРОВАТЬ : Благодаря Питер Тейлор , я сократил код.


1
#if A... #endifкороче #region... #endregion. И "x"[0]+короче чем [System.STAThread].
Питер Тейлор

3

PowerShell (52 символа)

$_+=(@(1.1,1)[0]-1)*1/1%'1'::ToInt|&{!"">~\1}<#^#>`;

Мне пришлось поместить символ ^ в качестве строкового литерала, потому что, насколько я знаю, символ ^ не является допустимым символом PowerShell вне строковых литералов. Поправь меня, если я ошибаюсь.

Единственный способ, который я нашел в качестве символа :, это использовать оператор :: для вызова статического метода.


3

Схема, 41 символ

(define !$%&*+,-./:<=>?@[\]^_`{|}~ "#'");

Это использует невероятную терпимость Схемы для символов в именах переменных. В этой программе я создаю переменную с именем! $% & * +, -. /: <=>? @ [] ^ _ `{|} ~, Которую Схема с радостью принимает.


3

Tcl 37 символов

set {!#$%&'()*+,-./:<=>?@[]^\_`|~} ""

Определяет переменную !#$%&'()*+,-./:<=>?@[]^\_`|~с пустой строкой


3

C: 83 56 символов

#undef a
_;main($){$/=-+~!0|0^0%1,1<.0>0?'`':*&"@"[0];}\

Ат-знаки и обратные кавычки не являются частью разрешенного C-синтаксиса, поэтому я поставил их между кавычками.


1
Почему в скобках (b)? Это странный синтаксис и пустая трата символов.
Угорен

1
Если вы используете структуру для точки, 0.0гораздо короче.
Угорен

Как я мог не думать об этом (0,0)? Скобки являются остатком, когда они фактически сохранили один символ, но теперь они действительно не нужны. Спасибо @ugoren!
Форс

Я думаю main(_,$)спасет персонажа.
Угорен

А с помощью gcc вы можете писать x?:y, но это не стандартная C.
ugoren

2

Common Lisp, 33 символа

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

Основная часть вышеупомянутого оценивает (или, скорее, оценила бы, если бы не #+()перед ним) символ с именем:

!#$%&()*+,-./:;<=>?@[\]^_`{}~

Это #+(), чтобы избежать вывода. Я не уверен, что |foo|синтаксис для символов считается литералом, но символы используются как имена переменных / функций в Common Lisp, и есть несколько ответов, уже использующих необходимые символы в них.


2

Smalltalk (Squeak 4.x диалект) 38 символов

Реализуйте этот метод в Object, синтаксис действителен, если Preferences Allow подчеркивание (это настройка по умолчанию)

%&*+/<=>?@\!~y""^Z_([:z|{#'',$`;-y}]).

объявить Z как глобальную переменную во всплывающем меню, если он интерактивный

Пояснения:

  • % & * + / <=>? @! ~ - бинарный селектор (оператор)
  • у - параметр (операнд)
  • "" это пустой комментарий
  • ^ означает возврат
  • Z является глобальной переменной
  • _ это назначение
  • () разграничивает подвыражение
  • [: z |] разграничивает блок кода одним параметром z
  • {} ограничивает массив
  • # '' является литералом Symbol из пустой строки (первый элемент массива)
  • , является двоичным сообщением, отправленным на вышеуказанный символ
  • $ `является символьным литералом, используемым в качестве аргумента вышеупомянутого сообщения
  • ; предназначен для создания цепочки второго сообщения, отправленного тому же получателю символов # ''
  • второе сообщение -
  • у используется как второй аргумент сообщения
  • , для разделения следующей инструкции (здесь это последний период)

Блин, кто сказал, что Smalltalk читабелен?

Обратите внимание, что я не обманывал, единственный недопустимый символ `вставлен в буквальный символ. РЕДАКТИРОВАТЬ см. Ниже, это было ложное утверждение (по крайней мере, в Squeak)


Но мы можем сделать это до 34 символов с помощью этого трюка

%&*+,-/<=>?@\!~|y""^[{#(:_;`$')}].

На этот раз:

  • # () ограничивает буквенный массив
  • который содержит 4 буквенных символа: _; `и 1 буквенный символ $ '

Строго говоря, мы можем считать это мошенничеством ... Это не буквальная строка, но все же непустой литерал ...

Мне все еще нужно удвоить кавычку комментария "" (если я не сделаю буквенный символ с его помощью $ ", но затем мне нужно удвоить строковую кавычку '')
Мне все еще нужно использовать букву для параметра (_ не принимается, даже если мы устанавливаем предпочтения разрешить подчеркивание в селекторе на true).

Приятно, что мы можем даже запустить метод, например, отправить сообщение 1 с аргументом 2:

1%&*+,-/<=>?@\!~|2

РЕДАКТИРОВАТЬ Наконец в 35 символов без обмана

!%&*+,-/<=>?@`y""^[:x_|#()~$';\{}].

Примечания:

  • В настройках разрешено подчеркивание при включении селектора с помощью параметра блока с именем x_
  • `является допустимым символом для двоичного селектора вопреки тому, что я сказал
  • Я также использую $ ', чтобы избежать удвоения цитаты

1

R: 108 символов

a=new(setClass("a",representation(b="list")));a@b=list(c_d=1:2);if(1!='\t'&.1%*%1^1>a@b$c[1]/1|F){`~`<-`?`}#

Очевидно, что это самая длинная отправка, но чтобы иметь возможность использовать символы @и $в R, нам нужно создать объект, который имеет слоты (индексированные с помощью @) и именованные элементы (индексированные с помощью $).
Самое короткое решение, о котором я мог подумать, - это создать новый класс object ( a=new(setClass("a",representation(b="list")))), который берет свое. В противном случае, исходите из классики, которые не нуждаются в объяснениях (например !=, #или 1:2),

`~`<-`?` 

создает новый оператор, который делает то же самое, что и оператор ?(т. е. вызывает страницу справки предшествующего ему элемента).

%*%вычисляет внутреннее произведение двух матриц (здесь 1^1и .1).
Символ _ничего не делает (AFAIK) в R, но обычно используется в именах переменных или функций, как это имеет место здесь.


1

TI-Basic, 36

:End:#$%&'()*+.-/;>=<?@[\]^_`{|}~,!"

Это недопустимо, потому что начальная цитата часто используется для комментариев.
Tyzoid

@ Tyzoid Я переместил это до конца.
Timtech

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