Распечатать недостающие символы


18

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

Получив строку, состоящую только из печатаемых символов ( 0x20 to 0x7E), выведите на печать все печатаемые символы, которых нет в строке.

вход

Строка или массив символов, состоящий только из печатных символов ASCII

Выход

Каждый печатный символ ASCII отсутствует во входной строке в любом порядке.

Testcases

Input:  "Hello, World!"
Output: ""#$%&'()*+-./0123456789:;<=>?@ABCDEFGIJKLMNOPQRSTUVXYZ[\]^_`abcfghijkmnpqstuvwxyz{|}~"
========
Input:  "Hi!"
Output: " "#$%&'()*+,-./0123456789:;<=>?@ABCDEFGIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjklmnopqrstuvwxyz{|}~"
========
Input:  ""
Output: " !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
========
Input:  " !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
Output: ""

счет

Это код-гольф, поэтому побеждает меньше байтов на каждом языке


Если вы возвращаете массив, можем ли мы включить пустые элементы вместо используемых символов?
Лохматый

@ Шэгги, конечно, все в порядке
Skidsdev

@Rod не утекать мои планы D:
Skidsdev

Может ли вывод быть объектом Set строк символов? set( 'a', 'b', 'c' )
Брэд Гилберт b2gills

1
@MikhailV, только если ваш язык не может выводить символы ASCII
Skidsdev

Ответы:



6

Perl 6 , 29 байт

{[~] keys (' '..'~')∖.comb}

Обратите внимание, что результат является случайным, потому что Set s неупорядочены.

Проверь это

Expanded:

{
  [~]        # reduce using string concatenation
             # (shorter than 「join '',」)

  keys       # get the keys from the Set object resulting from the following

  (' '..'~') # Range of printable characters
            # Set minus (this is not \ )
  .comb      # split the input into individual characters
}

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



5

Japt , 14 байт

Ho#_dÃf@bX ¥J

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

Сохранено 4 байта благодаря Shaggy и obarakon


1
Нет необходимости в флаге (см. Ответ на мой комментарий к вопросу). Замените 127на, #чтобы сохранить один байт, и удалите, Uчтобы сохранить другой.
Лохматый

1
Вы можете использовать ¦и перегруппировать свои аргументы, чтобы сохранить несколько байтов. Также 127 можно укоротить TIO
Оливер

1
Получил до 14 байтов: ethproductions.github.io/japt/…
Shaggy

1
Нет, ты работаешь над этим, Том - как ты уже говорил, мне нужно научиться публиковать сообщения быстрее! : D
Лохматый

1
10-байтовая версия, но, к сожалению, не конкурирующая: ethproductions.github.io/japt/…
Shaggy


4

MATL , 5 байтов

6Y2X~

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

Спасибо Луису Мендо за игру в гольф на 8 байтов!

Объяснение:

   X~   % The symmetric set difference
6Y2     % Between all printable ASCII
        % And the input string (implicit)
        % Implicitly display

Разница симметричного набора даст каждый элемент, который присутствует ровно в одном из двух входных наборов. (но не оба). Это всегда даст правильный ответ, так как входной набор всегда будет подмножеством второго набора (все для печати ASCII).

Оригинальная версия:

32:126tGom~)c

Объяснение:

32:126          % Push the range 32-126
      t         % Duplicate it on the stack
       G        % Push the input
        o       % Convert it to character points
         m      % Is member (0 for each char that isn't in input, 1 for each char that is)
          ~     % Logical NOT
           )    % Take the truthy elements of this array from the previous array (All Printable ASCII)
            c   % Display as a string


3

JavaScript (ES6), 74 байта

Я уверен, что есть более короткий способ сделать это!

s=>[...Array(95)].map((_,y)=>s.includes(c=String.fromCharCode(y+32))?"":c)

Попытайся

let f=
s=>[...Array(95)].map((_,y)=>s.includes(c=String.fromCharCode(y+32))?"":c)
oninput=_=>o.innerText=f(i.value).join``
o.innerText=f(i.value="Hello, World!").join``
<input id=i><pre id=o>


1
Следует Array(95)включить пропавших без вести~
Маливиль

Это всегда было там, @Malivil? Мог поклясться, что последний персонаж был, }когда я это написал. Исправлено сейчас, спасибо.
Лохматый

Не могу поверить, что C # для этого короче, чем JavaScript, тем более, что мне приходится включать в себя мои слова.
TheLethalCoder

1
@TheLethalCoder, String.fromCharCodeэто мерзавец, вот почему! : D
Лохматый

@ Shaggy Я не знаю, я просто смотрел на твой код, чтобы увидеть, как он работает, и я набрал буквально каждый символ на своей клавиатуре и заметил, что ~ничего не изменилось, кроме того, что это было в спецификации. Также необходимо обновить часть «Попробуйте».
Маливиль

3

Баш ,47 43 40 байт

