In văn bản vô hình thực


15

Thử thách trước đây của tôi, In văn bản vô hình khá phổ biến, có thể là do nó tầm thường như thế nào.

Tuy nhiên, những người quan sát nhiều hơn về bạn có thể nhận thấy rằng bạn không thực sự in văn bản vô hình, bởi vì không thể đọc những gì được nhập chỉ đưa ra đầu ra.

Vì vậy, tôi đã tìm hiểu làm thế nào về một thách thức văn bản vô hình thực sự .

Đưa ra một chuỗi chỉ bao gồm các ký tự ASCII có thể in ( 0x20-0x7E), chuyển đổi từng ký tự thành một ký tự Unicode riêng biệt (theo mã UTF-8) không phải là một trong 95 ký tự ASCII có thể in (bất kỳ ký tự UTF-8 nào ngoài 0x20-0x7Ephạm vi)

Đầu vào

Một chuỗi các ký tự ASCII có thể in, dưới dạng một chuỗi hoặc danh sách / mảng ký tự

Đầu ra

Chuỗi đầu vào với mỗi ký tự được thay thế bằng một ký tự không thể in riêng biệt. Mỗi ký tự đã cho phải có một ký tự không in được tương ứng không được sử dụng thay thế cho bất kỳ ký tự nào khác.

Nếu bạn không thể in các ký tự không in được, bạn có thể xuất các giá trị ký tự thay thế.

Ví dụ nếu mã của bạn thay thế tất cả chữ thường a's với 0x01, bạn có thể không sử dụng 0x01như thay thế cho bất kỳ nhân vật khác.

Mã của bạn cũng phải có tính quyết định . Điều này có nghĩa là nếu, được cung cấp chuỗi Hello, tất cả các chữ thường lđược thay thế bằng 0x03, mã của bạn cũng phải thay thế tất cả các chữ thường lbằng 0x03bất kỳ chuỗi nào khác.

Tủ thử

Việc viết thử nghiệm cho thử thách này hơi khó khăn, vì vậy tôi chỉ đơn giản hiển thị đầu ra dưới dạng danh sách các mã hex

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
Không có thứ gọi là ký tự UTF-8: UTF-8 là một chuỗi ký tự Unicode, không phải là bộ ký tự. Và nếu "không thể in được" có ý nghĩa trong bối cảnh Unicode, nó chắc chắn nhiều hẹp hơn "tất cả nhưng 95 trong số hàng trăm ngàn codepoints phân bổ".
Peter Taylor

11
@PeterTaylor Vì chúng ta đang nói về các mã lục giác ký tự ở đây, tôi giả sử rằng rõ ràng khi tôi nói ký tự UTF-8 tôi có nghĩa là một ký tự Unicode trong mã hóa UTF-8. ASCII cũng là một tiêu chuẩn mã hóa, không phải là bộ ký tự, nhưng mọi người không có vấn đề gì với thuật ngữ "ký tự ASCII". Dù sao, tôi sẽ chỉnh sửa từ ngữ để làm rõ.
Skidsdev

3
Bất kỳ lý do cụ thể UTF-8 là bắt buộc?
Máy

Đầu vào có thể để trống không?
Dennis

1
+1 cho "Nếu bạn không thể in các ký tự không in được"
Robert Fraser

Câu trả lời:


13

Thạch , 3 byte

O²Ọ

Hãy thử trực tuyến!

Bình phương mỗi mật mã.


Rất giống với giải pháp Japt mà tôi đã đưa ra, hy vọng tôi đã lập được bảng mã thay vì bình phương nó - bạn có đồng ý với tôi đăng nó không?
Xù xì

2
@Shaggy Japt Jelly, vì vậy bạn có thể đăng nó.
Erik the Outgolfer

Giải pháp thông minh, không nghĩ đến bình phương.
Skidsdev

1
Grand, chỉ muốn chắc chắn thôi, e rằng bạn nghĩ tôi vừa xé toạc giải pháp của bạn :)
Shaggy

4
@Shaggy không có hướng dẫn chống lại việc chuyển giải pháp sang ngôn ngữ khác; nếu có thì thật là tồi tệ vì thường có một thuật toán tối ưu mang lại sự triển khai tối ưu ở hầu hết các ngôn ngữ, và không ai khác ngoài người đăng đầu tiên sẽ không thể chứng minh rằng họ tự mình đi kèm với thuật toán. Tất nhiên, nếu bạn thực sự đưa ra giải pháp cho người khác, thì đó chỉ là sự công bằng khi đề cập đến câu trả lời của họ.
Aaron

13

Khoảng trắng , 39 36 byte


  
   	  
 
  
 	
	 				  
	
  
 


Hãy thử trực tuyến!

Giải trình

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'

Ban đầu tôi muốn nhân với -0 hoặc -1 vì chúng sẽ là các chữ số ngắn nhất có thể khai báo trong Khoảng trắng. TIO không phân biệt giữa -0 và +0 vì vậy đó là ra. Thật không may trong khi hướng dẫn / thông số không rõ ràng về cách diễn giải giá trị âm như một TIO char (đúng) sẽ đưa ra một lỗi về đối số không hợp lệ để đó cũng không phải là một tùy chọn.

Hằng số làm việc ngắn nhất tiếp theo là 4 vì vậy cuối cùng chúng tôi thực hiện cách tiếp cận cơ bản giống như các giải pháp Powershell / Pyth.


Khoảng trắng , 56 53 byte - ánh xạ tới các ký tự thẻ


  
   			                 
 
  
 	
	 				   	
  
 


