Распечатать реальный невидимый текст


15

Моя предыдущая задача « Распечатать невидимый текст» была довольно популярной, вероятно, из-за ее тривиальности.

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

Итак, я подумал, как насчет настоящей невидимой текстовой задачи.

Учитывая строку, состоящую только из печатаемых символов ASCII ( 0x20-0x7E), преобразуйте каждый символ в отдельный символ Unicode (в кодировке UTF-8), который не является одним из 95 печатных символов ASCII (любой символ UTF-8 вне 0x20-0x7Eдиапазона)

вход

Строка печатных символов ASCII, либо в виде строки, либо в виде массива / списка символов

Выход

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

Если вы не можете печатать непечатаемые символы, вы можете вместо этого вывести значения символов.

Например, если ваш код заменяет все строчные буквы aна 0x01, вы не можете использовать 0x01в качестве замены любые другие символы.

Ваш код также должен быть детерминированным . Это означает, что, если для данной строки Helloвсе строчные буквы lзаменены на 0x03, ваш код также должен заменить все строчные буквы lна 0x03любую другую строку.

Testcases

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

input     -> output
"Hello"   -> [0x01, 0x02, 0x03, 0x03, 0x04]
"Hi!"     -> [0x01, 0x05, 0x06]
""        -> []
"   H   " -> [0x07, 0x07, 0x07, 0x01, 0x07, 0x07, 0x07]
"yo! "    -> [0x08, 0x04, 0x06, 0x07]

Leaderboard

Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.


9
Не существует такого понятия, как символ UTF-8: UTF-8 - это сериализация Unicode, а не кодировка. И если «не для печати» имеет смысл в контексте Unicode, он, безусловно, намного уже, чем «все, кроме 95 из сотен тысяч выделенных кодовых точек».
Питер Тейлор

11
@PeterTaylor Учитывая, что мы говорим здесь с точки зрения шестнадцатеричных кодов символов, я предположил, что было ясно, что когда я говорю символ UTF-8, я имею в виду символ Unicode в кодировке UTF-8. ASCII также является стандартом кодирования, а не кодировкой, но у людей нет проблем с термином «символ ASCII». Во всяком случае, я буду редактировать формулировку, чтобы уточнить.
Скидсдев

3
По какой-то конкретной причине требуется UTF-8?
CalculatorFeline

Может ли вход быть пустым?
Деннис

1
+1 за «Если вы не можете напечатать непечатные символы»
Роберт Фрейзер

Ответы:


13

Желе , 3 байта

O²Ọ

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

Квадраты каждой кодовой точки.


Очень похоже на решение Japt, которое я придумала, ожидайте, что я кубировал код, а не возводил его в квадрат - вы согласны, что я опубликовал его?
Лохматый

2
@ Shaggy Japt t Желе, так что вы можете опубликовать это.
Эрик Outgolfer

Умное решение, не думаю о квадрате.
Скидсдев

1
Гранд, просто хотел быть уверен, чтобы ты не подумал, что я просто срываю твоё решение :)
Лохматый

4
@ Shaggy нет никаких указаний против переноса решения на другой язык; если бы это было так, это было бы ужасно, поскольку обычно существует один оптимальный алгоритм, который дает оптимальные реализации на большинстве языков, и никто, кроме первого автора, не смог бы доказать, что они пришли с этим алгоритмом самостоятельно. Конечно, если вы действительно портируете чужое решение, упомянуть их ответ будет просто честно.
Аарон

13

Пробел , 39 36 байт


  
   	  
 
  
 	
	 				  
	
  
 


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

объяснение

nssn  ; label 'loop'
ssstssn ; push 4 to use as a multiplication operand
sns   ; dup 4 to use as a heap address
sns   ; dup 4 to use as a heap address
tnts  ; getchar and store at address 4
ttt   ; retrieve the value at address 4
tssn  ; multiply the character value by 4
tnss  ; putchar output the new character
nsnn  ; jmp 'loop'

Первоначально я хотел умножить на -0 или -1, так как они будут самыми короткими цифрами, которые можно объявить в пробелах. TIO не делает различий между -0 и +0, так что это не так. К сожалению, хотя урок / спецификация неоднозначны относительно того, как интерпретировать отрицательное значение как символ TIO (правильно) выдает ошибку о недопустимом аргументе, так что это тоже не вариант.

Следующая самая короткая рабочая константа - 4, поэтому мы используем тот же базовый подход, что и решения Powershell / Pyth.


Пробелы , 56 53 байта - карты для обозначения символов


  
   			                 
 
  
 	
	 				   	
  
 


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

объяснение

По сути, тот же подход, что и в предыдущей версии, за исключением того, что 0xE0000 используется в качестве константы и добавляет вместо умножения. Это отображает видимые символы ASCII на соответствующий символ тега Unicode (диапазон U + E0000-U + E007F). Предполагаемое использование для этого диапазона состояло в том, чтобы указать язык текста в текстовом файле, однако такое использование не рекомендуется. Этот код выведет правильные метки, если вы префикс строки с символом 0x01.

Стандарт Unicode говорит , что символы в этом нет диапазона имеют видимый рендеринг , поэтому я считаю , что это отвечает духу вызов лучше , чем предыдущий подход.


5
Использование невидимой программы для печати невидимого текста. Мне нравится.
Mark

7

Japt , 5 2 байта

