보이지 않는 실제 텍스트 인쇄


15

나의 이전 도전 인 Print invisible text 는 사소한 것이기 때문에 상당히 인기가있었습니다.

그러나 당신을 더 잘 관찰하는 사람들은 실제로 보이지 않는 텍스트를 인쇄하지 않는다는 것을 알았을 것입니다. 왜냐하면 출력 만 주어진 입력 내용을 읽을 수 없기 때문입니다.

그래서 나는 방법에 대해 생각 실제 눈에 보이지 않는 텍스트 도전.

인쇄 가능한 ASCII 문자 ( 0x20-0x7E) 로만 구성된 문자열이있는 경우 각 문자를 95 개의 인쇄 가능한 ASCII 문자 ( 0x20-0x7E범위를 벗어난 UTF-8 문자)가 아닌 고유 한 유니 코드 문자 (UTF-8 인코딩)로 변환하십시오.

입력

문자열 또는 문자 배열 / 목록으로 인쇄 가능한 ASCII 문자의 문자열

산출

각 문자가있는 입력 문자열은 인쇄 할 수없는 고유 한 문자로 바뀝니다. 주어진 각 문자에는 다른 문자를 대신 할 수없는 인쇄 할 수없는 해당 문자가 있어야합니다.

인쇄 할 수없는 문자를 인쇄 할 수없는 경우 문자 값을 대신 출력 할 수 있습니다.

코드를 모두 소문자로 대체 예를 들어 a와의를 0x01, 당신은 사용할 수 없습니다 0x01다른 문자를 대체한다.

또한 코드는 결정적 이어야합니다 . 문자열을 주어진 경우에 것을이 수단 Hello, 모두 소문자 l의가로 교체은 0x03, 당신의 코드는 모두 소문자로 교체해야 l와 s '을 (를) 0x03주어진 다른 문자열입니다.

테스트 케이스

이 과제에 대한 테스트 케이스를 작성하는 것은 다소 어렵 기 때문에 출력을 16 진수 코드 목록으로 간단히 보여 드리겠습니다.

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은 문자셋이 아닌 유니 코드의 직렬화입니다. 그리고 "인쇄 할 수없는"이 유니 코드 컨텍스트에서 의미가 있다면, "수십만 개의 할당 된 코드 포인트 중 95 개를 제외한"보다 훨씬 더 좁습니다.
피터 테일러

11
@PeterTaylor 여기서 우리는 문자 16 진수 코드와 관련하여 이야기 할 때 UTF-8 문자를 말할 때 UTF-8 인코딩의 유니 코드 문자를 의미한다고 생각했습니다. ASCII는 또한 문자 집합이 아닌 인코딩 표준이지만 "ASCII 문자"라는 용어에는 문제가 없습니다. 어쨌든 명확하게 표현하기 위해 문구를 편집하겠습니다.
Skidsdev

3
UTF-8이 필요한 특별한 이유는 무엇입니까?
CalculatorFeline

입력을 비울 수 있습니까?
Dennis

1
"인쇄 할 수없는 문자를 인쇄 할 수없는 경우"에 +1
Robert Fraser

답변:


13

젤리 , 3 바이트

O²Ọ

온라인으로 사용해보십시오!

각 코드 포인트를 제곱합니다.


내가 만든 Japt 솔루션과 매우 유사합니다. 코드 포인트를 제곱하는 대신 큐브로 만들었습니다. 게시해도 괜찮습니까?
얽히고 설킨 Shaggy

2
@Shaggy Japt ≠ Jelly이므로 게시 할 수 있습니다.
Outgolfer Erik

영리한 솔루션은 제곱을 생각하지 않았습니다.
Skidsdev

1
Grand, 그냥 확신하고 싶었습니다. 솔루션을 추출한다고 생각하지 않도록 :)
Shaggy