Hãy thử trực tuyến!

Giải trình

Hiệu quả là cách tiếp cận tương tự như phiên bản trước ngoại trừ điều này sử dụng 0xE0000 làm hằng số và thêm thay vì nhân. Điều này ánh xạ các ký tự ASCII hiển thị thành Ký tự thẻ Unicode tương ứng (phạm vi U + E0000-U + E007F). Mục đích sử dụng cho phạm vi này là để chỉ ngôn ngữ của văn bản trong tệp văn bản gốc tuy nhiên việc sử dụng đó không được khuyến khích. Mã này sẽ xuất nhãn hợp lệ nếu bạn tiền tố chuỗi có ký tự 0x01.

Các tiêu chuẩn Unicode nói rằng nhân vật trong này phạm vi không có vẽ có thể nhìn thấy vì vậy tôi cảm thấy điều này đáp ứng được tinh thần của thách thức tốt hơn so với các phương pháp trước đó.


5
Sử dụng một chương trình vô hình để in văn bản vô hình. Tôi thích.
Đánh dấu

7

Japt , 5 2 byte

cp

Dùng thử trực tuyến


Giải trình

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

Hmm, sau khi kiểm tra kỹ hơn, có vẻ như 126 ** 3 == 2000376không nằm trong phạm vi [0..1114111]. Bạn vẫn có thể vuông mặc dù :) Đó là vì UTF-8 kết thúc ở đó, trong khi UTF-16 tiếp tục.
Erik the Outgolfer

1
@EriktheOutgolfer Ehm. Định nghĩa UTF-8 có cùng phạm vi với UTF-16 theo định nghĩa. (Về lý thuyết, UTF-8 có thể lưu trữ các điểm mã cao hơn, sử dụng 5 hoặc 6 byte cho mỗi điểm mã, nhưng đó là bất hợp pháp.)
Mr Lister

5

Brain-Flak , 33 byte

Bao gồm +1 cho -c

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

Hãy thử trực tuyến!

# 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 byte

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

Bình phương mỗi giá trị char sau đó in.

-1 byte nhờ vào giải pháp bình phương của Erik the Outgolfer

Braingolf v0.7, 6 byte [không cạnh tranh]

{.*}&@

Cũng bình phương mỗi giá trị sau đó in, nhưng v0.7 có {}vòng lặp "foreach"


4

Toán học, 48 byte

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

Giải trình:

                             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

Điều thú vị là hai tùy chọn mô-đun nhỏ hơn 1000 đã thay đổi 96 ký tự thành 96 giá trị duy nhất với mô-đun 980, hai giá trị thấp nhất là 7 rồi 33. May mắn thay, 4 lần chuyển đổi này thành 28 và 132, cả hai đều nằm ngoài phạm vi có thể nhìn thấy. Nếu tôi sử dụng mô-đun khác của 784 thì tôi cần nhân với 18 để di chuyển các số ngoài phạm vi.

Trường hợp thử nghiệm.

Lưu ý: dấu gạch chéo ngược bổ sung trong đó dưới dạng ký tự thoát cho "\. Ngoài ra, ký tự 0x7E dường như không muốn dán chính xác.

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

Đầu ra: nhập mô tả hình ảnh ở đây

Việc sử dụng Hashđến như ToCharacterCodelà thực sự dài. Tuy nhiên, băm nó gần như là đắt tiền. Cách toán học dễ dàng để làm điều này sẽ là 49 byte:

FromCharacterCode[4ToCharacterCode@Characters@#]&



2

PowerShell, 32 31 byte

-1 Nhờ neil, 99+để4*

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

nhân 9 cho mỗi mã ký tự và in lại.


Không quan tâm, liệu nhân với một số nhỏ (4-9) có hoạt động không?
Neil

lần in thấp nhất 4 lần lớn hơn lần in lớn nhất, đó là -1 - cảm ơn!
colsw



1

Số thập phân , 37 byte

91D31030030012255D412D590D543D301291D

Giải trình:

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

Hãy thử trực tuyến!


vì vậy nhảy đến không ( 90D) chấm dứt?
Skidsdev

@Mayube Chính xác.
MD XF

1

Google Sheets, 68 byte

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

Tôi muốn đăng bài này để cho thấy sự khó xử khi thực hiện một số chức năng cơ bản trong Sheets. Bạn có muốn thực hiện một thao tác cho mọi ký tự trong một ô và đưa ra kết quả được nối không? Bạn đang ở mức 42 byte trước khi bạn hành động theo những ký tự đó.

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

Mặt khác, điều này giống như các giải pháp khác: bình phương điểm mã của mỗi ký tự.




0

Sạch , 25 byte

import StdEnv

map((+)'~')

Một phần chức năng theo nghĩa đen.

Hãy thử trực tuyến!

Thực tế:

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

Hiểu mảng chưa được mở hộp trên một mảng chưa được đóng hộp cùng loại ( {#Char} -> {#Char}). Clean sẽ có thể xác định rằng tính duy nhất có thể chuyển nhượng được ( !u:{#Char} -> u:{#Char}) và kích thước đó giống với kích thước đầu vào. Điều này có nghĩa là nếu bạn vượt qua một*String , mọi ký tự sẽ được cập nhật triệt để với ký tự tương ứng trong đầu ra, nghĩa là không có phân bổ bộ nhớ hoặc chuyển động nào được thực hiện và nút đồ thị được sử dụng lại hoàn toàn.

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.