Роздрукувати реальний невидимий текст


15

Мій попередній виклик " Друк невидимого тексту" був досить популярним, ймовірно, через те, наскільки він банальний.

Однак ті, хто спостерігає вас, можливо, помітили, що ви насправді не друкуєте невидимий текст, тому що неможливо прочитати те, що було введено, даючи лише вихід.

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

З огляду на рядок, що складається лише з символів для друку ASCII ( 0x20-0x7E), перетворіть кожен символ у окремий символ Unicode (у кодуванні UTF-8), який не є одним із 95 символів для друку ASCII (будь-який символ UTF-8 поза 0x20-0x7Eдіапазоном)

Вхідні дані

Рядок символів, що друкуються ASCII, або як рядок або масив / список символів

Вихідні дані

Рядок введення з кожним символом замінюється чітким символом, який не можна роздрукувати. Кожен заданий символ повинен мати відповідний недрукувальний символ, який не використовується як заміна будь-якого іншого символу.

Якщо ви не можете надрукувати символи, які не можна друкувати, замість цього можна вивести значення символів.

Наприклад , якщо ваш код замінює усі малі літери a«S з 0x01, ви не можете використовувати в 0x01якості заміщення для будь-яких інших символів.

Ваш код також повинен бути детермінованим . Це означає, що якщо, враховуючи рядок Hello, всі малі літери lзамінюються 0x03, ваш код також повинен замінити всі малі регістри lна 0x03будь-яку іншу рядок.

Тестові шафи

Дещо складно написати тести для цього виклику, тому я просто покажу вихід у вигляді списку шестикодів

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]

Таблиця лідерів

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


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 ≠ Желе, тож ви можете опублікувати його.
Ерік Аутгольфер

Розумне рішення, не думав про квадрати.
Скідсдев

1
Величний, просто хотів бути впевненим, щоб ви не думали, що я просто зірвав ваше рішення :)
Shaggy

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, оскільки вони будуть найкоротшими цифрами, які можна оголосити в Whitespace. TIO не розмежовує значення між -0 та +0, так що це не вдається. На жаль, хоча підручник / специфіка неоднозначна щодо того, як інтерпретувати негативне значення, оскільки char TIO (правильно) видає помилку щодо недійсного аргументу, так що також не є варіантом.

Наступна найкоротша робоча константа - 4, тому ми закінчуємо той самий базовий підхід, що і рішення Powershell / Pyth.


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


  
   			                 
 
  
 	
	 				   	
  
 


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

Пояснення

Ефективно той же підхід, що і попередня версія, за винятком цього, використовує 0xE0000 як константу і додає замість множення. Це відображає видимі символи ASCII до відповідного символу тегів Unicode (діапазон U + E0000-U + E007F). Зазначене використання для цього діапазону полягало в тому, щоб вказати мову тексту у файлі прямого тексту, однак це використання не перешкоджає. Цей код видасть дійсні мітки, якщо ви будете префіксувати рядки з символом 0x01.

Стандарт Unicode говорить , що символи в цьому немає діапазону мають видимий рендеринг , тому я вважаю , що це відповідає духу виклик краще , ніж попередній підхід.


5
Використання невидимої програми для друку невидимого тексту. Мені подобається.
Марк

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 продовжується.
Ерік Аутгольфер

1
@EriktheOutgolfer Ehm. UTF-8 має точно такий же діапазон, що і UTF-16 за визначенням. (Теоретично UTF-8 може зберігати більш високі кодові точки, використовуючи 5 або 6 байт за кодову точку, але це незаконно.)
Містер Лістер


4

Braingolf v0.6, 17 байт

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

Після цього друкується кожне значення знаку.

-1 байт завдяки рішенню Еріка Атгольфера

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

{.*}&@

Також у квадраті кожне значення друкується, але v0.7 має {}цикл "foreach"


4

Математика, 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, щоб перемістити числа за межі діапазону.

Тестовий випадок.

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

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

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

Користування Hashприйшло, як ToCharacterCodeнасправді, тривалий час. Однак хеширование було майже таким же дорогим. Найпростішим математичним способом це буде 49 байт:

FromCharacterCode[4ToCharacterCode@Characters@#]&

2

CJam , 8 5 байт

l95f+

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

Додає до кожної точки коду 95.


Хіба не існує способу множення чи квадратного натомість?
NieDzejkob

@NieDzejkob Ні, це засновано на тому, що символ + Long = chr (ord (характер) + Long). Персонаж * Довгий = [Характер] * Довгий. Символ # Long = помилка (# - експоненція в CJam).
Ерік Аутгольфер


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) закінчується?
Skidsdev

@Mayube Рівно.
MD XF

1

Google Таблиці, 68 байт

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

Я хотів опублікувати це, щоб показати, як незручно виконувати якісь основні функції в Таблицях. Ви хочете зробити операцію з кожним символом у комірці та вивести зв'язаний результат? Ви маєте 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}), і що розмір такий самий, як розмір введення. Це означає, що якщо ви пройдете а*String , кожен символ буде деструктивно оновлюватися відповідним на виході, тобто не відбувається розподіл або переміщення пам'яті і вузол графіка повністю використовується повторно.

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

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