Cetak Teks Nyata Yang Tak Terlihat


15

Tantangan saya sebelumnya, Mencetak teks tak terlihat cukup populer, kemungkinan karena sepele itu.

Namun mereka yang lebih jeli dari Anda mungkin telah memperhatikan bahwa Anda tidak benar-benar mencetak teks yang tidak terlihat, karena tidak mungkin untuk membaca apa yang diinput hanya diberikan output.

Jadi saya pikir bagaimana dengan nyata tantangan teks yang tak terlihat.

Diberikan string yang hanya terdiri dari karakter ASCII yang dapat dicetak ( 0x20-0x7E), konversi setiap karakter menjadi karakter Unicode yang berbeda (dalam pengkodean UTF-8) yang bukan salah satu dari 95 karakter ASCII yang dapat dicetak (setiap karakter UTF-8 di luar 0x20-0x7Ekisaran)

Memasukkan

String karakter ASCII yang dapat dicetak, baik sebagai string atau array karakter / daftar

Keluaran

String input dengan setiap karakter diganti dengan karakter yang tidak dapat dicetak yang berbeda. Setiap karakter yang diberikan harus memiliki karakter yang tidak dapat dicetak yang sesuai yang tidak digunakan sebagai pengganti karakter lain.

Jika Anda tidak dapat mencetak karakter yang tidak dapat dicetak, Anda dapat menampilkan nilai karakter sebagai gantinya.

Sebagai contoh jika kode Anda menggantikan semua huruf kecil a's dengan 0x01, Anda tidak dapat menggunakan 0x01sebagai substitusi untuk setiap karakter lain.

Kode Anda juga harus deterministik . Ini berarti bahwa jika, mengingat string Hello, semua huruf kecil ldiganti dengan 0x03, kode Anda juga harus mengganti semua huruf kecil ldengan 0x03string lainnya.

Testcases

Agak sulit untuk menulis testcases untuk tantangan ini, jadi saya hanya akan menunjukkan output sebagai daftar hexcodes

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
Tidak ada yang namanya karakter UTF-8: UTF-8 adalah serialisasi Unicode, bukan charset. Dan jika "tidak dapat dicetak" masuk akal dalam konteks Unicode, itu tentu saja jauh lebih sempit daripada "semua kecuali 95 dari ratusan ribu codepoint yang dialokasikan".
Peter Taylor

11
@ PeterTaylor Mengingat kita sedang berbicara dalam hal hexcodes karakter di sini, saya berasumsi sudah jelas bahwa ketika saya mengatakan karakter UTF-8 yang saya maksud adalah karakter Unicode dalam pengkodean UTF-8. ASCII juga merupakan standar penyandian, bukan charset, namun orang tidak memiliki masalah dengan istilah "karakter ASCII". Bagaimanapun, saya akan mengedit kata-kata untuk menjelaskan.
Skidsdev

3
Adakah alasan khusus UTF-8 diperlukan?
CalculatorFeline

Bisakah input kosong?
Dennis

1
+1 untuk "Jika Anda tidak dapat mencetak karakter yang tidak dapat dicetak"
Robert Fraser

Jawaban:


13

Jelly , 3 byte

O²Ọ

Cobalah online!

Kuadratkan setiap codepoint.


Sangat mirip dengan solusi Japt saya datang dengan, berharap saya potong dadu codepoint bukannya kuadratkan - Anda setuju dengan saya mempostingnya?
Shaggy

2
@Shaggy Japt ≠ Jelly, jadi kamu bisa mempostingnya.
Erik the Outgolfer

Solusi cerdas, tidak memikirkan kuadrat.
Skidsdev

1
Grand, hanya ingin memastikan, jangan sampai kamu mengira aku baru saja merobek solusi kamu :)
Shaggy

4
@ Shaggy tidak ada pedoman untuk porting solusi ke bahasa lain; jika ada itu akan mengerikan karena biasanya ada satu algoritma optimal yang memberikan implementasi optimal di sebagian besar bahasa, dan tidak ada orang selain poster pertama tidak akan dapat membuktikan mereka datang dengan algoritma sendiri. Tentu saja jika Anda benar-benar mem-porting solusi orang lain, cukup adil untuk menyebutkan jawaban mereka.
Aaron

13

Spasi , 39 36 byte


  
   	  
 
  
 	
	 				  
	
  
 


Cobalah online!

Penjelasan

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'

Awalnya saya ingin mengalikan dengan -0 atau -1 karena mereka akan menjadi angka terpendek yang mungkin untuk dinyatakan di Whitespace. TIO tidak membedakan antara -0 dan +0 jadi itu keluar. Sayangnya sementara tutorial / spec ambigu tentang bagaimana menafsirkan nilai negatif sebagai char TIO (benar) melempar kesalahan tentang argumen yang tidak valid sehingga juga bukan pilihan.

Konstanta kerja terpendek berikutnya adalah 4 sehingga kami akhirnya melakukan pendekatan dasar yang sama dengan solusi Powershell / Pyth.


Whitespace , 56 53 byte - memetakan untuk menandai karakter


  
   			                 
 
  
 	
	 				   	
  
 


Cobalah online!

Penjelasan

