Напишіть програму, яка використовує всі друковані не буквено-цифрові символи ASCII


17

Зокрема, використовуйте кожен із цих символів принаймні один раз у своєму вихідному коді:

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

Символи всередині коментарів, рядкових літералів, регулярних виразів (або будь-яких інших типів літералів тощо) не враховуються (але їх роздільники, такі як /**/ чи ""не рахуються).

Програма не повинна виконувати жодних дій. Він просто повинен компілювати і нічого не робити під час запуску.

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

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

Оновлення: найкоротший виграш коду (позначений як код-гольф ). Як передбачається, нам, швидше за все, знадобляться деякі критерії вимикання. Я пропоную, що якщо є нічия, то виграшним є той, у якому символи ASCII відображаються настільки упорядкованими, наскільки це можливо. Формально: відфільтруйте перше виникнення кожного із перерахованих символів з програми. Це призведе до перестановки перелічених символів. Програма з меншою числом інверсії перестановки виграє.

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


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

2
виграє найкоротший код? я підозрюю, що для цього також повинні бути критерії розриву,
квітня 12.12

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

6
Це в основному змагання "знайти мову, яка може використовувати всі ці символи як синтаксис". На мою думку, досить
шалене

1
Так, я погоджуюся з @Earlz, я думаю, що було б краще, якби це зробило щось корисне, в кількості оренди коду, таким чином люди не могли просто заграти, щоб отримати всіх символів, але це не було б рішенням ardnew . Тому що в такому випадку ви не можете скоротити це, а будь-яка мова, де деякі символи не є дійсними поза літералами - як це вказували кілька людей - моментально дискваліфікується. Це означає, що існує лише кілька не тільки прийнятних відповідей, але й правильних відповідей.
Райан

Відповіді:


18

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

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

Друкує смайлик (якщо ваша консоль може вивести символ ASCII 1)

Так, рішення Branf * ck, яке б'є Гольфскрипт! : P

Якщо ви наполягаєте на відсутності результатів, просто обміняйте +та .:

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

6
Гм ... Я б краще сказати, що це приховує персонажів у коментарях, але так добре.
перестали повертати проти годинникових годинник

5
@leftaroundabout: Вони технічно не коментують, оскільки ви не можете використовувати їх для коментування дійсних інструкцій. Вони обробляються як пробіли. До речі, я згоден з вами, що це безсоромне розтягнення правил.
vsz

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 ні, це послідовність кількох різних виразів. я додам опис того, як це оцінюється
вдень

