Друк відсутніх символів


18

Простий виклик, натхненний популярністю мого попереднього невидимого тексту для друку та надрукування справжніх невидимих ​​текстових викликів, а також однаковий рядковий виклик однакової довжини .

З огляду на рядок, що складається лише з символів для друку ( 0x20 to 0x7E), друкуйте кожен символ, який можна надрукувати, не присутній у рядку.

Вхідні дані

Рядок або масив символів, що складається лише з символів, що друкуються ASCII

Вихідні дані

Кожен ASCII символ для друку, який не присутній у вхідному рядку, в будь-якому порядку.

Тестові шафи

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

Оцінка балів

Це код-гольф, тому виграє найменше байтів на кожній мові


Якщо повертається масив, чи можемо ми включити порожні елементи замість використаних символів?
Кудлатий

@Shaggy впевнений, це добре
Skidsdev

@Rod не протікайте в моїх планах D:
Skidsdev

Чи може висновок бути заданим об'єктом рядків символів? set( 'a', 'b', 'c' )
Бред Гілберт b2gills

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

Відповіді:



6

Perl 6 , 29 байт

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

Зауважте, що результат є випадковим, оскільки множина s не має порядку.

Перевірте це

Розширено:

{
  [~]        # 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 байти завдяки Шаггі та Обаракону


1
Не потрібно прапорця (див. Відповідь на мій коментар до питання). Замініть 127на, #щоб зберегти байт, і видаліть, Uщоб зберегти інший.
Кудлатий

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


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це git, ось чому! : D
Кудлатий

@Shaggy Я не знаю, я просто дивився на ваш код, щоб побачити, як він працює, і я набрав буквально кожен символ на моїй клавіатурі і помітив, що ~нічого не змінилося, але це було в специфікації. Також слід оновити частину "Спробуйте".
Малівіль


3

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

Завдяки @Luis Мендо зберегло 2 байти.

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

Спробуйте в Інтернеті!

Інша відповідь:

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

Спробуйте в Інтернеті!


1
@(s)setxor(' ':'~',s)економить 1 байт
Луїс Мендо

@LuisMendo Дуже приємно! Але я думаю, що це різна річ. Пропоную опублікувати це як нову відповідь :)
rahnema1

1
Ні, це справді лише незначне поліпшення. Я буду радий, що ви опублікуєте його, якщо хочете. @(s)setxor(32:'~',s)Здається, BTW теж працює --- і той самий коментар до цього :-)
Луїс Мендо

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 Я впевнений, що існує, але це не дуже добре
Jörg Hülsermann

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

@CalculatorFeline Я шукаю посилання для вас. github.com/barkermn01/PGP-php-CodeGolf У мене немає інтересу робити
Jörg Hülsermann,

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пов'язані з глобальною змінною. У Рубі $<це ярлик, 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));}

Спробуйте в Інтернеті!


Чи можете ви використовувати ||цю роботу на "стандартному" С?
Ніл

@Neil Так || також працює. Чи не так: частина "стандартного" С?
cleblanc

Я завжди думав, що це розширення gcc.
Ніл

@Neil Це правильно. ?:є розширенням GNU. Він добре працює в кланге та 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 байти:

ØṖḟ

Ні, ти нічого не пропустив.
Ерік Аутгольфер

1

Вугілля , 18 15 10 8 байт

Fγ¿¬№θιι

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


8 байт (якщо тоді попередньо введені введення не працювали)
лише для ASCII

@ ASCII Тільки вони не працювали у багатослівному режимі ... вони, мабуть, працювали б у лаконічному режимі, але мені подобаються багатослівні посилання.
Ніл

0

Математика, 35 байт

20~CharacterRange~126~Complement~#&

Анонімна функція. Приймає список символів як вхідний і повертає список символів як вихідний.


0

Луа, 78 байт

s=io.read()for i=32,126 do c=string.char(i)io.write(s:find(c,1,1)and""or c)end

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.