Secara efektif pendekatan yang sama dengan versi sebelumnya kecuali ini menggunakan 0xE0000 sebagai konstanta dan menambahkan bukan mengalikan. Ini memetakan karakter ASCII yang terlihat ke Unicode Tag Character yang sesuai (kisaran U + E0000-U + E007F). Penggunaan yang dimaksudkan untuk rentang ini adalah untuk menunjukkan bahasa teks dalam file plaintext namun penggunaannya tidak disarankan. Kode ini akan menampilkan label yang valid jika Anda awalan string dengan karakter 0x01.

The Unicode Standard mengatakan bahwa karakter dalam rentang tidak memiliki render terlihat sehingga saya merasa ini memenuhi semangat tantangan yang lebih baik dibandingkan dengan pendekatan sebelumnya.


5
Menggunakan program yang tidak terlihat untuk mencetak teks yang tidak terlihat. Saya suka.
Tandai

7

Japt , 5 2 byte

cp

Cobalah online


Penjelasan

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

Hmm, setelah pemeriksaan lebih dekat, tampaknya itu 126 ** 3 == 2000376, yang tidak dalam kisaran [0..1114111]. Anda masih bisa mengimbangi :) Itu karena UTF-8 berakhir di sana, sementara UTF-16 berlanjut.
Erik the Outgolfer

1
@EriktheOutgolfer Ehm. UTF-8 memiliki kisaran yang persis sama dengan UTF-16 menurut definisi. (Secara teori, UTF-8 dapat menyimpan codepoint yang lebih tinggi, menggunakan 5 atau 6 byte per codepoint, tetapi itu ilegal.)
Mr Lister

5

Brain-Flak , 33 byte

Termasuk +1 untuk -c

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

Cobalah online!

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

Kuadratkan masing-masing nilai char lalu cetak.

-1 byte berkat solusi kuadrat Erik the Outgolfer

Braingolf v0.7, 6 byte [tidak bersaing]

{.*}&@

Juga kuadrat setiap nilai lalu cetak, tetapi v0.7 memiliki {}loop "foreach"


4

Mathematica, 48 byte

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

Penjelasan:

                             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

Menariknya dari dua opsi modulus kurang dari 1000 yang mengubah 96 karakter menjadi 96 nilai unik dengan modulus 978 dua nilai terendah adalah 7 kemudian 33. Untungnya kali oleh 4 mengubahnya menjadi 28 dan 132 yang keduanya hanya berada di luar rentang yang terlihat. Jika saya menggunakan modulus lain dari 784 maka saya perlu mengalikannya dengan 18 untuk memindahkan angka di luar rentang.

Kasus cobaan.

Catatan: backslash tambahan di sana sebagai karakter pelarian untuk "dan \. Juga karakter 0x7E tampaknya tidak ingin menempel dengan benar.

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

Keluaran: masukkan deskripsi gambar di sini

Penggunaan Hashmuncul karena ToCharacterCodesangat lama. Namun hashing itu hampir sama mahal. Cara matematika mudah untuk melakukan ini adalah 49 byte:

FromCharacterCode[4ToCharacterCode@Characters@#]&

2

CJam , 8 5 byte

l95f+

Cobalah online!

Tambahkan 95 ke setiap codepoint.


Bukankah ada cara untuk mengalikan atau kuadrat saja?
NieDzejkob

@NieDzejkob Tidak, ini didasarkan pada fakta bahwa Character + Long = chr (ord (Character) + Long). Karakter * Panjang = [Karakter] * Panjang. Karakter # Panjang = kesalahan (# adalah eksponensial dalam CJam).
Erik the Outgolfer


2

PowerShell, 32 31 Bytes

-1 Berkat neil, 99+untuk4*

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

mengalikan 9 dengan masing-masing kode karakter dan mencetaknya kembali.


Karena minat, apakah mengalikan dengan jumlah kecil (4-9) akan berhasil?
Neil

waktu cetak terendah 4 lebih besar dari cetakan terbesar, yaitu -1 - terima kasih!
colsw


1

CJam , 4 byte

lWf^

XOR masing-masing titik kode dengan -1 . Karakter CJam adalah 16 bit, jadi ini memetakan kode titik n ke titik kode 65535 - n .

Cobalah online!


1

Desimal , 37 byte

91D31030030012255D412D590D543D301291D

Penjelasan:

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

Cobalah online!


jadi melompat ke nol ( 90D) berakhir?
Skidsdev

@ Mayube Persis.
MD XF

1

Google Sheets, 68 byte

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

Saya ingin memposting ini untuk menunjukkan betapa canggungnya melakukan beberapa fungsi dasar di Sheets. Apakah Anda ingin melakukan operasi untuk setiap karakter di dalam sel dan mengeluarkan hasil gabungan? Anda berada di 42 byte bahkan sebelum Anda bertindak pada karakter tersebut.

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

Jika tidak, ini sama dengan solusi lain: kuadratkan titik kode masing-masing karakter.




0

Bersih , 25 byte

import StdEnv

map((+)'~')

Fungsi parsial literal.

Cobalah online!

Secara realistis:

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

Pemahaman array tanpa kotak di atas array tanpa kotak dengan tipe yang sama ( {#Char} -> {#Char}). Clean akan dapat menentukan bahwa keunikan dapat ditransfer ( !u:{#Char} -> u:{#Char}), dan ukurannya sama dengan ukuran input. Ini berarti bahwa jika Anda melewatkan a *String, setiap karakter akan diperbarui secara destruktif dengan yang sesuai dalam output, yang berarti tidak ada alokasi memori atau gerakan yang dilakukan dan simpul grafik digunakan kembali sepenuhnya.

Cobalah online!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.