Wydrukuj prawdziwy niewidoczny tekst

15

Moje poprzednie wyzwanie, Drukuj niewidoczny tekst było dość popularne, prawdopodobnie z powodu jego trywialności.

Jednak ci bardziej spostrzegawczy mogli zauważyć, że tak naprawdę nie drukujesz niewidocznego tekstu, ponieważ niemożliwe jest odczytanie tego, co zostało wprowadzone, biorąc pod uwagę tylko wynik.

Pomyślałem więc, co powiesz na prawdziwe niewidzialne wyzwanie tekstowe.

Biorąc pod uwagę ciąg znaków składający się tylko z drukowalnych znaków ASCII ( 0x20-0x7E), przekonwertuj każdy znak na odrębny znak Unicode (w kodowaniu UTF-8), który nie jest jednym z 95 drukowanych znaków ASCII (dowolny znak UTF-8 spoza 0x20-0x7Ezakresu)

Wejście

Ciąg znaków drukowalnych ASCII, jako ciąg znaków lub tablica znaków / lista

Wynik

Ciąg wejściowy z każdym znakiem zastępowany odrębnym znakiem, który nie może być wydrukowany. Każdy dany znak musi mieć odpowiadający znak niedrukowalny, który nie jest używany jako zamiennik żadnego innego znaku.

Jeśli nie możesz wydrukować znaków niedrukowalnych, możesz zamiast tego wydrukować wartości znaków.

Na przykład jeśli Twój kod zastępuje wszystkie małe a„sz 0x01, nie może wykorzystywać 0x01jako substytutu innych znaków.

Twój kod musi być również deterministyczny . Oznacza to, że jeżeli dany ciąg Hello, wszystkie małe l„s są zastąpione 0x03, kod musi również wymienić wszystkie małe l” s z 0x03danej jakiegokolwiek innego napisu.

Przypadki testowe

Trochę trudno jest napisać przypadki testowe dla tego wyzwania, więc po prostu pokażę dane wyjściowe jako listę kodów szesnastkowych

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]

Tabela liderów

Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.

Skidsdev
źródło
9
Nie ma czegoś takiego jak znak UTF-8: UTF-8 jest serializacją Unicode, a nie zestawem znaków. A jeśli „niedrukowalne” ma sens w kontekście Unicode, z pewnością jest znacznie węższe niż „wszystkie oprócz 95 z setek tysięcy przydzielonych punktów kodowych”.
Peter Taylor
11
@PeterTaylor Biorąc pod uwagę, że mówimy tutaj o kodzie szesnastkowym znaków, przyjąłem, że było jasne, że kiedy mówię znak UTF-8, mam na myśli znak Unicode w kodowaniu UTF-8. ASCII jest także standardem kodowania, a nie zestawem znaków, ale ludzie nie mają problemu z terminem „znak ASCII”. W każdym razie zmienię sformułowanie, aby wyjaśnić.
Skidsdev
3
Czy jest jakiś konkretny powód UTF-8?
CalculatorFeline
Czy dane wejściowe mogą być puste?
Dennis
1
+1 za „Jeśli nie możesz wydrukować znaków, których nie można wydrukować”
Robert Fraser

Odpowiedzi:

13

Galaretka , 3 bajty

O²Ọ

Wypróbuj online!

Kwadratuje każdy punkt kodowy.

Erik the Outgolfer
źródło
Bardzo podobny do rozwiązania Japt, które wymyśliłem, spodziewam się, że obliczyłem kod zamiast punktu do kwadratu - czy zgadzasz się na opublikowanie go?
Kudłaty
2
@Shaggy Japt ≠ Galaretka, więc możesz to opublikować.
Erik the Outgolfer
Sprytne rozwiązanie, nie myślałem o kwadracie.
Skidsdev
1
Wspaniale, chciałem się upewnić, żebyś nie pomyślał, że po prostu zdzieram twoje rozwiązanie :)
Kudłaty
4
@Shaggy nie ma żadnych wskazówek dotyczących przenoszenia rozwiązania na inny język; gdyby tak było, byłoby to okropne, ponieważ zwykle istnieje jeden optymalny algorytm, który zapewnia optymalne implementacje w większości języków, a nikt oprócz pierwszego plakatu nie byłby w stanie udowodnić, że przyszedł z algorytmem samodzielnie. Oczywiście, jeśli rzeczywiście przeniesiesz rozwiązanie kogoś innego, to tylko fairplay wspomnieć o jego odpowiedzi.
Aaron
13