printf %x {32..126}|xxd -r -p|tr -d "$1"

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

Генерирует диапазон hexa, инвертирует шестнадцатеричный дамп в char и удаляет символы, присутствующие в первом параметре.


3

Октав, 22 20 байт

Благодаря @Luis Mendo сэкономлено 2 байта.

@(s)setxor(32:'~',s)

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

Другой ответ:

@(s)setdiff(' ':'~',s)

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


1
@(s)setxor(' ':'~',s)сохраняет 1 байт
Луис Мендо

@ LuisMendo Очень приятно! Но я думаю, что это совсем другое. Предлагаю вам опубликовать его как новый ответ :)
rahnema1

1
Нет, это действительно небольшое улучшение. Я буду рад, что вы отправите это, если хотите. Кстати, @(s)setxor(32:'~',s)кажется, тоже работает --- и тот же комментарий для этого :-)
Луис Мендо

1
@ LuisMendo Спасибо, я согласен, потому что (Луис) сказал.
rahnema1

2

PHP, 42 байта

Ввод как массив

Вывести в виде строки

<?=join(array_diff(range(" ","~"),$_GET));

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

PHP, 53 байта

Введите как строку

Вывести в виде строки

<?=join(array_diff(range(" ","~"),str_split($argn)));

заменить <?=joinс print_rна выходе , как массив

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


Возможно, вам стоит сделать версию PHP для гольфа: P
CalculatorFeline

@CalculatorFeline Я уверен, что существует, но это не очень хорошо
Йорг Хюльсерманн

Может быть, вы должны сделать хороший. Шаг 1: автоматический стартовый тег.
CalculatorFeline

@CalculatorFeline У меня есть поиск ссылки для вас. github.com/barkermn01/PGP-php-CodeGolf Я не заинтересован, чтобы сделать один
Йорг Хюльсерманн

1
@CalculatorFeline Превращение PHP в язык игры в гольф разрушает удовольствие от игры в гольф с PHP (по крайней мере, для меня): вы должны постоянно балансировать между вызовами функций (которые часто имеют длинные имена), использованием циклов, различных методов ввода и так далее. Step 1: automatic starting tagхорошо php -r... но, например, в этом примере он не платит, потому что echoон длиннее <?=.
Кристоф


2

Perl, 39 байт

s!.*!"pack(c95,32..126)=~y/$_//dr"!ee

Беги с perl -pe.


Я получаю сообщение об ошибке 'Bareword найден там, где ожидается оператор в (eval 1) строке 2, рядом с "y / Hello World! // dr" ", когда я запускаю это ...
Крис

Полная командная строка: echo 'Hello World!' | perl -pe 's!.*!"pack(c95,32..126)=~y/$_//dr"!ee'. Это работает для меня как на Perl v5.14 и v5.24.
Grimmy

Это Perl v5.10, который не работает ... Это должно быть изменение между 5.10 и 5.14.
Крис

2

мозговой трах , 120 байтов

+[+[>+<+<]>]>-[[>>]+[<<]>>-],[<+++++[>------<-]>-[>[>>]+[<<]>-]>[>>]<[-]<[-<<]>,]++++++++[->++++<]>[>[-<.>]<[->>+<<]>>+]

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

Облаченный:

+[+[>+<+<]>]>-[[>>]+[<<]>>-],[<+++++[>--
----<-]>-[>[>>]+[<<]>-]>[>>]<[-]<[-<<]>,
]++++++++[->++++<]>[>[-<.>]<[->>+<<]>>+]

Разъяснение:

+[+[>+<+<]>]>-         initialize what we will now consider cell 0 to 95
[[>>]+[<<]>>-]         initialize cells 2 4 etc 95*2 to 1; end on cell 0 at 0
,[                     main input loop (for each char of input)
  <+++++[>------<-]>-  subtract 31 from the input
  [>[>>]+[<<]>-]       lay a trail of (input minus 31) ones in the empty spaces
  >[>>]<[-]<[-<<]>     use the trail to clear the appropriate "print" flag
,]                     keep reading input until it ends
++++++++[->++++<]>     initialize the cell directly before flag 1 to 32
[                      we'll let the accumulator overflow; no harm done
  >[-<.>]              print the accumulator if the flag is still set
  <[->>+<<]>>+         shift over the accumulator and increment it
]


2

Рубин, 23 18 17 байт

->s{[*' '..?~]-s}

Использует лямбда-функцию в соответствии с комментариями @ sethrin.

Предыдущие версии:

[*' '..?~]-s.chars

(' '..'~').to_a-s.chars

Не sнужно ли либо читать из STDIN, либо предоставлять в качестве аргумента функции? Задача также указывает, что входные данные могут быть заданы в виде массива символов. Преобразование в стабильную лямбду и сброс charsдает 16-байтовое решение.
canhascodez

