Gerçek Görünmez Metin Yazdır


15

Önceki zorluğum olan Print görünmez metin , muhtemelen ne kadar önemsiz olduğundan dolayı oldukça popülerdi.

Bununla birlikte, daha fazla gözlemci, görünmez metin basmadığınızı fark etmiş olabilir, çünkü yalnızca çıktı verildiğinde girilenleri okumak imkansızdır.

Bu yüzden gerçek bir görünmez metin meydan okumasına ne dersiniz .

Yalnızca yazdırılabilir ASCII karakterlerden ( 0x20-0x7E) oluşan bir dize verildiğinde , her karakteri 95 yazdırılabilir ASCII karakterden ( 0x20-0x7Earalığın dışındaki herhangi bir UTF-8 karakteri) olmayan farklı bir Unicode karakterine (UTF-8 kodlamasında) dönüştürün

Giriş

Dize veya karakter dizisi / listesi olarak yazdırılabilir ASCII karakter dizisi

Çıktı

Her karakterin yer aldığı girdi dizgisi, yazdırılamaz ayrı bir karakterle değiştirildi. Verilen her karakterin, başka herhangi bir karakterin yerine kullanılmayan, yazdırılamayan karşılık gelen bir karakteri olmalıdır.

Yazdırılamayan karakterleri yazdıramıyorsanız, bunun yerine karakter değerlerinin çıktısını alabilirsiniz.

Kodunuzu tümü küçük değiştirir Örneğin abirlikte 's 0x01, kullanmak olmayabilir 0x01başka karakterler için ikame olarak.

Kodunuz da deterministik olmalıdır . Bu, dize verildiğinde Hellotüm küçük harflerin lyerine 0x03geçmesi durumunda, kodunuzun tüm küçük harflerin yerine başka bir dize lile değiştirilmesi gerektiği anlamına gelir 0x03.

testcases

Bu meydan okuma için testcasları yazmak biraz zor, bu yüzden çıktıyı hexcodes listesi olarak göstereceğim

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]

Liderler Sıralaması

İşte hem düzenli bir skor tablosu hem de kazananları dile göre gözden geçirmek için bir Yığın Parçacığı.


9
UTF-8 karakteri diye bir şey yoktur: UTF-8, bir karakter kümesi değil, Unicode'un serileştirilmesidir. Ve "yazdırılamaz" bir Unicode bağlamında mantıklıysa, "yüz binlerce tahsis edilmiş kod noktasının 95'i hariç tümü" den kesinlikle daha dardır.
Peter Taylor

11
@PeterTaylor Burada karakter hexcodes olarak konuştuğumuz göz önüne alındığında, UTF-8 karakteri dediğimde UTF-8 kodlamasında bir Unicode karakteri ifade ettiğimi açıkça varsaydım. ASCII ayrıca bir kodlama standardıdır, karakter takımı değildir, ancak insanların "ASCII karakteri" terimiyle bir sorunu yoktur. Her neyse, açıklığa kavuşturmak için ifadeyi düzenleyeceğim.
Skidsdev

3
UTF-8'in gerekli bir nedeni var mı?
CalculatorFeline

Giriş boş olabilir mi?
Dennis

1
"Yazdırılamayan karakterler yazdıramıyorsanız" için +1
Robert Fraser

Yanıtlar:


13

Jöle , 3 bayt

O²Ọ

Çevrimiçi deneyin!

Her bir kod noktasını kareler.


Geldiğim Japt çözümüne çok benzer, kod noktasını kareye almak yerine küp haline getirmeyi bekliyorum - bana gönderirken sorun yok mu?
Shaggy

2
@Shaggy Japt ≠ Jelly, böylece gönderebilirsiniz.
Outgolfer Erik

Akıllı çözüm, kareleme düşünmüyordu.
Skidsdev

1
Büyük, sadece emin olmak istedim, sadece çözümünüzü söktüğümü sandım :)
Shaggy

4
@Shaggy, bir çözümü başka bir dile taşımak için herhangi bir kılavuz yoktur; çoğu dilde en iyi uygulamaları sağlayan tek bir optimal algoritma olduğu için korkunç olurdu ve ilk poster dışında hiç kimse algoritma ile kendi başlarına geldiklerini kanıtlayamazdı. Tabii ki eğer bir başkasının çözümünü taşıyorsanız, cevaplarından bahsetmek sadece adil bir oyundur.
Aaron

13

Boşluk , 39 36 bayt


  
   	  
 
  
 	
	 				  
	
  
 


Çevrimiçi deneyin!

açıklama

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'

Başlangıçta -0 veya -1 ile çarpmak istedim çünkü bunlar Whitespace'de bildirmek mümkün olan en kısa rakamlar olacaktı. TIO, -0 ile +0 arasında ayrım yapmaz, bu yüzden dışarıdadır. Ne yazık ki öğretici / spec, negatif bir değerin bir char TIO (doğru olarak) olarak nasıl yorumlanacağı konusunda belirsiz olsa da, geçersiz bir argüman hakkında bir hata atar, böylece bir seçenek de olmaz.

Bir sonraki en kısa çalışma sabiti 4'tür, bu nedenle Powershell / Pyth çözümleriyle aynı temel yaklaşımı uygularız.


Boşluk , 56 53 bayt - karakterleri etiketlemek için haritalar


  
   			                 
 
  
 	
	 				   	
  
 


Çevrimiçi deneyin!

açıklama