Biała spacja , 39 36 bajtów


  
   	  
 
  
 	
	 				  
	
  
 


Wypróbuj online!

Wyjaśnienie

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'

Początkowo chciałem pomnożyć przez -0 lub -1, ponieważ byłyby to najkrótsze cyfry możliwe do zadeklarowania w białej spacji. TIO nie rozróżnia między -0 a +0, więc to nie działa. Niestety, podczas gdy samouczek / specyfikacja nie są jednoznaczne, jak interpretować wartość ujemną jako znak TIO (słusznie) zgłasza błąd dotyczący nieprawidłowego argumentu, więc również nie jest to opcja.

Następna najkrótsza stała robocza to 4, więc w rezultacie wykonujemy to samo podstawowe podejście, co rozwiązania Powershell / Pyth.


Biała spacja , 56 53 bajtów - mapy do oznaczania znaków


  
   			                 
 
  
 	
	 				   	
  
 


Wypróbuj online!

Wyjaśnienie

Efektywnie takie samo podejście jak w poprzedniej wersji, z tą różnicą, że używa 0xE0000 jako stałej i dodaje zamiast mnożenia. Spowoduje to odwzorowanie widocznych znaków ASCII na odpowiedni znak znacznika Unicode (zakres U + E0000-U + E007F). Zamierzonym zastosowaniem tego zakresu było wskazanie języka tekstu w pliku jawnego tekstu, jednak użycie to jest odradzane. Ten kod wyświetli prawidłowe etykiety, jeśli poprzedzisz ciąg znaków znakiem 0x01.

Standard Unicode mówi, że znaki w tym zakresie nie mają widocznego rendering tak czuję, że to spotyka ducha wyzwanie lepiej niż poprzedniego podejścia.

Ephphatha
źródło
5
Korzystanie z niewidzialnego programu do drukowania niewidzialnego tekstu. Lubię.
Mark
7

Japt , 5 2 bajty

cp

Wypróbuj online


Wyjaśnienie

     :Implicit input of string U
c    :Map over the character codes of the string.
p    :Square them.
     :Implicit output of result.
Kudłaty
źródło
Hmm, po bliższym przyjrzeniu się wydaje się, że 126 ** 3 == 2000376to nie jest w zakresie [0..1114111]. Nadal możesz jednak wyrównać :) To dlatego, że UTF-8 się tam kończy, podczas gdy UTF-16 trwa.
Erik the Outgolfer
1
@EriktheOutgolfer Ehm. Z definicji UTF-8 ma dokładnie taki sam zakres jak UTF-16. (Teoretycznie UTF-8 może przechowywać wyższe punkty kodowe, używając 5 lub 6 bajtów na punkt kodowy, ale jest to nielegalne.)
Pan Lister
5

Brain-Flak , 33 bajty

Obejmuje +1 dla -c

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

Wypróbuj 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
}<>
Riley
źródło
4

Braingolf v0.6, 17 bajtów

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

Kwadraty każdej wartości char następnie drukuje.

-1 bajt dzięki rozwiązaniu Erika the Outgolfer

Braingolf v0.7, 6 bajtów [nie konkuruje]

{.*}&@

Również kwadratuje każdą wartość, a następnie drukuje, ale v0.7 ma {}pętlę „foreach”

Skidsdev
źródło
4

Mathematica, 48 bajtów

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

Wyjaśnienie:

                             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

Co ciekawe, z dwóch opcji modułu mniejszych niż 1000, które zmieniły 96 znaków na 96 unikatowych wartości z modułem 978, dwie najniższe wartości wynosiły 7, a następnie 33. Na szczęście czasy o 4 konwertują to na 28 i 132, które po prostu nie mieszczą się w widocznym zakresie. Gdybym użył drugiego modułu 784, musiałbym pomnożyć przez 18, aby przenieść liczby poza zakres.