Я не был уверен, как следует обращаться к входу, учитывая, что он не был явно указан. Есть несколько других ответов, которые предполагают наличие входных данных в переменной. Есть ли соглашение по кодгольфу? Я не так много делаю.
Марк Томас

@sethrin С лямбдой с короткой стрижкой не было бы 20 символов? ->(s){[*' '..?~]-s)}
Марк Томас

Все скобки в вашей лямбде необязательны. Но я, возможно, пропустил байт. Другие языки либо принимают ввод неявно, либо stdinпривязаны к глобальной переменной. В Ruby $<есть сокращение, stdinно лямбды, как правило, короче. Соглашения о вводе и выводе здесь . Я тоже не так много делаю, так что если правила не те, о которых я думаю, дайте мне знать.
canhascodez

2

APL, 13 байт

⍞~⍨⎕UCS31+⍳95

Непосредственная:

       31+⍳95  ⍝ A vector 32 .. 126
   ⎕UCS        ⍝ as characters
 ~⍨            ⍝ without
⍞              ⍝ those read from character input.

1

R , 50 байтов

function(s)intToUtf8(setdiff(32:126,utf8ToInt(s)))

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

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


1

PHP, 53 байта

for($k=31;$k++<126;)~strstr($argn,$k)?:print chr($k);
# or
for($k=31;$k++<126;)echo~strstr($argn,$k)?"":chr($k);

Беги как труба с -r.


Я больше не оставляю игровую площадку
Йорг Хюльсерманн

@ JörgHülsermann Вы делаете. Вы просто должны поделиться этим.
Тит

1

C #, 74 71 байт

using System.Linq;s=>new int[95].Select((n,i)=>(char)(i+32)).Except(s);

Старая версия с созданием диапазона для 74 байтов:

using System.Linq;s=>Enumerable.Range(32,95).Select(n=>(char)n).Except(s);



1

C (gcc) , 75 72 70 68 50 байт

i;f(s){for(i=31;++i<127;strchr(s,i)?:putchar(i));}

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


Можете ли вы использовать ||эту работу на «стандартном» C?
Нил

@Neil Да || тоже работает. Не?: Часть "стандартного" C?
cleblanc

Я всегда думал, что это расширение GCC.
Нил

@Neil Это правильно. ?:это расширение GNU. Это работает также хорошо в Clang и TCC, хотя.
Деннис

1

Желе , 8 байт

Действительно 8 байтов? Пожалуйста, скажите мне, что я что-то пропустил!

32r126Ọḟ

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

Как?

32r126Ọḟ - Main link: list of characters s
32r126   - inclusive range from 32 to 126 = [32,33,...,125,126]
      Ọ  - cast ordinals to characters = list of printable characters
       ḟ - filter discard if in s

альтернативно

“ ~‘r/Ọḟ - Main link
“ ~‘     - code-page indexes = [32,126]
    r/   - reduce by inclusive range = [32,33,...,125,126]
      Ọ  - cast from ordinals to characters = list of printable characters
       ḟ - filter discard if in s

После этой задачи ØṖбыл введен новый атом, который возвращает все печатаемые символы ASCII , что делает следующую работу для 3 байтов:

ØṖḟ

Нет, ты ничего не пропустил.
Эрик Outgolfer

1

Древесный уголь , 18 15 10 8 байт

Fγ¿¬№θιι

Попробуйте онлайн! Ссылка на подробную версию кода. Редактировать: 3 байта сохранены, начиная с символов вместо целых чисел. Сохранено еще 5 байтов, когда я обнаружил недокументированную γпеременную, которая содержит печатные символы ASCII. Сохранены еще 2 байта, когда @ ASCII-только фиксированные предопределенные входные данные в подробном режиме (ответ остается в силе в том виде, в каком он есть, это всего лишь ссылка "Попробуй онлайн", которая не работала бы в то время).


8 байт (если предварительно не инициализированные входные данные не работали тогда)
только ASCII

@ ASCII-only Они не работали в подробном режиме ... они, вероятно, работали бы в кратком режиме, но мне нравятся подробные ссылки.
Нил

0

Mathematica, 35 байт

20~CharacterRange~126~Complement~#&

Анонимная функция. Принимает список символов в качестве ввода и возвращает список символов в качестве вывода.



0

shortC , 33 байта

i;AOi=31;++i<'~';strchr(*@,i)?:Pi

Преобразования, сделанные в этой программе:

  • A -> int main(int argc, char **argv) {
  • O -> for(
  • @ -> argv
  • P -> putchar
  • Автоматически вставленное закрытие ));}

Полученная программа выглядит так:

i;int main(int argc, char **argv){for(i=31;++i<'~';strchr(*argv,i)?:putchar(i));}

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



0

Clojure, 60 или 49 байтов

#(apply str(sort(apply disj(set(map char(range 32 127)))%)))

Эти "применения" убивают меня: / О, если возвращение списка в порядке, то это немного короче.

#(sort(apply disj(set(map char(range 32 127)))%))
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.