あなたのタスクは、プログラムのソースコードに表示されない印刷可能なASCIIスペース(0x20
to 0x7e
)の文字を印刷する(ただし、印刷可能なASCII文字および/またはタブと改行のみを使用して)プログラムを構築することです(ただし、任意の順序で何回もしたい)。
どの言語でもこれを行う最短のコードが優先されます。
あなたのタスクは、プログラムのソースコードに表示されない印刷可能なASCIIスペース(0x20
to 0x7e
)の文字を印刷する(ただし、印刷可能なASCII文字および/またはタブと改行のみを使用して)プログラムを構築することです(ただし、任意の順序で何回もしたい)。
どの言語でもこれを行う最短のコードが優先されます。
回答:
#undef X;A!"$%&'()*+-[,.]/0123456789:<=>?@BCDEFGHIJKLMNOPQRSTUVWYZ\^_`abcghijklmopqrstvwxyz{|}~
tclsh
、bash
、sh
、ksh
、など)main()
必要ない場合。ウロゲンのおかげで何もしません。
#undef X;whatever junk you want
動作します。
#
RubyやPerlなどのコメントに使用するため)
<?<<
のNYUIOMK()'DEAQRWVX[Z]\^@CBGFJqwv{z}|~`bgfkj203547698;=>!#"%$&+*-.php
どこかにあるファイルとして保存します/home
。short_open_tag
にある必要がありOn
ますphp.ini
。
出力は次のとおりです。
PHP Parse error: syntax error, unexpected T_SL in /home/wherever/NYUIOMK()'DEAQRWVX[Z]\^@CBGFJqwv{z}|~`bgfkj203547698;=>!#"%$&+*-.php on line 1
:
、出力を確認できます。
alert("BCDFGHIJKMNPQUVXYZ".toLowerCase())// !#$%&'*+,-0123456789:;<=>?@[\]^_`{|}~AERTOWS
「bcdfghijkmnpquvxyz」を印刷します
"!#$%&*+,-13:<=>?@[\]^_`{|}~AERTOWS";alert('BCDFGHIJKMNPQUVXYZ'.toLowerCase()+95*72)
ので、95*72
= 6840
と文字列に無駄な文字を移動するには、あなたの代わりにそれらを無駄に引用符を使用することができます。それに加えて、コメント内の文字を隠すことは安っぽい感じがします。
これは最短ではありませんが、おそらく最も単純なロジックを持っています(実際には単なるループです)。
ここでは完全にコメント化されています。Sはスペース、Tはタブ、Lは改行です。
SSSTSSSSSL # push 0x20
LSSSL # label S
SSSTL # push 1
TSSS # add
SLS # duplicate top of stack
SLS # duplicate again
TLSS # output ASCII character
SSSTTTTTTSL # push 0x7E
TSST # subtract (result - 0x7E)
LTTSL # branch to label S if top of stack is negative
LLL # end
上記の修正(分岐命令に余分な重複が必要)と、スタックにプッシュする小さな数字の@resに感謝します。
SSSTSSSSSL LSSSL SSSTL TSSS SLS SLS TLSS SSSTTTTTTSL TSST LTTSL LLL
。
LSSSL
なりLSSL
、にLTTSL
なりLTTL
)、最後の出口(3つLLL
)を削除することで5バイトをゴルフできます。オンラインで生の52バイトを試すか、ここで強調表示と説明を行います。
main(z) {for(;++z<96;"\33iE!vk?}GkRP8z"[z/7]&1<<z%7&&putchar(z+32));}
本当に80文字以下にしようと試みましたが、それを実現することができませんでした。私(または他の誰か)がこれを投稿してから10分後に79文字の解決策を見つけ出すという前提で、私は最終的に自分の持っているものを投稿することにしました。さて、10分ではありませんでしたが、原理的には機能していました。
私はソースコードに無料のスペースを必要としないバージョンを投稿したかったが、それは奇妙なアトラクタ軌道に着陸し、いくつかの解決策の間で跳ね返った。それらの1つを安定したソリューションにナッジしようと何分も試みた後、私はあきらめてスペースを追加しました。
"126,32>''+".~\-'.~\-"'-
範囲生成スクリプトを取得し、複製し、実行し、その結果から減算し、結果の減算コードと他の引用文字を減算します。
''+
、減算の前にプログラムをエスケープ、noopを挿入.;
(ドットをカバーするより良い方法を見つけられなかった)、stringの代わりにコードブロックを使用-> {126,33>`-.;}.~
16文字
コンテストに勝っていないことは知っています。キックのためだけに、通常は使用しない言語で試してみたかっただけです。
class a{public static void main(String[]a){for(char c=0;;c++)System.out.print("publicas{tvodmn(Srg[])h=0;w+ye.\"\\xO<?:}".indexOf(c)<0?c:"");}}
改行とタブあり
class a{
public static void main(String[]a) {
for(char c=0;;c++)
System.out.print("publicas{tvodmn(Srg[])h=0;w+ye.\"\\xO<?:} ".indexOf(c)<0?c:"");
}
}
実行する場合は注意してください:プログラムは終了しません。ハハ
説明
for(char c=0;;c++)
:a char
はとして扱うことができるため、int
ここでの利点を生かして、可能なすべての値をインクリメントしますc
。プログラムを終了するように指定されていないため、文字を保存するために、ループ内の終了条件(2つのセミコロンの間に入る条件)を省略します。:)"publicas{tvodmn(Srg[])h=0;w+ye.\"\\xO<?:} ".indexOf(c)<0?c:""
:残念ながら、非常にエレガントなアプローチではありませんが、仕事は完了します。ソースコードに存在するすべての文字をString
リテラルとして手動でリストし、で現在の文字char c
が出現するかどうかを確認しindexOf()
ます。indexOf()
呼び出しがを返す場合-1
、それは存在しないため、印刷する必要があります。残りの部分では、三項演算子を使用して文字とスペースを節約します。(?!..?~).map{|a|$><<a if/[()ifmap{}|?!.~\/\\\[\]$><]/!~a}
単に自分自身をチェックします。重複する文字は手動で削除されました。
4文字を保存してくれたJoshと、5文字を保存してくれたminitechに感謝します!
(?!..?~).map{|x|$><<x if/[()ifmap{}|x?!.~\/\\\[\]$><]/!~x}
(?!..?~).map{|a|$><<a if/[()ifmap{}|?!.~\/\\\[\]$><]/!~a}
$><<((32..126).map(&:chr)-IO.read(__FILE__).chars).join
別のアプローチを使用した55バイト。
それほど深刻ではありませんが、試してみる必要がありました。
元のソース:
for(x=0x7e;x>0x19;x--){
console.log(String.fromCharCode(x).replace(/[\[\]!\+\(\)]/ig, ''))
}
()+ []!を除くすべての文字を出力します!
(x)
<=> [x][+[]]
、コードサイズを増やしますが、必要なアルファベットを小さくします。
あなたの仕事は、プログラムを構築することです(印刷可能なASCII文字やタブ、改行のみを使用)
まあ、あなたはAPLのためにそれを難しくしました(それはデリバレートですか?)
私はすべてのルールを無視することにしました!!!
⎕AV
原子ベクトル(印刷可能なすべてのASCII文字を含む)を出力します
「なし」の部分を完全に忘れてい
たことがわかりました... しかし、それは簡単な修正です
⎕AV~'AV'''
~'AV'''
除外することを意味します(~
、文字A、V、および単一引用符(二重引用符としてエスケープ))します
非ASCIIの印刷については、まあ、すべてのルールを無視しています。
0x20
to 0x7e
)の文字を正確に出力します」出力に印刷可能なASCIIスペース以外の文字が含まれていない可能性があります(キーワードは「正確に」) 、プログラムには「A」と「V」が含まれているため、印刷しないでください。
~
、除外された文字のセットに追加する必要があります。;-)ところで、同様のJソリューションはa.-.'a.-'''
"),@`^^32>#.~".~
正当性チェックを行い、エラーのある文字数を出力する追加の行を含むオンラインデモ。
。(私は、様々な同等の選択肢を持っている@`^
と置換することができる\\`
。#
と交換することができる`
か、]
バックスラッシュはブロックで、彼らは文字列リテラルで行う方法をエスケープする必要はありませんので、正しい組み合わせは15の彼のスコアを等しくなるようにハワードのトリックで使用できます。{),\`^32>].~}.~
。しかし、ハワードはそのトリックの功績に値する)。
}~
-コードブロックの場合はさらに良いです。私の新しい答えを参照してください;-)
編集:ダウ、忘れてしまった e.
'''(-@.e#[)~95{32}a'(-.@e.#[)~95{.32}.a.
旧版:
(>@(*/@('(>@*/''&~:).#]32{95}a'&~:)&.>)#])95{.32}.a.
他のバリアント(同じ長さですが、出力は少ない):
([#~*/"1@('([#~*/"1@''&:0)95{.32}a'&~:"0))95{.32}.a.
x=r"print(*set(map(chr,range(32,127)))-set(x+'=\"'))"
exec(x)
...改善してくれた@WolframHに感謝します。
exec(x)
、新しい行にし、保存;
中にx
。また、Python 3では、x=r"print(*set(map(chr,range(32,127)))-set(x+'=\"'))"\nexec(x)
61文字に使用できます(複数スペースを印刷できます)。
保存してスクリプトとして実行する必要があります。
diff([char[]](gc $MyInvocation.InvocationName))([char[]](32..126))-Pa|?{$_.SideIndicator-eq'=>'}
diff
はの組み込みエイリアスですCompare-Object
。
gc
はの組み込みエイリアスですGet-Content
。
$MyInvocation.InvocationName
実行中のスクリプトへのフルパスを取得します。
32..126
はに相当する10進数であるため0x20..0x7e
、探している10進数のASCIIコードの配列を作成します。
[char[]]
次のオブジェクトの内容を取得して配列に入れ、それらを分割してASCII文字に変換します。したがって、ASCII文字の2つの配列があります。1つはこのスクリプトから取得され、もう1つはチャレンジ基準によって定義されています。
-Pa
セット Compare-Object
「パススルー」形式にれるため、入力間で異なることが判明したアイテムのみがコンソールに出力されます。どのアイテムが入力されたのかは、オブジェクトのデータに保存されますが、表示されません。
|?{$_.SideIndicator-eq'=>'}
pipes Compare-Object
の出力先Where-Object
、2番目の入力専用のアイテムのみにフィルターします。
<? //A"$%&'()*+[,.]0123456789:=-@ABCDEFGHIJKLMNOPQRSTUVWYZ\^_`abcdefghijklmopqrstuvwxyz{|}~#
出力:
何もない
OPは未使用の文字をすべて印刷するように要求します。
<?='A"$%&\'()*+[,.]/0123456789:=-@ABCDEFGHIJKLMNOPQRSTUVWYZ\^_`abcdefghijklmopqrstuvwxyz{|}~#'
?
!;>Xn
Javascript、92
(function f(){for(i=32;126>i++;)!~(""+f).indexOf(c=String.fromCharCode(i))&&console.log(c)})()
最小化:
class hjq{public static void main(String...w){for(char z='"'|0;++z!='a';)if("'()+.0;=OS".indexOf(z)==~0)System.out.print(z);}}
最小化されていない:
class hjq {
public static void main(String... w) {
for (char z = '"'|0; ++z != 'a';) {
if ("'()+.0;=OS".indexOf(z) == ~0) {
System.out.print(z);
}
}
}
}
これは興味深い問題です。なぜなら、個々のトークンは文字を再利用するため、より長い形式の恩恵を受ける可能性があるからです。たとえば、通常String[]
は短くなりString...
ますが、条件付き文字列の角括弧は不要です。
範囲の最初と最後で文字を使用してみて、ループの開始と終了を変更するだけで出力から除外できるようにするのがコツだとわかりました。
Javaの場合、除外するキー文字はです"
。これを文字列に含めるにはエスケープする必要がある\
ため、プログラムに追加し、文字列に追加する必要があります\\
。除去することにより"
、あなたの条件付き文字列から、あなたは4つの文字を削除します。これは、を使用し
!
、からループを開始することで確認できます#
。
すべて小文字だけで、範囲の終わり近くに現れ{
、|
、}
および~
それらの後に来ます。Javaの冗長性のため、小文字のほとんどは定型文にのみ使用されます。同様に、{
かつ}
定型がそれらを必要とするため、Javaプログラムのために些細です。
|
または条件がある場合に使用できますが|
、ビット演算子として使用するよりも短いプログラムにつながるものを利用する方法を見つけることができませんでした。|0
それはちょうどそこに文字を取得するにはNOPです一部だけだから、私は、少し汚れを感じさせます。
~0
yieldsは-1
、で確認する必要があるため便利indexOf
です。これと組み合わせて!=
for条件付きループにすると、<
文字が完全に削除されます。つまり、条件付き文字列の中に入れる必要はありません。
tr</dev/urandom -cd \[:print:]|tr -d "`cat $0`"
自己参照アプローチを使用します。想定/dev/urandom
最終的にすべてのオクテットを少なくとも1回出力するとます。終了しません。
それman
がインストールされていると仮定すると、代わりにascii(7)
マンページを使用できます(したがって、終了プログラムがあります)(44文字、@ fennecに感謝します)。
man ascii|tr -cd \[:print:]|tr -d "`cat $0`"
man
とzsh
インストールされている、man zshall
基準に適合しているようです。これをバリエーションとして追加できます。
tr
を使用していますか?GNU tr
は-
in " cat $0
"を範囲演算子として出力を中断します。
ascii
プログラムがインストールされている、の代わりにそれを使用できますman ascii
。
ビットシフトは唯一のサポート言語である0
と1
構文として。他のすべての文字を印刷するのは簡単だと思いましたが、ループを実際にサポートしていないため、それでも1038バイトの大容量になりました。
しかし、これより小さくすることは実際には不可能だと思います。
101001100101011011010100110111010100100101011001101111010100100101011001000101011011010100101100110110101001001010110010001010110110101000001101010010010101100100010101101101010000010000011001010110110101000010000101011011010100110111010100100101011111100101011011010100110111010100100101011001101111010100100101011001000101011011010100000000011010100100101011001000101011011010100110010000101011011010100110111010100100101011001101001101010010010101100100010101101101010011001000010101101101010011011101010010010101111011111110010101101101010011011101010010010101100101100101011011010100010001010110110101001000010101101101010011011101010010010101110111110010101101101010011011101010010010101111111100101011011010100110111010100100101011111011110101001001010110010001010110110101001000100000101011011010100110111010100100101011111010011010100100101011001000101011011010100100000101011011010100110111010100100101011001101111010100100101011001000101011011010100010000010101101101010011011101010010010101101001101101010010010101101001101010
プリント
!"#$%&'()*+,-./23456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
ここでは間違いなく最も長いソリューションですが、Linoでのコーディングは常に楽しいものです。
"libraries"/arch/cpu/base;/hmi/conout;/data/bytes;/data/string/t2s;/data/heap;/data/heap/connect/mgrab;"stockfile"a;"directors"displaystatus=engage;"injection"c=524;b<-bytes.bytesizeconvert:c;b<-heap.alloc:b;a<-heap.alloc:c;[filecommand]=readfile;[filename]=stockfile;[fileposition]=0;[fileblocksize]=c;[fileblockpointer]=b;arch.fileread;[string.psource]=b;[string.ptarget]=a;string.t2s;b<-heap.alloc:7fh;c=32;d=b;"f"[d_32]=c;+c;+d;?c<7fh>f;"w"d=[a];+a;?d=0>y;?d<32>w;?d>7eh>w;e=b;e+d;[e]=33;^w;"y"b+32;"v"conout.say:b;bye;
コメントはありません。バイナリにコンパイルされたソースを読み取るだけです。名前を付けて保存しa.txt
ないと、コンパイルされません!
++++++++++++++++[->++++++>++>+++>++++>++<<<<<]>-->>->->+[---<.+.+<.+<.+<.+.+.+>>>>]++[-<.+.+.+<.+>>]<+.<+.<++.
以前のソリューションを少しいじりました(以下が小さいことに気づく前に-これはいくつかの最適化を行う前でしたが)。これは、4組のASCII番号を保存し、それらをトリッキーなループで印刷し、その後欠落している文字(つまり、無効なASCII番号の間にある文字)を出力することによって機能します。
元の提出
>>+++++++++++[<+<+>>->++>+++<<]<++>>++++++>>+++++[-<<<++++++>>>]<<<+<<[->>+.<<]>>++.++<[->+.<]>++.+>[-<+.>]<++.+>>[-<<+.>>]
次のことを行います。
import Data.List
main=putStrLn$[' '..'~']\\" \\\"$'.=DLS[]aimnoprstu~"
ストリング内のプログラム内の退屈な重複文字、ユニバーサルセットからの減算ソリューション。コードゴルフの勝者とはほど遠いが、その長さは驚くほど読みやすい。
(filter
/の代わりにリスト減算を使用notWith
)
import Data.List
することができますimport List
runhaskell
「モジュール 'List'が見つかりませんでした」で試してみると、動作しないようです。しかし、文字数を誤って数えることに気づいたので、修正しました。
Clojure(142、106、103)
(defn -main[](let[c"(fn[l](pr(reduce disj(set(map char(range 32 126)))l)));-\\\"o"]((load-string c)c)))
フォーマット済み:
(defn -main []
(let [c "(fn[l](pr(reduce disj(set(map char(range 32 126)))l)));-\\\"o"]
((load-string c) c)))
これはそれを行うと思う、いくつかの微調整が必要な場合があります。出力:
#{@ ` ! A B b # C $ D % E & F ' G H I * J + K k , L M . N / O 0 P Q q R S 4 T 5 U V v 7 W w 8 X x 9 Y y : Z z { < | = } > ^ ? _}
評価可能なclojureコードである文字列をそれ自体で実行します。文字列は、文字列の外側で使用される文字を取得するためのコメントを最後に持っています(mainメソッドなど)
for x in range(38):print chr(x+59)#!"$%&'*,-./012467bdjklmqsuvwyz{|}~
最長の(見つけることができる)連続した文字のシーケンスを使用します。コードの後に印刷して他のコメントをコメントとして追加できます。
0x20
からまでの範囲ではありません0x7e
。技術的には、タブと改行は実際には制御文字です。