Przypadek testowy.

Uwaga: dodatkowe odwrotne ukośniki jako znaki specjalne dla "i \. Również znak 0x7E nie chce poprawnie wkleić.

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

Wynik: enter image description here

Korzystanie z Hashpojawiło się, ponieważ ToCharacterCodejest naprawdę długie. Jednak mieszanie było prawie tak drogie. Prostym sposobem matematycznym na wykonanie tego byłoby 49 bajtów:

FromCharacterCode[4ToCharacterCode@Characters@#]&
Ian Miller
źródło
2

CJam , 8 5 bajtów

l95f+

Wypróbuj online!

Dodaje 95 do każdego punktu kodowego.

Erik the Outgolfer
źródło
Czy zamiast tego nie ma sposobu na pomnożenie lub kwadrat?
NieDzejkob
@NieDzejkob Nie, jest to oparte na fakcie, że znak + Long = chr (ord (Character) + Long). Znak * Długi = [Znak] * Długi. Znak # Long = błąd (# to potęgowanie w CJam).
Erik the Outgolfer
2

Pyth, 6 bajtów

smC*4C

Wypróbuj tutaj.

Mnoży każdy punkt kodowy przez 4.

Erik the Outgolfer
źródło
2

PowerShell, 32 31 bajtów

-1 Dzięki neil, 99+do4*

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

mnoży 9 przez każdy kod znaku i drukuje go z powrotem.

colsw
źródło
Czy w interesie byłoby pomnożenie przez małą liczbę (4-9)?
Neil
najniższe czasy do wydrukowania 4 są większe niż największe do wydrukowania, to -1 - dzięki!
colsw
1

CJam , 4 bajty

lWf^

XORs każdy punkt kodowy z -1 . Znaki CJam mają szerokość 16 bitów, więc mapuje to punkt kodowy n na punkt kodowy 65535 - n .

Wypróbuj online!

Dennis
źródło
1

Dziesiętny , 37 bajtów

91D31030030012255D412D590D543D301291D

Wyjaśnienie:

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

Wypróbuj online!

MD XF
źródło
więc przeskakiwanie do zera ( 90D) kończy się?
Skidsdev,
@Mayube Dokładnie.
MD XF
1

Arkusze Google, 68 bajtów

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

Chciałem to opublikować, aby pokazać, jak niewygodne jest wykonywanie podstawowych funkcji w Arkuszach. Czy chcesz wykonać operację dla każdej postaci w komórce i wyciągnąć konkatenowany wynik? Masz 42 bajty, zanim zaczniesz działać na tych postaciach.

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

W przeciwnym razie jest to to samo, co w przypadku innych rozwiązań: wyprostuj punkt kodowy każdego znaku.

Inżynier Toast
źródło
0

Python 3, 40 38 bajtów

print ([chr (ord (x) * 9) dla x na wejściu ()])

Wypróbuj online!

Alex
źródło
0

C, 42 bajty

c;f(){while(~(c=getchar()))putwchar(c*c);}

Zakłada ustawienia regionalne UTF-8. Dane wejściowe są podniesione do kwadratu.

Wypróbuj online!

MD XF
źródło
0

Czysty , 25 bajtów

import StdEnv

map((+)'~')

Literał funkcji cząstkowej.

Wypróbuj online!

Realistycznie:

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

Zrozumienie tablicy rozpakowanej nad tablicą rozpakowanego tego samego typu ( {#Char} -> {#Char}). Clean będzie w stanie ustalić, że niepowtarzalność jest przenoszalna (!u:{#Char} -> u:{#Char} ) i że rozmiar jest taki sam jak rozmiar wejściowy. Oznacza to, że jeśli zdasz*String , każdy znak zostanie destrukcyjnie zaktualizowany z odpowiadającym mu znakiem na wyjściu, co oznacza, że ​​nie dokonuje się alokacji pamięci ani ruchu, a węzeł wykresu jest w pełni ponownie wykorzystywany.

Wypróbuj online!

Obrzydliwe
źródło