実際の不可視テキストを印刷する


15

私の以前の課題である、目に見えないテキスト印刷することは非常に一般的でした。

しかし、あなたをもっと注意深く見ている人は、出力だけでは入力されたものを読むことは不可能なので、実際には目に見えないテキストを印刷していないことに気付いているかもしれません。

だから私は本当の目に見えないテキストの挑戦はどうだろうと考えました。

印刷可能なASCII文字(0x20-0x7E)のみで構成される文字列が与えられた場合、各文字を95の印刷可能なASCII文字(0x20-0x7E範囲外のUTF-8文字)のいずれでもない個別のUnicode文字(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は文字セットではなくUnicodeのシリアル化です。また、Unicodeコンテキストで「非印刷可能」が理にかなっている場合、「数十万の割り当てられたコードポイントのうち95を除くすべて」よりもはるかに狭いことは確かです。
ピーターテイラー

11
@PeterTaylorここで文字の16進コードについて話していることを考えると、UTF-8文字を言うとき、UTF-8エンコードのUnicode文字を意味することは明らかだと思いました。ASCIIは文字セットではなくエンコーディング標準でもありますが、「ASCII文字」という用語には問題がありません。とにかく、明確にするために文言を編集します。
Skidsdev

3
UTF-8が必要な特別な理由はありますか?
CalculatorFeline

入力を空にすることはできますか?
デニス

1
「印刷できない文字を印刷できない場合」の+1
ロバートフレーザー

回答:


13

ゼリー、3バイト

O²Ọ

オンラインでお試しください!

各コードポイントを二乗します。


私が思いついたJaptソリューションと非常によく似ています。コードポイントを2乗する代わりに立方体化することを期待してください。
シャギー

2
@Shaggy Japt≠Jellyなので、投稿できます。
エリックアウトゴルファー

巧妙なソリューション、二乗を考えていませんでした。
Skidsdev

1
グランド、確かにしたかった、私はちょうどあなたのソリューションを食い物にしていると思わないように:)
シャギー

4
@Shaggyは、ソリューションを別の言語に移植することに対するガイドラインはありません。通常、ほとんどの言語で最適な実装を提供する最適なアルゴリズムが1つあるため、ひどいものになります。最初の投稿者以外は、自分でアルゴリズムが付属していることを証明できません。もちろん、実際に他の誰かのソリューションを移植する場合、彼らの答えに言及するのはフェアフェアです。
アーロン

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文字が対応するUnicodeタグ文字(U + E0000-U + E007Fの範囲)にマップされます。この範囲の使用目的は、プレーンテキストファイル内のテキストの言語を示すことでしたが、その使用は推奨されません。文字列の前に0x01文字を付けると、このコードは有効なラベルを出力します。

Unicode標準は、私はこれが良く、前のアプローチよりもチャレンジ精神を満たしている感じるように、この範囲内の文字が目に見えるレンダリングを持っていないと言います。


5
不可視のプログラムを使用して不可視のテキストを印刷します。好き。
マーク

7

Japt5 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が続くためです。
エリックアウトゴルファー

1
@EriktheOutgolferエム。UTF-8は、定義によりUTF-16とまったく同じ範囲を持ちます。(理論的には、UTF-8はコードポイントごとに5または6バイトを使用して、より高いコードポイントを格納できますが、それは違法です。)
ミスターリスター


4

Braingolf v0.6、17バイト

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

各char値を2乗してから印刷します。

Erik the Outgolferの平方ソリューションのおかげで-1バイト

Braingolf v0.7、6バイト[非競合]

{.*}&@

また、各値を2乗して出力しますが、v0.7には「foreach」{}ループがあります


4

Mathematica、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

興味深いことに、モジュラス978で96文字を96個の一意の値に変更した1000未満の2つのモジュラスオプションのうち、最低の2つの値は7で33でした。他の784のモジュラスを使用した場合、範囲外に数値を移動するには18を掛ける必要がありました。

テストケース。

注:"およびのエスケープ文字としての追加のバックスラッシュ\。また、文字0x7Eは正しく貼り付けたくないようです。

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

出力: enter image description here

本当に長いHashので、の使用が生まれましたToCharacterCode。ただし、ハッシュ化はほぼ同じくらい高価でした。これを行う簡単な数学的な方法は49バイトです。

FromCharacterCode[4ToCharacterCode@Characters@#]&

2

CJam8 5バイト

l95f+

オンラインでお試しください!

各コードポイントに95を追加します。


代わりに乗算または二乗する方法はありませんか?
-NieDzejkob

@NieDzejkobいいえ、これはCharacter + Long = chr(ord(Character)+ Long)という事実に基づいています。キャラクター*ロング= [キャラクター] *ロング。文字#長い=エラー(#はCJamのべき乗)。
エリックアウトゴルファー


2

PowerShell、32 31バイト

-1ニールに、感謝99+します4*

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

9を各文字コードで乗算し、出力します。


興味のないことですが、小さな数(4-9)を掛けると効果がありますか?
ニール

最小の印刷可能時間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

オンラインでお試しください!


ゼロ(90D)へのジャンプは終了しますか?
Skidsdev

@Mayubeまさに。
MD XF

1

Googleスプレッドシート、68バイト

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

これを投稿して、スプレッドシートでいくつかの基本的な機能を実行することがいかに厄介かを示したかったのです。セル内のすべての文字に対して操作を実行し、連結された結果を出力しますか?これらの文字を操作する前でも、42バイトです。

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

それ以外の場合、これは他のソリューションと同じです。各文字のコードポイントを2乗します。




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.