@GigaWatt: Ні; в Perl символічні ідентифікатори - це всі одиничні символи. З такого роду речі, я думаю , що ця програма використовує тільки $`, @", %'і *.(скаляр, масив, хеш, і тип - Глобу, відповідно), хоча це дуже важко бути впевненим. . .
ruakh

23
Або ви геній, або будь-яка випадкова послідовність байтів є дійсною програмою Perl. Або і те й інше.
угорен

4
Хоча за власними правилами мені довелося нагородити рішення Brainfuck, цей мій улюблений (однаковий розмір, але інверсія № 279).
Петро Пудлак

9

Пробіл, 32

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

всі символи без пробілів ігноруються, тому це насправді порожня програма


3
можна стверджувати, що всі символи без пробілів - це коментарі, і це недійсно :)
NRGdallas

8

Пітон 65

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

Я використав символи ?і$ всередині рядка-літералу. Ці символи не є законними поза рядковими літералами чи коментарями.


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

1
@Strigoides nope, це робить набір не диктом. але навіть якщо це було так (ключ dict без значення), він працює, що було вимогою, а не сильним синтаксисом. (для роботи вам потрібен python> = 2.7)
Метт

Я бачу, я використовував python 2.6, коли тестував його.
Strigoides

8

PHP, 32 символи

Ймовірно, трохи троля, ця програма PHP також є QUINE , і використовує всі символи в тому порядку, в якому вони перераховані.

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

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

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

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

4
IMHO це порушує символи всередині коментарів, рядкові літерали, регулярні вирази (або будь-які інші види літералів тощо) не враховуються , оскільки вся програма є одним літералом .
Петро Пудлак

Крім того, програма, яка вимагається завданням, нічого не повинна виводити, і є лише одна квітка, яка нічого не дає.
Paŭlo Ebermann

Він навіть не розбирається PHP, тому це в значній мірі недійсне
Роб

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

7

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

Давайте визначимо оператора інфіксації з досить незвичною назвою:

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

Це не буквений, ані буквальний текст у ПЗ чи що-небудь приховане в коментарі. Ви мені не вірите? Запуск наступної програми виведе "2":

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

Але я впевнений, що ви, азотники, поширите правила далі, щоб виключити переосмислення мови, щоб зробити нас нещасними. :(


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

7

Хаскелл, 53

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

Ми можемо зробити це трохи коротшим

45

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

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


5

k (33 символи)

Дуже легко в к. На жаль, "треба спарити.

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

5

GolfScript (33 символи)

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

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


5

J, 33 символи

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

' потрібно подвоїти, щоб уникнути помилок синтаксису.

У моїй першій відповіді були відсутні деякі символи.


5

C, 48 символів

Вид обману.

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

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

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

У цьому немає жодних сумнівів, моє також кривдне, непохитне і підступне. Але це теж весело.
dmckee

@dmckee, весело - це про що. До речі, вам потрібно #define Q(_) #_. Препроцесор розглядав би "##_##"як рядковий буквал.
угорен

5

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

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

Результати в об'єкті на стеку, але в іншому випадку не мають ефектів. Постскрипт допускає практично будь-які символи в ідентифікаторі, за винятком <>()[]{}/яких є спеціальні форми синтаксису та %які вносять коментар. Програма є токенізованою як

{                  % 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';}}

Наскільки я знаю, $ символ не є дійсним символом поза рядковими літералами, тому я не використовував його у своїй відповіді.

EDIT : Завдяки Пітеру Тейлору я скоротив код.


1
#if A... #endifкоротше #region... #endregion. І "x"[0]+коротше, ніж [System.STAThread].
Пітер Тейлор

3

PowerShell (52 символи)

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

Мені довелося поставити символ ^ як строковий буквал, тому що, наскільки я знаю, символ ^ не є легальним символом PowerShell поза рядковими літералами. Виправте мене, якщо я помиляюся.

Єдиний спосіб, який я знайшов, щоб вписатись у : znak - використовувати оператор :: для здійснення виклику статичним методом.


3

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

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

Це використовує неймовірну толерантність схеми до символів змінних імен. У цій програмі я створюю змінну з ім'ям! $% & * +, -. /: <=>? @ [] ^ _ `{|} ~, Яку Схема з радістю приймає.


3

Tcl 37 символів

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

Визначає змінну !#$%&'()*+,-./:<=>?@[]^\_`|~з порожнім рядком


3

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

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

At-знаки та backticks не є частиною дозволеного C-синтаксису, тому я ставлю їх між лапками.


1
Чому дужки в (b)? Це дивний синтаксис і розтрата персонажів.
угорен

1
Якщо ви використовуєте структуру для точки, 0.0це набагато коротше.
ugoren

Як я не міг про це думати (0,0)? Дужки - це залишок часу, коли вони насправді врятували один символ, але тепер вони справді непотрібні. Дякую @ugoren!
Форс

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

І з gcc можна писати x?:y, але це не стандартно C.
ugoren

2

Лист звичайний, 33 символи

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

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

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

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


2

Маленький розмов (скрип 4.x діалект) 38 символів

Реалізуйте цей метод в Object, синтаксис дійсний, якщо налаштування дозволяють присвоїти підкреслення (що є типовим параметром)

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

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

Пояснення:

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

Чорт, хто сказав, що Smalltalk читається?

Зауважте, що я не обдурив, єдиний недійсний символ `вводиться в буквальний символ. EDIT дивіться нижче, це було помилковим твердженням (принаймні, у Скріпі)


Але ми можемо зменшити до 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, нам потрібно створити об'єкт, який має слоти (індексовано за допомогою @) та названі елементи (індексовано за допомогою $).
Найкоротшим рішенням, про який я міг придумати, було створення нового класу об'єкта ( a=new(setClass("a",representation(b="list")))), який приймає своє значення. В іншому випадку виберіть від класиків, які не потребують пояснень (наприклад !=, #або 1:2),

`~`<-`?` 

створює нового оператора, який робить те саме, що і оператор ?(тобто він викликає сторінку довідки елемента, якому він передує).

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


1

TI-Basic, 36

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

Це невірно, оскільки початкова цитата часто використовується для коментарів.
Тизоїд

@Tyzoid Я перемістив його до кінця.
Timtech

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