Etkili bir önceki sürümle aynı yaklaşım dışında sabit olarak 0xE0000 kullanır ve çarpanlar yerine ekler. Bu, görünür ASCII karakterlerini karşılık gelen Unicode Etiket Karakteriyle (U + E0000-U + E007F aralığı) eşler. Bu aralık için amaçlanan kullanım, düz metin dosyasındaki metnin dilini belirtmekti, ancak bu kullanım önerilmez. 0x01 karakteri olan dizelere önek eklerseniz bu kod geçerli etiketler çıkarır.

Unicode Standardı Bunun daha iyi bir önceki yaklaşımından daha meydan ruhunu karşılayan hissediyorum bu karakterler görünür oluşturmayı sahip aralığı söylüyor.


5
Görünmez metin yazdırmak için görünmez bir program kullanma. Severim.
Mark

7

Japt , 5 2 bayt

cp

Çevrimiçi deneyin


açıklama

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

Hmm, daha yakından incelendikten sonra 126 ** 3 == 2000376, aralıkta olmayan [0..1114111] gibi görünüyor . Yine de kare yapabilirsiniz :) Bunun nedeni UTF-8'in burada bitmesi ve UTF-16'nın devam etmesidir.
Outgolfer Erik

1
@EriktheOutgolfer Ehm. UTF-8, tanımı gereği UTF-16 ile tam olarak aynı aralığa sahiptir. (Teorik olarak, UTF-8, kod noktası başına 5 veya 6 bayt kullanarak daha yüksek kod noktalarını depolayabilir, ancak bu yasadışıdır.)
Bay Lister

5

Brain-Flak , 33 bayt

İçin +1 içerir -c

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

Çevrimiçi deneyin!

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

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

Her karakter değerini kareler sonra yazdırır.

Outgolfer'ın kare çözümü Erik sayesinde 1 byte

Braingolf v0.7, 6 bayt [rakip olmayan]

{.*}&@

Ayrıca her bir değeri kareler yazdırır, ancak v0.7 "foreach" {}döngüsüne sahiptir


4

Mathematica, 48 bayt

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

Açıklama:

                             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

İlginçtir, 96 karakterden oluşan ve 968 değerini 96 benzersiz değere dönüştüren 1000'den az olan iki modül seçeneğinden en düşük iki değer 7'den sonra 33'tür. Diğer 784 modülünü kullansaydım, sayıları aralığın dışına taşımak için 18 ile çarpmam gerekiyordu.

Test durumu.

Not: "ve için kaçış karakterleri olarak ekstra ters eğik çizgiler \. Ayrıca 0x7E karakteri düzgün yapıştırmak istemiyor.

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

Çıktı: enter image description here

Gerçekten uzun olduğu Hashgibi kullanımı ortaya çıktı ToCharacterCode. Ancak hashing neredeyse pahalıydı. Bunu yapmanın kolay matematiksel yolu 49 bayt olacaktır:

FromCharacterCode[4ToCharacterCode@Characters@#]&

2

CJam , 8 5 bayt

l95f+

Çevrimiçi deneyin!

Her kod noktasına 95 ekler.


Bunun yerine çarpmanın veya kare yapmanın bir yolu yok mu?
NieDzejkob

@NieDzejkob Hayır, bu Karakter + Uzun = chr (ord (Karakter) + Uzun) gerçeğine dayanmaktadır. Karakter * Uzun = [Karakter] * Uzun. Karakter # Uzun = hata (# CJam'de imleme).
Outgolfer Erik


2

PowerShell, 32 31 Bayt

-1 neil sayesinde, 99+için4*

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

9'u her karakter koduyla çarpar ve geri yazdırır.


İlgisiz, az sayıda (4-9) ile çarpmak işe yarar mı?
Neil

yazdırılabilir en düşük süreler 4 yazdırılabilir en büyük sürelerden daha büyüktür, bu -1 - teşekkürler!
colsw


1

CJam , 4 bayt

lWf^

XOR'lar her kod noktasını -1 ile gösterir . CJam'ın karakterleri 16 bit genişliğindedir, bu nedenle kod n'yi kod noktası 65535 - n ile eşleştirir .

Çevrimiçi deneyin!


1

Ondalık , 37 bayt

91D31030030012255D412D590D543D301291D

Açıklama:

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

Çevrimiçi deneyin!


yani sıfıra ( 90D) atlamak sona erer mi?
Skidsdev

@Mayube Kesinlikle.
MD XF

1

Google E-Tablolar, 68 bayt

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

Bunu, E-Tablolar'da bazı temel işlevleri yapmanın ne kadar garip olduğunu göstermek için göndermek istedim. Bir hücredeki her karakter için ve birleştirilmiş sonucun dışında bir işlem yapmak istiyor musunuz? Bu karakterlere etki etmeden önce 42 bayttasınız .

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

Aksi takdirde, bu diğer çözümlerle aynıdır: her karakterin kod noktasının karesini alın.




0

Temiz , 25 bayt

import StdEnv

map((+)'~')

Kısmi işlev değişmezi.

Çevrimiçi deneyin!

Gerçekçi:

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

Aynı türdeki ( {#Char} -> {#Char}) kutulanmamış bir dizi üzerinden kutulanmamış dizi anlama . Clean, benzersizliğin aktarılabilir ( !u:{#Char} -> u:{#Char}) olduğunu ve boyutun giriş boyutuyla aynı olduğunu belirleyebilecektir. Bu demektir ki bir*String , her karakterin çıktıdaki karşılık gelen karakterle yıkıcı bir şekilde güncelleneceği anlamına gelir, yani bellek tahsisi veya hareketi yapılmaz ve grafik düğümü tamamen yeniden kullanılır.

Çevrimiçi deneyin!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.