4
@Shaggy 솔루션을 다른 언어로 포팅하는 것에 대한 지침은 없습니다. 대부분의 언어에서 최적의 구현을 제공하는 최적의 알고리즘이 일반적으로 있기 때문에 그것이 끔찍할 것입니다. 첫 번째 포스터는 알고리즘이 자체적으로 제공되었다는 것을 증명할 수는 없습니다. 물론 다른 사람의 솔루션을 실제로 이식하는 경우 답변을 언급하는 것은 공정한 일입니다.
Aaron

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을 구분하지 않으므로 결과가 없습니다. 불행히도 자습서 / 사양은 음수 값을 char TIO로 해석하는 방법에 대해 모호하지만 (잘못된) 잘못된 인수에 대한 오류를 발생시켜 옵션이 아닙니다.

다음으로 가장 짧은 작업 상수는 4이므로 Powershell / Pyth 솔루션과 동일한 기본 접근 방식을 수행합니다.


공백 , 56 53 바이트-태그 문자에 매핑


  
   			                 
 
  
 	
	 				   	
  
 


온라인으로 사용해보십시오!

설명

0xE0000을 상수로 사용하고 곱하기 대신 더하는 것을 제외하고는 이전 버전과 사실상 동일한 접근 방식입니다. 보이는 ASCII 문자를 해당 유니 코드 태그 문자 (범위 U + E0000-U + E007F)에 매핑합니다. 이 범위의 의도 된 용도는 일반 텍스트 파일로 텍스트의 언어를 나타내지 만 사용을 권장하지 않습니다. 이 코드는 문자열 앞에 0x01 문자를 붙이면 유효한 레이블을 출력합니다.

유니 코드 표준은 내가이 더 이전의 방법보다 도전 정신을 충족 느낄 수 있도록이 문자가 눈에 보이는 렌더링이없는 범위 말한다.


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 Erik

1
@EriktheOutgolfer Ehm. UTF-8은 정의상 UTF-16과 정확히 동일한 범위를 갖습니다. 이론적으로 UTF-8은 코드 포인트 당 5 또는 6 바이트를 사용하여 더 높은 코드 포인트를 저장할 수 있지만 이는 불법입니다.
Mr Lister

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&@

각 문자 값을 제곱 한 다음 인쇄합니다.

Outgolfer의 제곱 솔루션 인 Erik 덕분에 -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 개 문자를 계수 978을 사용하여 96 개의 고유 값으로 변경하면 가장 낮은 두 값은 7과 33입니다. 운 좋게도 4를 곱하면 28과 132로 변환되어 가시 범위를 벗어납니다. 다른 계수 784를 사용하면 숫자를 범위 밖으로 이동하려면 18을 곱해야했습니다.

테스트 사례.

참고 : "및에 대한 이스케이프 문자로 추가 백 슬래시가 있습니다 \. 또한 문자 0x7E는 올바르게 붙여 넣기를 원하지 않는 것 같습니다.

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

산출: 여기에 이미지 설명을 입력하십시오

의 사용 Hash으로 대해왔다 ToCharacterCode정말 깁니다. 그러나 해싱은 거의 비쌌습니다. 이 작업을 수행하는 쉬운 수학 방법은 49 바이트입니다.

FromCharacterCode[4ToCharacterCode@Characters@#]&



2

PowerShell, 32 31 바이트

-1 neil 덕분 99+4*

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

각 문자 코드에 9를 곱하고 다시 인쇄합니다.


관심이 없다면 적은 수 (4-9)의 작업을 곱하는 것입니까?
Neil

가장 낮은 인쇄 가능 시간 4는 가장 큰 인쇄 가능 시간보다 큽니다. 즉 -1입니다. 감사합니다!
colsw



1

10 진수 , 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

온라인으로 사용해보십시오!


0으로 점프하면 90D종료됩니까?
Skidsdev

@Mayube 정확합니다.
MD XF

1

Google 스프레드 시트, 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}) 크기가 입력 크기와 동일 함을 확인할 수 있습니다. 이것은 당신이 통과하면*String 모든 문자가 출력에서 ​​해당 문자로 파괴적으로 업데이트되므로 메모리 할당이나 이동이 수행되지 않고 그래프 노드가 완전히 재사용됩니다.

온라인으로 사용해보십시오!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.