cp

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


объяснение

     :Implicit input of string U
c    :Map over the character codes of the string.
p    :Square them.
     :Implicit output of result.

Хм, при ближайшем рассмотрении кажется 126 ** 3 == 2000376, что это не в диапазоне [0..1114111]. Вы все еще можете возвести в квадрат :) Это потому, что там заканчивается UTF-8, а UTF-16 продолжается.
Эрик Outgolfer

1
@EriktheOutgolfer Эмм. UTF-8 имеет точно такой же диапазон, как и UTF-16 по определению. (Теоретически, UTF-8 может хранить более высокие кодовые точки, используя 5 или 6 байтов на
Г-н Листер,

5

Brain-Flak , 33 байта

Включает +1 для -c

{((({}){}){}<>)<>}<>{({}<>)<>}<>

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

# For each character
{
  # Multiply by 4 and move to the other stack
  ((({}){}){}<>)

# End loop
<>}

# For each character on the other stack
<>{

  # Copy it back (reverse the stack)
  ({}<>)<>

# End loop
}<>

4

Braingolf v0.6, 17 байт

VRl1-M[R.*>v]R&@

Квадраты каждое значение символа затем печатает.

-1 байт благодаря квадратному решению Эрика Аутгольфера

Braingolf v0.7, 6 байт [не конкурирует]

{.*}&@

Также квадраты каждое значение затем печатает, но v0.7 имеет {}цикл "foreach"


4

Mathematica, 48 байтов

FromCharacterCode[4Mod[Hash/@Characters@#,978]]&

Объяснение:

                             Characters@#      & - Convert string to array of characters
                       Hash/@                    - Hash them all using default hash
                   Mod[                  ,978]   - apply a modulus which uniquely transforms each potential character's hash into a number
                  4                              - times by 4 to move values out of 0x20-0x7E.
FromCharacterCode[                            ]  - Convert array of numbers back to string

Интересно, что из двух вариантов модуля менее 1000, которые изменили 96 символов на 96 уникальных значений с модулем 978, самые низкие два значения были 7, а затем 33. К счастью, умноженное на 4 преобразует это в 28 и 132, которые оба просто выходят за пределы видимого диапазона. Если бы я использовал другой модуль 784, то мне нужно было умножить на 18, чтобы переместить числа за пределы диапазона.

Прецедент.

Примечание: дополнительные обратные косые черты там как escape-символы для "и \. Также символ 0x7E, похоже, не хочет правильно вставлять.

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

Выход: введите описание изображения здесь

Использование Hashпришло так ToCharacterCodeдолго. Однако хеширование было почти таким же дорогим. Простой математический способ сделать это будет 49 байтов:

FromCharacterCode[4ToCharacterCode@Characters@#]&

2

CJam , 8 5 байтов

l95f+

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

Добавляет 95 к каждой кодовой точке.


Разве нет способа умножить или возвести в квадрат?
NieDzejkob

@NieDzejkob Нет, это основано на том факте, что Character + Long = chr (ord (Character) + Long). Символ * Длинный = [Символ] * Длинный. Символ # Long = ошибка (# - возведение в степень в CJam).
Эрик Outgolfer


2

PowerShell, 32 31 байт

-1 Спасибо Нилу, 99+чтобы4*

[char[]]"$args"|%{[char](4*$_)}

умножает 9 на каждый код символа и печатает его обратно.


Из интереса, сработает ли умножение на небольшое число (4-9)?
Нил

наименьшее время печати 4 больше, чем наибольшее количество печатаемых, это -1 - спасибо!
colsw



1

Десятичный , 37 байт

91D31030030012255D412D590D543D301291D

Объяснение:

91D             ; declare jump 1
    310         ; push user input to stack
    300         ; duplicate
    300         ; duplicate
    12255D      ; push EOF to stack
    412D        ; compare top two values, pop, push result
    5 90D 5     ; if result == true, quit
    43D         ; multiply top two values, pop, push result
    301         ; print
    2           ; pop
91D             ; goto jump 1

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


так прыгать в ноль ( 90D) заканчивается?
Скидсдев

@ Mayube Точно.
MD XF

1

Google Sheets, 68 байтов

=ArrayFormula(Join("",IfError(Char(Code(Mid(A1,Row(A:A),1))^2),"")))

Я хотел опубликовать это, чтобы показать, как неловко выполнять некоторые основные функции в Sheets. Вы хотите выполнить операцию для каждого символа в ячейке и получить объединенный результат? Вы в 42 байтах, прежде чем вы даже действуете на этих персонажей.

=ArrayFormula(Join("",Mid(A1,Row(A:A),1)))

Иначе, это то же самое, что и другие решения: возвести в квадрат кодовую точку каждого символа.




0

Чисто , 25 байт

import StdEnv

map((+)'~')

Частичная функция литерал.

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

Реалистично:

f s = {# c+'~' \\ c <-: s}

Понимание распакованного массива над распакованным массивом того же типа ( {#Char} -> {#Char}). Clean сможет определить, что уникальность переносима ( !u:{#Char} -> u:{#Char}) и что размер совпадает с размером ввода. Это означает, что если вы передадите a *String, каждый символ будет деструктивно обновлен соответствующим символом в выводе, что означает, что никакого выделения памяти или перемещения не будет выполнено, и узел графа будет полностью использован повторно.

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

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