アルファベットだけを使用して、「そして彼女は「しかし、それは彼だ」と言った」というフレーズを印刷


50

And she said, 'But that's his.'次の文字のみを使用してフレーズを印刷しabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ます。句読点やアルファベット以外の文字は一切使用しません。任意のプログラミング言語を使用できます。空白は完全に許可されます。最短のプログラムが勝ちます。


出力の空白はどうですか?(リーディング/トレーリング?)
attinat

2
くそー、のみで出力を生成する機能がないため、私のesolangは完了できませんa-zA-Z。理論的にはwriteとEvalを使用して必要な命令を作成+-*,%'"できますが、いずれも(少なくとも)1つを使用しないと構築できません+-*,%'"0-9
Draco18s

10
(programmer-of (language 'lisp))これが嫌いです。
マシューロック

4
認めざるを得ない、私はこれが最初は特に興味深いとは思わなかったが、繰り返されたユニークなキャラクターの組み合わせは本当に最適化することを本当に面白くした(特にスタック言語で!)。非常に素晴らしい。
brhfl

1
出力に余分な空白が許可されているかどうかを明確にできますか?余分な末尾の改行が好きですか?または、source内の空白文字とアルファベット文字のみ。ありますBefunge答え余分AN改行と版画それは。
ピーターコーデス

回答:


75

空白417の 414 349 265バイト

Kevin Cruijssenのおかげで265バイト

  							
  				   
   		 	
   		
   	 
  		   		 
 	  		
 	  		 
   			 
  		 	
   	 
 	  	 
 	  		 
 	  	
   				
  		  	  
  							
 	  	  
  				 	 
  		 
   		
  		 	
   		 	
 	  	 	
  		
   	 
 	  		
 	  		
  		 
   	   
  		  	 	

  
   		  		 
	   	
  
 


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

説明:

[S S T  T   T   T   T   T   T   N
_Push_-63_'][S S T  T   T   T   S S S N
_Push_-53_.][S S S T    T   S T N
_Push_13_s][S S S T T   N
_Push_3_i][S S S T  S N
_Push_2_h][S S T    T   S S S T T   S N
_Push_-70_space][S T    S S T   T   N
_Copy_0-based_3rd_s][S T    S S T   T   S N
_Copy_0-based_6th_'][S S S T    T   T   S N
_Push_14_t][S S T   T   S T N
_Push_-5_a][S S S T S N
_Push_2_h][S T  S S T   S N
_Copy_0-based_2nd_t][S T    S S T   T   S N
_Copy_0-based_6th_space][S T    S S T   N
_Copy_0-based_1st_t][S S S T    T   T   T   N
_Push-15_u][S S T   T   S S T   S S N
_Push_-36_B][S S T  T   T   T   T   T   T   N
_Push_-63_'][S T    S S T   S S N
_Copy_0-based_4th_space][S S T  T   T   T   S T S N
_Push_-58_,][S S T  T   S N
_Push_-2_d][S S S T T   N
_Push_3_i][S S T    T   S T N
_Push_-5_a][S S S T T   S T N
_Push-13_s][S T S S T   S T N
_Copy_0-based_3rd_space][S S T  T   N
_Push_-1_e][S S S T S N
_Push_2_h][S T  S S T   T   N
_Copy_0-based_3rd_s][S T    S S T   T   N
_Copy_0-based_3rd_space][S S T  T   S N
_Push_-2_d][S S S T S S S N
_Push_8_n][S S T    T   S S T   S T N
_Push_-37_A][N
S S N
_Create_Label_LOOP][S S S T T   S S T   T   S N
_Push_102][T    S S S _Add][T   N
S S _Print_as_character][N
S N
N
_Jump_to_Label_LOOP]

100
Whitespace is completely allowed.あなたは文字通りこれを取っているようです。
ベンジャミンアーカート

3
あなたは私にそれを打ち負かしました。:) NNNprint_charの前に追加を行うとエラーで既に停止しているため、終了する末尾を削除できます。したがって、Jump_to_Labelの後に来ることもありません。また、なぜ63開始時に保存し、ループで取得するのですか?代わりに追加する前にプッシュすることができます。そして、なぜLabel-nrなのTTSSSSTNですか?ラベルは空にすることもできるNSSNため、ラベルNSNNを1つだけ使用している場合は、ラベルを作成してラベルにジャンプするだけで十分です。
ケビンクルーッセン

1
上記で提案した変更で318バイト強調表示が追加された同じプログラムを次に示します。そして、どのようにして定数値を差し引いたの63ですか?ここで可能な限り最短の定数であることは100%確信できません。もしそうなら、私が以前の挑戦のために書いた私の定数生成プログラムに何か問題がある。:)
ケビンクルーッセン

1
うん、正しかった。定数102が最も効率的です:281バイト(またはここでは強調表示されています)。(注:私もの間のスペースのために4つのバイトを保存するために、1つのコピーを使用していたehs dnA間の空間からコピーされた(dias ehs)。
ケビンCruijssen

3
さて、これで完了です。:) 265バイト(またはここで強調表示)。追加のコピーを追加しました。(関連するホワイトスペースのヒント。)
Kevin Cruijssen

62

パール5133の 102 95バイト

s qqAnd she saidZ ZBut thatZs hisZZGjGGfq x
s qZqchr oct oct oct ord chopqge x
y qGjfqqdx
print

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

説明:

正規表現、印刷、およびチョップはすべて$_、デフォルトで変数に適用されます。

s qqAnd she saidZ ZBut thatZs hisZZGjGGfq

空の文字列をに置き換えますAnd she saidZ ZBut thatZs hisZZGjGGf

s qZqchr oct oct oct ord chopqge

それぞれZをevalingの結果に置き換えますchr oct oct oct ord chop。これにより、の最後の文字が削除され、$_キーコードが取得され、8進数として3回解釈され、文字に変換されます。たとえば、j→106→70→56→46→ .

交換の仕組みにより$_、交換の評価中に行われた変更は失われ$_ますAnd she said, 'But that's his.'GjGGf

y qGjfqqd

すべて削除しGj、およびf$_


26
あなただけの文章を入力しようとしましたが、プロセス中にあなたの猫を持つ複数の戦いで得たようにPerlを知らない、それが見えます
popctrl

2
これは私がこのウェブサイトで書いたのを見た中で最も美しいコードかもしれません、そして私はPerlを知っている誰かとしてそれを言います。
シルビオマヨロ

1
関連していますが、置き換えることができるprintsay-2文字のために。現在のメタコンセンサスでは、-M5.010バイトカウントにはカウントしないなどのコマンドラインフラグが記載されています。
シルビオマヨロ

34

> <> 916の 915 903バイト

最初は>>の解決策は不可能だと思っていましたが、その後、条件付き制御や論理制御が必要なのは誰だとわかりましたか?:D

fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffloffffffffffffffffffffffffffffffffffffffffffffflopppgloppppppppppppppppppppppggloffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffflopppggloploppppppppppppppppppppppploffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffflopppppplofffffffflopggloppppppppppppppppppgglopppplofffffffloffffffffffffffffffffffffffflofffffffffffffffffffffffffffffffffffffffffffffffffffloglopppppppppppppppppppppppppppplofffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffflopppploppgloffffffffffffffffffflopppppppppppppppppppppppppgglofffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffflopppppppppppppppppppppppppppgglofffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffflofloffffffffffloppppppppppppppppppppppploppgloio

オンラインで試す

スタックに数値(15)を繰り返しプッシュし、スタックの長さをプッシュして、そのASCII値の文字を印刷します。スタックの長さを縮小する必要がある場合、を使用してスタックを一度に3つの値p、またはgターゲットの3つ以内にいる場合は一度に1 つの値を縮小します。プログラムはi(入力)を呼び出すことで終了し-1、入力がないためaをプッシュし、それを出力してエラーを発生させます。

これは、その方法を考えてからソリューションを作成するために使用したPython 3プログラムです。

s = "And she said, 'But that's his.'"
L = [0]+[ord(c) for c in s]
#print(L)
M = L[1:]+[0]
D = [x[1]-x[0] for x in zip(L,M)]
#print(D)
while D:
	n=D.pop(0)
	if not D:print('io',end='');exit()
	if n>0:print('f'*n,end='lo')
	else:
		while n<-2:print('p',end='');n+=3
		print('g'*-n,end='lo')

オンラインで試す


5
これは、ホワイトスペースソリューションに対する適切な対抗策です!...私はまた、生成プログラムを感謝し、私から1を持っている
フランチェスコ

最後のセクションは、慎重に使用することで完全に削除できます。pスペースからsインsaidに移動しながらスタックに59を作成し、コードを下から下に移動d,ます。(この時点で(15,15)は15であることに注意してください。)
ニトロドン

実際、(10,10)-(15,15)の長方形にいくつかの有用な文字を乱用lpて配置しg、より便利な場所でそれらを取得することができます。
ニトロドン

それは本当に良い考えです。このように> <>を考えるのはとても難しいです。BFでコーディングするようなものです
mbomb007

私は自分の答えを投稿しました:codegolf.stackexchange.com/a/186916/69059
Nitrodon

28

IBM PC上の8086アセンブリ、1463 845 664バイト

明確化:実際のアセンブリ言語ソースは、生成されたマシンコードではなく、エントリです。

問題は、ほとんどのx86命令(ADD、SUB、JMP、条件付きジャンプ、メモリアクセスなど)に2つの引数があるため、カンマまたはメモリアドレスが必要なことです。したがって、加算、減算、if、またはループを使用することはできません!

最初の試行で、増分、減分、乗算、除算、バイトトリック、およびあいまいなBCD命令(AAA、DASなど)の組み合わせを使用して、数値を「構築」することができました。その後、私はこのアイデアを使用して自己検査および自己修正コードを作成できることに気付きました。

  • 試行1(1463バイト)

    利用可能な命令を使用して、ASCIIコードとスクリーンバッファの0xb800アドレスを作成しました。シーケンス内の各キャラクターの計算は手作業で行われました。

  • 試行2.(未完了)

    0x40-0x5fの範囲のすべての整数にオペコードがあることを認識しました。この範囲には、AZが含まれます。したがって、たとえば、INC CXは0x41 = 'A'に対応します。(このオペコードテーブルは非常に便利です。)

    私は3つの「データ」文字列を作成し、それらを互いに重ねようとしました。最初はそのまま(大文字)、2番目は0x60-0x7fゾーンに「シフト」(小文字)、最後は0x20-0x3fゾーンに「シフト」(句読点)します。

    自己修正コードは、データを反復処理するループまたは3つを生成します。

  • 試行3(845バイト)

    以前のアプローチと同様ですが、データを削減するために、文字列は一度だけエンコードされ、文字セットを切り替えるために「制御文字」が混在します。

  • 試行4(664バイト)

    分岐に対処するために大量のパッチを適用した命令を必要とする制御文字を取り除く方法は?大文字が2つしか使用されていないことを考えると、0x40-0x4fの範囲を使用して小文字をエンコードし、0x90-0x9fの範囲を使用して句読点を(0xc0から減算する)エンコードするためにオペコードテーブルを「フリップ」できるかどうか疑問に思いました。「A」と「B」は別々に入れることができます。

    ただし、0x90〜0x9fの範囲のオペコードの半分しか使用できず、必要なオペコードと一致しませんでした。それから、XORを使用してそれらをシャッフルできるかもしれないと思い、動作するものを見つけました。そして、ここにあります。

ゴルフ:

REP LODSB
PUSH CX
PUSH CX
POP AX
INC CH
PUSH CX
POP DI
DEC AX
DEC AX
REPNE SCASB
REPNE SCASB
PUSH DI
REPNE SCASB
PUSH DI
REPNE SCASB
PUSH DI
POP SI
POP DI
DEC DI
LODSB
NOT AL
STOSB
POP CX
DEC CH
LODSB
NOT AL
STOSB
LODSB
AAA
STOSB
INC DI
LODSB
NEG AL
STOSB
LODSB
NOT AL
PUSH AX
PUSH AX
INC SP
POP ES
INC SP
POP DI
LODSB
NOT AL
PUSH AX
POP BX
NEG AL
STOSB
INC DI
LODSB
DEC AL
NEG AL
DIV BH
PUSH AX
POP DI
LODSB
STOSB
RET
DEC BL
PUSH CS
STOSB
PUSH DS
INC DI
INC AX
POP SI
PUSH SP
NOP
INC BP
POP AX
PUSH DI
NOP
INC BP
PUSH BX
POP BX
PUSH SP
PUSHF
NOP
CWD
PUSH DX
INC DI
INC SP
NOP
INC SP
POP AX
PUSH BX
INC SP
CWD
INC BP
NOP
POP AX
POP BX
INC BP
SAHF
CWD
SCASB
INC DX

で組み立てる

nasm golf.asm -o golf.com

DOSBOXで実行します(最初にCLSを実行します)。次のようになります。

サンプル出力

コメント:

; ASSUME DS = ES = CS
; ASSUME IP = 0x0100
; true for .COM file

; We treat 0xFE as a special marker that we scan for
; This marks our patch zone and the start of our data

; We also use it as a cheap trick to get a constant 0x1f
; into CX

; 0xFE is the first byte of INC or DEC instructions
; that operate on half-word registers (AL, BL, CH etc.)
; WATCH OUT! Adding these breaks the scan


; Can't assume any register contains zero
; so use this trick to zero out CX
REP LODSB

PUSH CX ; needed later

; zero AX
PUSH CX
POP AX

INC CH
PUSH CX
POP DI ; 0x100, where our code starts

DEC AX
DEC AX ; AL = 0xFE, our marker (AH = 0xFF)

REPNE SCASB ; skip the INC CH above
REPNE SCASB ; find the DEC CH located at 0x10E

; we will later need 0xF, the char count minus the 'A'
PUSH DI ; DI = 0x10F

REPNE SCASB ; find the patch position
PUSH DI

REPNE SCASB ; find the next 0xfe; our data section
PUSH DI
POP SI ; load data from here

POP DI ; store data to the patch position
DEC DI

; patch in XOR
; XOR is 0x34, start with 0xCB
; second byte of DEC BL is 0xCB
LODSB
NOT AL
STOSB

POP CX ; get 0x0f in CX for our strlen
DEC CH

; patch in our XOR arg
; it is 0xF1 (take 0x0E and NOT it)
LODSB ; 0x0E (PUSH CS)
NOT AL
STOSB

; ADD is 0x00 (take 0xAA, apply weird AAA behaviour)
; this also zeroes AH
LODSB ; 0xAA (STOSB)
AAA
STOSB

INC DI ; skip next instruction byte

; LOOP is 0xE2
LODSB ; 0x1E PUSH DS
NEG AL
STOSB


; get b800 in ES (address of screen buffer)
; first get 0x47 in AL (INC DI)
LODSB  ; get 0x47 (INC DI)
NOT AL ; NOT 0x47 = 0xb8
; AX = 0x00b8 (bytes backwards)

PUSH AX
PUSH AX
; stack contains 0xb8 0x00 0xb8 0x00
; stack off-by-1 trick
INC SP
; now POP gives you 0xb800
POP ES
INC SP ;and clean up after ourselves

; store 0 in DI ***** PUSHED AT START OF PROGRAM ***
POP DI


LODSB ; get our magic 0xC0 (0x40 INC AX)
NOT AL
PUSH AX
POP BX

NEG AL ; NOT and +1 to get 0x41 ("A")


; charloop:
STOSB
INC DI
LODSB
DEC AL ; XOR
NEG AL ; modify this into an ADD AL, BL
DIV BH ; modify this to LOOP back to charloop

; doesn't print the last character
; but the last character turns into the address where 'B'
; is supposed to go

PUSH AX
POP DI
LODSB ; "B"
STOSB

; graceful exit this time ;)
RET


; *** DATA SECTION ***

         ; PURPOSE

DEC BL   ; 0xFE marks data section, 0xCB for XOR
PUSH CS  ; for XOR arg
STOSB    ; for ADD
PUSH DS  ; for LOOP
INC DI   ; 0x47 -> for 0xb800

INC AX   ; for magic number but also "A"


POP     SI ;n
PUSH    SP ;d
NOP        ;
INC     BP ;s
POP     AX ;h 
PUSH    DI ;e
NOP        ;
INC     BP ;s
PUSH    BX ;a
POP     BX ;i
PUSH    SP ;d
PUSHF      ;,
NOP        ;
CWD        ;'
PUSH    DX ;B
INC     DI ;u
INC     SP ;t
NOP        ;
INC     SP ;t
POP     AX ;h
PUSH    BX ;a
INC     SP ;t
CWD        ;'
INC     BP ;s
NOP        ;
POP     AX ;h
POP     BX ;i
INC     BP ;s
SAHF       ;.
CWD        ;'

SCASB     ; treated as char but turns into screen address!
INC DX    ; "B"

ふむ オフセット0x3eから始まる2つのアセンブリソースから異なる.COMファイルを取得しています。編集-Nvmは違いを見つけました:コメント付きバージョンの117行目INC AXはコメントなしの行ですINC AL
ガストロプナー

1
代わりに、完全にアルファベットのバイナリを表示したいです。:-)
ピーターフェリー

1
好みのアセンブラーとしてNASMをロックダウンすることに慣れている場合label1 dbは、独自の行で実行してラベルを作成できます。警告は表示されますが、エラーは発生しません。
ガストロプナー

1
@gastropnerよくそれはあまりにも簡単になります。:Pそれについて知らなかった、ありがとう!言語を「DEBUG.COMにフィードできるもの」に名前を変更する必要があるかもしれません。ちなみに私はこれをデバッグするために使用しました。xD
アルテリウス

1
@PeterCordesは今、これを自己修正します!
アルテリウス

23

Perl 6の1299の 1272 1220 1215バイト

-27バイトのGrimyに感謝します。

-52バイト。最初にウサギの耳が必要なかったからです。

-5バイトのJo Kingに感謝します。

print chr flip chars i x chars i xx pi
and print lc chr chars NaN x chars cis pi
and print lc chr chars e x e x e
and print chr chars i x e x e x e
and print lc chr flip chars exp i
and print lc chr chars NaN x tau x e x e
and print chr chars chop NaN x e lcm chars e
and print chr chars i x e x e x e
and print lc chr flip chars exp i
and print lc chr flip chars i x chars i xx pi
and print chr chars False x pi x ceiling tau
and print lc chr chars e x e x e
and print chr chars i xx chars NaN x pi
and print chr chars i x e x e x e
and print chr chars chop False x e x e x e
and print chr chars chop NaN xx chars e
and print lc chr chars e x chars False
and print lc chr chars chop e x chars False
and print chr chars i x e x e x e
and print lc chr chars chop e x chars False
and print lc chr chars NaN x tau x e x e
and print lc chr flip chars i x chars i xx pi
and print lc chr chars chop e x chars False
and print chr chars chop False x e x e x e
and print lc chr flip chars exp i
and print chr chars i x e x e x e
and print lc chr chars NaN x tau x e x e
and print chr chars False x pi x ceiling tau
and print lc chr flip chars exp i
and print chr chars NaN xx tau x e
and say chr chars chop False x e x e x e

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

末尾に改行を付けて文字列を出力します。必要ない場合は、最後sayをで置き換えprintます。ソースの改行をスペースに置き換えることもできます。

説明

このコードは、文字列を文字ごとに出力します。各文字は、適切な文字コードをchr関数に入力し、lc必要に応じてそれを小文字化することにより形成されます。

現在、すべての値は、正しい文字数の文字列を生成することにより生成されています。場合によっては、文字数はターゲット文字コードの逆です。logやなどの数学関数をexp直接使用することは理論的には可能であるはずですが、それらを使用するのはそれほど簡単ではありませんでした。

数値として使用するためにepiとがありtauます。xまたはの右側xxでは、暗黙的にフローリングされています。これらはすべて文字列表現に17文字あるeため、最小限の文字数で使用します。我々はまた、持っているi、(4文字)False(5文字)及びNaN(3文字)。文字列の長さをx;で乗算できます。xx1に文字列の長さを右辺で乗算し、1を加算します。chopターゲットから1文字離れている場合に備えて、文字列から1文字を削除します。

printステートメントはを使用してチェーン化されandますが、優先順位は非常に低くなります。それはほとんど奇跡です。そうでない場合、違法なセミコロンを使用する必要があります。

キャラクターの表現を手で見つけました。短い表現を見つけるには、プログラムで検索する価値があるかもしれません。



ちなみに、@ JoKingは、短い表現を手で検索したのですか、それともプログラムを使って助けたのですか?
bb94

1
手で私は恐れています。アルゴリズム的な方法は、おそらくあまりにもハードではないでしょう
ジョー・キング


@Grimy Clever、しかし残念なことに、使用しているゼロ幅スペースが空白文字ではないためにのみ可能です
ジョー・キング

17

66 64バイト

QaaGmwmiimaGcwWiimawAGawmfciiiGaFmAmFiimFGcwAmFiGmaiiGcGamafFiGQ

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

デバッグするために出力します。標準出力に出力wwするには、コードの最後に追加します。これにより、スタックの先頭がポップされて出力されます。

説明

幅では、この表に従って、各文字は「幅」に基づいて数字に関連付けられます。これにより、各文字に0〜9の数字が割り当てられます。その後、これらの数字は実際にコードを実行するために使用されます。

特に、一致7する文字よりも文字列リテラルが始まります。元の文字を再度読み取るまで、2文字のセットを一度に読み取ります。2文字の各セットは幅の数値に変換され、0から99の間の10進数として読み取られ、それらが等しい文字が次の文字列のインデックスになります。

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

たとえば、のインデックス!は1なので01、正しい幅の数字になります。このように、ifiIjt、などは、の文字列リテラルへのすべての相関します!

この場合、Q引用符として使用して、必要な出力の31文字を適切な文字に変換しました。スタックの最上部は、プログラムの終了時にデバッグするために出力されます。


これはまだ最短です。あなたが勝つことができると思います!
ブルーマンドホーク

14

x86マシンコード(32ビット)、256バイト

コードページ437コンソールでコードを印刷すると、次のように表示されます。

j XI a I a I a jbZ      Q fiQ Gf a f    Q I a I a I a I a h hisZ        Q I a I a I a I a hBP  Z        Q iQ
y       Q  a I a I a I a h thaZ Q I a I a I a Ih ButZ   Q  a I a I a I a fhu fZf        Q iQ g  S       Q  a I a I a I a hsaidZ Q I a I a I a I a hshe Z        Q I a I a I a I a hAnd Z        Q TZBX b 

これにはいくつかの空白文字が含まれているため、すべてのタブ文字をすべての改行なしスペース文字(コード255)に置き換えた場合のコードは*次のとおりです。

j XI a I a I a jbZ→Q fiQ Gf a f→Q I a I a I a I a h hisZ→Q I a I a I a I a hBP  Z→Q iQ →→y →Q  a I a I a I a h thaZ→Q I a I a I a Ih ButZ→Q  a I a I a I a fhu fZf→Q iQ g→S →Q  a I a I a I a hsaidZ→Q I a I a I a I a hshe Z→Q I a I a I a I a hAnd Z→Q TZBX*b*

Hexdump:

6a 20 58 49 20 61 20 49 20 61 20 49 20 61 20 6a
62 5a 09 51 20 66 69 51 20 47 66 20 61 20 66 09
51 20 49 20 61 20 49 20 61 20 49 20 61 20 49 20
61 20 68 20 68 69 73 5a 09 51 20 49 20 61 20 49
20 61 20 49 20 61 20 49 20 61 20 68 42 50 20 20
5a 09 51 20 69 51 20 09 09 79 20 09 51 20 20 61
20 49 20 61 20 49 20 61 20 49 20 61 20 68 20 74
68 61 5a 09 51 20 49 20 61 20 49 20 61 20 49 20
61 20 49 68 20 42 75 74 5a 09 51 20 20 61 20 49
20 61 20 49 20 61 20 49 20 61 20 66 68 75 20 66
5a 66 09 51 20 69 51 20 67 09 53 20 09 51 20 20
61 20 49 20 61 20 49 20 61 20 49 20 61 20 68 73
61 69 64 5a 09 51 20 49 20 61 20 49 20 61 20 49
20 61 20 49 20 61 20 68 73 68 65 20 5a 09 51 20
49 20 61 20 49 20 61 20 49 20 61 20 49 20 61 20
68 41 6e 64 20 5a 09 51 20 54 5a 42 58 ff 62 ff

仕組みについての説明:

便利な手順は次のとおりです。

  • push imm8push imm16およびpush imm32に続き、pop定数を生成します。これはah、バイト(imm8)をプッシュするときにゼロ(in )を生成することもできます。
  • and [ecx+32], ah-ah = 0と仮定すると、バイトがゼロに設定されます。出力文字列の長さが32であるため、コードが最後から最初までバッファを埋めます。
  • or [ecx+32], edx-出力バイトがゼロに設定されていると仮定すると、出力にコピーedx(4バイト)されます。出力バッファを超えて書き込むべきではないため、バッファの終わり近くではdxなくバリアントを使用しますedx。コードの制限により、この方法で1バイトを書き込むことはできません!
  • imul edx, [ecx+32], whatever-これがスクランブルの主なアイデアです。十分なエントロピー[ecx+32]と数があれば、どんな出力も生成できます。必要な値の2または3バイトを生成するために使用します。複雑な点としては、出力に書き込むときに、ORすでに存在するものすべてに対して論理的な処理を行う必要があります。これにより、メモリを再度ゼロにすることが必要になる場合がありました。
  • jmp命令のバリアントを使用して戻ります。エンコーディングが0xffであるため、これを選択しました。これは、コードページ437の改行なしスペースに対応します。

アセンブリソースコードと、それを実行するCプログラム(Visual Studio構文を使用):

#include <stdio.h>

__declspec(naked) void __fastcall doit(char* buf)
{
    __asm {
        push ' '
        pop eax

        dec ecx
        and [ecx+32], ah    // terminating 0 byte

        dec ecx
        and [ecx+32], ah
        dec ecx
        and [ecx+32], ah

        push 98
        pop edx
        or [ecx+32], edx
        imul dx, [ecx+32], 26183
        and [ecx+32], ah
        or [ecx+32], dx    // two bytes: [.']

        dec ecx
        and [ecx+32], ah
        dec ecx
        and [ecx+32], ah
        dec ecx
        and [ecx+32], ah
        dec ecx
        and [ecx+32], ah
        push 'sih '
        pop edx
        or [ecx+32], edx    // 4 bytes: [ his]

        dec ecx
        and [ecx+32], ah
        dec ecx
        and [ecx+32], ah
        dec ecx
        and [ecx+32], ah
        dec ecx
        and [ecx+32], ah
        push 538988610
        pop edx
        or [ecx+32], edx
        imul edx, [ecx+32], 544803081
        or [ecx+32], edx // 1 junk byte and 3 good bytes: (t's)

        and [ecx+32], ah
        dec ecx
        and [ecx+32], ah
        dec ecx
        and [ecx+32], ah
        dec ecx
        and [ecx+32], ah
        push 'aht '
        pop edx
        or [ecx+32], edx    // 4 bytes: [ tha]

        dec ecx
        and [ecx+32], ah
        dec ecx
        and [ecx+32], ah
        dec ecx
        and [ecx+32], ah
        dec ecx
        push 'tuB '
        pop edx
        or [ecx+32], edx    // 1 junk byte and 3 good bytes: [But]

        and [ecx+32], ah
        dec ecx
        and [ecx+32], ah
        dec ecx
        and [ecx+32], ah
        dec ecx
        and [ecx+32], ah
        push word ptr 8309
        pop dx
        or [ecx+32], dx
        imul edx, [ecx+32], 542312807
        or [ecx+32], edx    // 1 junk byte and 3 good bytes: [, ']

        and [ecx+32], ah
        dec ecx
        and [ecx+32], ah
        dec ecx
        and [ecx+32], ah
        dec ecx
        and [ecx+32], ah
        push 'dias'
        pop edx
        or [ecx+32], edx    // 4 bytes: [said]

        dec ecx
        and [ecx+32], ah
        dec ecx
        and [ecx+32], ah
        dec ecx
        and [ecx+32], ah
        dec ecx
        and [ecx+32], ah
        push ' ehs'
        pop edx
        or [ecx+32], edx    // 4 bytes: [she ]

        dec ecx
        and [ecx+32], ah
        dec ecx
        and [ecx+32], ah
        dec ecx
        and [ecx+32], ah
        dec ecx
        and [ecx+32], ah
        push ' dnA'
        pop edx
        or [ecx+32], edx    // 4 bytes: [And ]

        push esp
        pop edx
        inc edx

        pop eax
        jmp dword ptr[edx-1]
    }
}

int main()
{
    char buf[100];
    doit(buf);
    puts(buf);
}

これは私には完全にゴルフされていないようです。確かに、一連の同一の命令を繰り返すのではなく、ループを使用することで数バイトを節約できます。そのすべてのdec ecx+のand [ecx+32], ahものが出て因数分解することができます。
コーディグレイ

試してみてください。これは私ができる最善の方法です。別のアプローチが見られることを嬉しく思います。負のジャンプオフセットが必要であることがわかったとき、ループの概念を放棄することにしました。たぶん、この制限は創造的な方法で解決することができます-どのように私は知りません。
アナトリグ

1
@anatolyg自己修正コードに対するテスト環境のスタンスがどうなるかがわかります。または、スタックでビルドしたコードの実行に関する意見。
ガストロプナー

char 0xffは「句読点やアルファベット以外の文字は一切使用しない」に違反していませんか?
val


13

PostScript、889 874 837 835バイト

currentflat string dup rrand
count dup count count mul mul xor count count mul count dup mul exch count
count copy count copy count copy count copy count copy
add and sub put print
and sub add put print
sub sub add put print
mul or xor put print
idiv xor add put print
or xor add put print
mod idiv add put print
mul or xor put print
idiv xor add put print
sub and add put print
or and add put print
sub sub add put print
pop add sub put print
mul or xor dup copy put print
mod mul sub put print
add or xor put print
idiv add add put print
add or add put print
put print
add or add put print
or xor add put print
sub and add put print
add or add put print
mod mul sub put print
idiv xor add put print
mul or xor put print
or xor add put print
or and add put print
idiv xor add put print
xor add sub put print
mod mul sub put print
quit

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

これは、整数の32個のコピーを使用します89 25 20 6。ターゲット文字列のすべての文字コードは、これらの整数に対する操作でスタック順に取得できます。たとえば、 'A'(ASCII 65)は89-(25&(20 + 6))です。多くの整数の4タプルにはこのプロパティがあります。これは、生成が特に簡単なため選択されました。

currentflat string dup rrand

フラットのデフォルトは1であるため、これにより長さ1のストリングが作成されます(初期化されます\0)。dupディープコピーではありません。同じ文字列への2番目の参照を作成します。rrandはランダムシードをプッシュします["\0", "\0", 0]。デフォルトは0 です。スタックはになりました。

count dup count count mul mul xor

count スタック内のアイテムの数をプッシュするため、3 ^(3 *(5 * 6))= 89を計算します。

count count mul count dup mul exch count

4 * 5 = 20、5 * 5 = 25、6 =6。スタックはになりました["\0", "\0", 0, 89, 25, 20, 6]

count copy count copy count copy count copy count copy

スタック全体を5回複製します。したがって、最初の7要素スタックのコピーが32個になります。ターゲット文字列の長さは31文字であるため、必要なのは31コピーだけですが、余分なコピーは問題ありません。

add and sub put print

上位4つの整数から文字コードを計算し、文字列のインデックス0に書き込み、文字列を出力します。

quit

デフォルトのプロンプトを抑制します。


11

ルビー420 354 338バイト

def P a
print String a
end
def Q a
p String a
end
class String
def inspect
putc sum size
q
end
end
def w
Q def hacked
end
rescue
end
P def And
end
w
P def she
end
w
P def said
end
Q def gadget
end rescue
w
def a
Q def afraid
end
rescue
end
a
P def But
end
w
P def that
end
a
putc String def s
end
w
P def his
end
Q def fierce
end rescue
a

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

不快感の昇順:

大文字で始まる単語は、その名前でdisplayクラスを定義し、クラス定義本体内で呼び出すことにより印刷できます。

他の単語は、Symbolを返すその名前のメソッドを定義し、それを文字列にキャストして先頭のコロンを削除することで表示できます。

他の文字はputc、ASCIIコードを呼び出すことで表示できます。String defトリックを再利用して文字列を取得し、サイズによって決定されるモジュラスを使用してバイトの合計を取得することにより、適切な数値を生成できます。残念ながら、オブジェクトのクラス定義内から以外にオブジェクトのメソッドを呼び出す方法はありません。そのため、引数を渡すのが難しくなります。最後のハックは再定義することであるようString#inspectにして文字列を渡すときに、暗黙的に呼び出される、p方法、それは計算し、それはので、エラーを上げる前に、副作用として適切な文字を出力することをp実際に実行を完了し、印刷することはできません改行。次に、メインコードのエラーをレスキューする必要があります。

編集:ジョーダンはバイトカウントを大幅に少なくし、いくつかの巧妙なコントロールフローゴルフで高い値raiseを上げました。また、NameErrorを発生させる1文字の存在しないメソッド呼び出しに置き換えることで、さらにバイトを減らしました。

編集2:print Stringメソッドにタイトルを入れることが許可されているため、メソッドに抽出すると、クラス定義トリックを使用するよりも、メソッド定義でそれを使用する方が安価であることに注意してください。


美しい.... sum size和がそのサイズを法としてどのように取得するのかわかりませんが、他のすべてはチェックアウトします!
バリューインク

これを少し遅延させて、実際にはsumメソッドのオプションの引数として文字列のサイズを渡します。
histocrat

11

> <> 233の 122バイト

cdacaabbglccgpcbfbbcaacdebbafbebbcebdbealbcpcdbcccdlcdpacbbalccpaalacpbcfafbaab









       g  sandBe
       o  Aviuth

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

これはmbombの答えのゴルフとして始まりましたが、膨大なバイト数を節約する根本的な変化を発見したので、自分の答えとして投稿しています。

アルファベット以外の文字を出力に生成するには、値をスタックに繰り返しプッシュし、それを使用lしてスタックの長さをプッシュします。ただし、これをすぐに出力する必要はありません:を使用してp、この文字は座標が10から15の範囲のセルに配置でき、後でで取得できますg。同様に、アルファベット文字を最初のソースコードに配置してこのように読み取ることができます。入力のアルファベット以外の文字コードの最大値は46(.)であるため、格納に必要な62よりもスタックを高くプッシュする必要はありません。出力の31文字すべて。

さらに、vコードの列7 にa が配置されます。命令ポインターがラップしてそのに達するとv、シーケンスgoが繰り返し実行され、プッシュされた座標から読み取られ、対応する文字が出力されます。最終的に、スタックは空になりg、エラーでプログラムを終了します。

コードの最初の7バイトは、最初の7座標と最後の7座標の両方がプッシュされるときに再利用されます。v列9 に配置すると、理論的にはさらに2バイト節約Ainsvできますが、コード内の文字を2x2の正方形に強制することになり、不可能です。以前のバージョンでは15列目を使用していましたが、ソースコードに余分な行が必要で、6バイト長くなりました。


さらに考えてみると、1バイトを費やして列9を機能させることができるrと思います。しかし、このプログラムをゴルフでプレーすると、私の脳が少し傷つきます。
ニトロドン

8

CJam、262バイト

  KAbScibCmhc  CZbsic          GmQYbsic
S CmfYmeibc    ImqmeKmhcel     AZbAbc
S CmfYmeibc    KAbScibCmhcel   ImqmeKmhAmhcel  GmQYbsic    KAZbYbbBbc
S CGmQbDbc     EYbTYtZbc       FYbGmQbcel      EYbGmQbcel
S EYbGmQbcel   ImqmeKmhcel     KAbScibCmhcel   EYbGmQbcel  CGmQbDbc    CmfYmeibc
S ImqmeKmhcel  ImqmeKmhAmhcel  CmfYmeibc       PYmhmeKmhc  CGmQbDbc

オンラインでお試しください!ここでは、わかりやすくするために改行のみを示しています。各行は文字を表します。

ふう、これは楽しかった。アルファベットのコマンドに限定すると、いくつかの興味深い課題が生じます。

  • {および}がなければ、制御フローの機会は事実上ありません(ただしf、使用する機会が見つかりませんでした)。
  • なければ\_;、または$、我々はスタック操作のための手段を持ちません。

これは、主な目標がスタック上の関連するコードポイントを取得し、それらをで文字に変換することであることを意味しcます。

問題は、ほとんどの基本的な算術コマンドと整数リテラルが不足していることです。m名前空間には多数の高度な数学演算が含まれており、便利な数値に事前定義された多くの変数があるため、これは問題ありません。

私は、平方根(mQおよびmq)、指数関数me、およびb乗算のエミュレートにも使用できる基底変換()を多用することになりました([X 0] YbX * Yを計算します)。さらに、大文字のコードポイントを作成する方が簡単な場合もあります。その場合el、結果の文字で使用(小文字に変換)できます。

長いもののいくつかにはまだ満足していません。しかたがない。

説明

これは、出力の文字ごとの説明です。始める前に、数字を作成するいくつかの簡単な方法を次に示します。

  • 0、1、2、3を変数に含まれているTXYZそれぞれ。
  • 番号10〜20は、変数に含まれていAK
  • 32を使用して作成できますSciSスペースを含む文字列をプッシュし、cこの文字列の最初の文字を取得し、iその文字をコードポイントに変換します)。Sスペースにも使用されます。
  • 4はGmQ(16の整数平方根)で与えられます。
  • 5はAZbYb(10を基数3に[1 0 1]変換してを生成し、結果の数値配列を基数2に変換して5を生成します)。
  • 7はYmei(exp(2)を計算して整数に変換する)で与えられます。

A

K           - push 20                        | 20
 Ab         - convert to base 10             | [2 0]
   Scib     - convert from base 32           | 64
       Cmh  - hypot(TOS, 12)                 | 65.115
          c - round down and convert to char | 'A

n

C      - push 12            | 12
 Zb    - convert to base 3  | [1 1 0]
   s   - convert to string  | "110"
    i  - convert to integer | 110
     c - convert to char    | 'n

d

GmQ      - push 4             | 4
   Yb    - convert to base 2  | [1 0 0]
     s   - convert to string  | "100"
      i  - convert to integer | 100
       c - convert to char    | 'd

s

C         - push 12         | 12
 mf       - factors         | [2 2 3]
   Ymeib  - base 7          | 115
        c - convert to char | 's

h

I           - push 18                        | 18
 mq         - sqrt                           | 4.242
   me       - exp                            | 69.591
     Kmh    - hypot(TOS, 20)                 | 72.408
        c   - round down and convert to char | 'H
         el - lowercase                      | 'h

e

A      - push 10              | 10
 Zb    - convert to base 3    | [1 0 1]
   Ab  - convert from base 10 | 101
     c - convert to char      | 'c

a

KAbScibCmhc   - push 'A (see above) | 'A
           el - lowercase           | 'a

i

I              - push 18         | 18
 mq            - square root     | 4.242
   me          - exp             | 69.591
     Kmh       - hypot(TOS, 20)  | 72.408
        Amh    - hypot(TOS, 10)  | 73.095
           c   - convert to char | 'I
            el - lowercase       | 'i

,

K          - push 20              | 20
 AZbYbb    - convert to base 5    | [4 0]
       Bb  - convert from base 11 | 44
         c - convert to char      | ',

'

C        - push 12              | 12
 GmQb    - convert to base 4    | [3 0]
     Db  - convert from base 13 | 39
       c - convert to char      | ''

B

E         - push 14               | 14
 Yb       - convert to base 2     | [1 1 1 0]
   TYt    - replace elem 0 with 2 | [2 1 1 0]
      Zb  - convert from base 3   | 66
        c - convert to char       | 'B

u

F          - push 15             | 15
 Yb        - convert to base 2   | [1 1 1 1]
   GmQb    - convert from base 4 | 85
       c   - convert to char     | 'U
        el - lowercase           | 'u

t

E          - push 14             | 14
 Yb        - convert to base 2   | [1 1 1 0]
   GmQb    - convert from base 4 | 85
       c   - convert to char     | 'T
        el - lowercase           | 't

.

P          - push pi                        | 3.141
 Ymh       - hypot(TOS, 2)                  | 3.724
    me     - exp                            | 41.437
      Kmh  - hypot(TOS, 20)                 | 46.011
         c - round down and convert to char | '.

1
HYbYCtYbcHYbXAtYbcおよびなど、ベースの通常の範囲外の数字を使用してベース変換を行うことができますHYbXBtYbc
ニトロドン

7

Deadfish〜、943バイト

iiisdsiciiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiicddddddddddcddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddcdddddddddddddddddddddsddddddcdddddddddddcdddcdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddcdddddddddddddddddddddsddddddcddddddddddddddddddciiiiiiiicdddddcddddddddddddddddddddddddddddddddddddddddddddddddddddddddcddddddddddddciiiiiiiciiiiiiiiiiiiiiiiiiiiiiiiiiiciiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiicdcddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddcdddddddddddddddddddddsdddddcddddddddddddcdddddddciiiiiiiiiiiiiiiiiiicdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddcddddddddddddddddddddddddddddsddddddcdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddcddddddddddddddddddddddsiiiiciciiiiiiiiiicdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddcdddddddc

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

ループは許可されていません :(




6

MATL187の 158バイト

IEWQKEtqhpEqqKQHhthpKWEyQKWEqqYqQQXJwtQQQwKWEJKQthpYqKQHhthptQQQQQwIIhKQhpqKWEIWKQhpqIEWQQJQQtqKWEyIIhIhpYqQXJyKQthpYqwIWKQhpqyqKWEyJtQwhhPIIhKQhpQIWKQhpqvlec

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

より読みやすいバージョン:オンラインでお試しください!文字列を作成しようとする手動。使用して、便利なchuncksに文字列を切断することにより、ゴルフのために、おそらくたくさんの部屋のありますPし、h反転した文字列を構築します。誰かが私に打ち勝つために挑戦することを願っています。主な課題は、+またはを使用でき-ないことです。そのため、多くの場合、基本的な算術演算は不可能です。

ハイライト:

  • KQthpYq:25番目の(KQthp)プライムYqは97で、文字に対応しaます。文字s(115)は、30番目の素数である113から同様に生成されます。その後、クリップボードで広範囲に再利用されJます。
  • hishfromをクリップボードに保存することで短縮されJます。それは以前に格納したので、逆sにビルドhisして、最近のs使用を取得し、使用y後に反転できるようにしPます。
  • Luis Mendoのおかげで大量のバイトが節約されました(ほとんどをに変更するhことでvle

ええと-私は本当に以前に持っていvたものhを混乱させると思った。ただ仮定するのではなく、そうすべきだと思います。また、ヘッズアップのおかげで、熱心な削除が行われました。あなたがこれよりうまくやれるかどうか
知りたい

試してみたいのですが、待つ必要があります。これに答えるのには時間がかかるようです!
ルイスメンド

1
@LuisMendoうん。これを行うのに1時間ほどかかりましたが、これには非常に局所的な最適化のみが含まれます。物事をもう少しグローバルに見れば、もっとうまくいくと思います。
Sanchises

私の試み。私はあなたのものを見ていなかったので、アプローチはうまくいけば異なっています
ルイス・メンド

@LuisMendo私は完全に忘れてしまったというUの手段^2...私はかなりの数のバイトを保存していたかもしれない、
Sanchises

6

MATL、118バイト

KEUQtVQsQKBFZAXHKUqyyhsXJyyhdQtQQQwOJIUEyhdtKEhsHKQYqEEKQyywhdXJKEUQQHKUhstQwOytHKhsKYqyhdbJyqOHKhstQHKUqhsKUqYqqJvlec

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

より読みやすいバージョン(各行はスタック再配置操作を除き、1文字に対応します)。

説明

プログラムは、必要な文字のコードポイントを独立した数字として生成します。最後に、これらの数値はすべて列ベクトルに連結され、行ベクトルとして再形成され、文字に変換されます。結果は暗黙的に表示されます。

使用したトリックのいくつか:

  • 32未満のほとんどのコードポイントはスペースとして表示されます。したがって0、ほとんどのスペースに使用されます。これは、1バイト(O)しか消費しないためです。
  • 最初のスペースに、しかし、15(として生成に使用されKUq、それはその後にそれを添加することにより再利用することができるので、) 100(チャーd)を得ました115s)。別の機会に5(として生成空間のために使用されKQ、それが後から減算することができるように、) 44,与えます)39')。
  • クリップボードJs、繰り返される文字を保存するために使用されます:最初に、次に'。同様に、クリップボードはをH保存します100。これは、d他の文字の生成に役立ちます。
  • クリップボード()および()の定義済みリテラルとともに、関数Q(add 1)、q(subtract 1)、E(multiply by 2)およびU(square)を幅広く使用します。I3K4
  • 任意の加算と減算は、ベクトル(h)に連結し、その合計(s)または連続した差(d)を計算することによって行われます。
  • 100d)は4、10進数として解釈されるバイナリのように生成されます。
  • 110n)は65A)から文字列('65':コードポイント[54 53])に変換1し、コードポイント([55 54])に追加し、それらを合計してを追加することによって取得され1ます。
  • 番号が生成される順序は、便宜上変更される場合があります。そして、それらはスタック再配置関数(スワップ(w)、バブルアップb)によって並べ替えられます。

1
非常に素晴らしい!スペースのO代わりに使用する巧妙なタッチKWE。そして、別のクリップボードを犠牲にする方がおそらく良いという私の疑念を確認しましたH
Sanchises

5

DC240の 222 209バイト

OOOOOziOOOOOOOOOOOOOOOOOOOOOOOOOOOzddddddzkdddzasBdzasAdzscdzdasCzsdOOlAxlAxPOBlBxdIlAxoPAdlBxddsrIlAxssPPOPlsIZlCxddspPOZlCxPPOPlrdZlCxPlsPlrPlcPPKPdZlBxdZlAxPOAZlAxdPIZlCxdPrPdPlpPlrdZlCxPPKPOPPlpPlsPOPldPKP

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

私の最初の考えは@seshoumaraと同じで、すべての文字のASCII値を生成するのに十分なものをスタックにプッシュするだけです。それから、、、およびが単一文字の演算子であるため+、それらを再作成し、算術を使用することができることに気付きました!きっとそれはもっと小さくなります!そして、これ以上バイトをゴルフできれば驚かないでしょうが、今のところ...この複雑なアプローチはナイーブなものと結びついています。-*

OOOOOziOOOOOOOOOOOOOOOOOOOOOOOOOOOzddddddzkdddzasBdzasAdzscdzdasCzsd@seshoumaraのアプローチに似たアプローチの一部ですが、46までしかありません.。これを行うのは、45、まで上げる必要があるためです。-また、文字列にピリオドも必要です。そのため、ピリオドでさらに1つ進むだけで最も安いと思います。途中で、いくつかの値を保存します。5、32、39はすべて後で役立ちます。実用的なものは5、ASCII値は32と39。もともと私は1-5をしましたが、それは高価で、4の使用を避けることができました。Zこれらの値に3桁、2桁、または1桁の数字を使用(値をポップし、その桁数をプッシュ)します。42、43、および45で、我々は(文字列にこれらの変換*+および-(それぞれ)とマクロとして保存BAおよびCそれぞれ)。つまり、文字を使用せずに*+-、これらの演算子を使用できるようになりました。

ここから、基本的に、単純な累積ではなく数学の力を使用してASCII値の生成を開始し、途中で繰り返しの一部を保存します。100、105、および115が十分に出てきて、それらを(レジスターなどに)格納するのが理にかなっています。もともと、スタックを10で埋めたままにして、これらを使用して100を作成しました。スタックを32で埋め、後でスペースとして使用するためにバイトを節約しました。ASCIIセクションのもう少し読みやすいバージョン:OOlAxlAxP OBlBxdIlAxoP AdlBxddsrIlAxssP P OP lsIZlCxddspP OZlCxP P OP lrdZlCxP lsP lrP lcP P KP dZlBxdZlAxP OAZlAxdP IZlCxdP rPdP lpP lrdZlCxP P KP OP P lpP lsP OP ldP KP

18バイトを削る:レジスタの代わりに入力基数として5を格納します。レジスタではなく精度としての数値32。レジスタの代わりに出力基数としての数値115。1 を生成し、2を生成するように変更KZするIZ必要がありOZましKZた。

スタックを32秒でフラッディングすることにより、さらに13バイトを削ぎ落としました。精度を39に設定します。スタック操作を使用して、116の格納を回避します。誤って残していた二重作業を切り取った


+1 aこれらの演算子を再作成するために使用し、で呼び出しますx。これは、dcのdata-is-codeの動作を示しています。時間があるときは、レジスタではなくパラメータにデータを保存する最新のトリックを適用します。16進数のみを使用して必要な膨大な数を入力できた場合、Pが一度に多くの文字を印刷する方法を悪用することで、さらに短いDCソリューションを得ることができると思いますか?
seshoumara

@seshoumaraそれは可能ですが、他の課題でそれをやろうとする私の試みは、それらの値が急速に大きくなるという理由だけではありそうにないことを示唆しています。最初の2文字「An」を取得するには、P16750または0x416E が必要です。たまたま運が良かったのに、サブストリングの1つが値AFだけで構成されていた場合は、ショートカットになるかもしれません。それは幸運でしょう!それ以外の場合は、何らかの方法で大きな数値を入力するか、何らかの方法でそれらを考え出すか、256を追加して乗算することを多く行いPます。
brhfl

5

Japt、87バイト

Bs g caA
HzG
Ts caV
iWisiiihiSisiUitiaihitiSitiuibu iUiSiWcaV idiiiaisiSieihisiSidiniau

それを試してみてください

説明

最初の行はを生成し、'変数に割り当てますU

Bs g caA
B                            :11
 s                           :To string
   g                         :First character
     c                       :Character code
      a                      :  Absolute difference with
       A                     :  10

2行目は2variableに割り当てますV

HzG
H                            :32
 z                           :Floor divided by
  G                          :16

3行目はを生成し.、それを変数に割り当てますW

Ts caV
Ts                           :Convert 0 to a string
   caV                       :Absolute difference of its charcode with V (2)

最後の行は、文字列を一度に1文字ずつ逆順に作成します。

iW...ibu ...iWcaV ...iau
iW                           :Start by prepending W (.) to U (')
  ...                        :Each i prepends the literal character that follows it to the string, with S being space and U being "'"
     ibu                     :As B is the constant for 11 and it can't be quoted, here i prepends "b" to the string and u uppercases it
         ...                 :As above, each i is prepending the character/constant that follows it to the string
            iWcaV            :Gets the absolute difference of the charcode of W (.) and V (2) to get the "," and prepends that
                  ...        :Some more literals
                     iau     :And, finally, the same trick is used for the "A" as was for the "B", as A is the constant for 10

いい解決策。最初の行をQc dGaB
無知の実施例

4

、272バイト

prin quote And prin sp prin quote she prin sp prin quote said prin comma prin sp prin subtract to sp mold quote G sp prin quote But prin sp prin quote that prin subtract to sp mold quote G sp prin quote s prin sp prin quote his prin dot prin subtract to sp mold quote G sp

二重引用符が必要な場合:

、344バイト

prin subtract to sp mold quote B sp prin quote And prin sp prin quote she prin sp prin quote said prin comma prin sp prin subtract to sp mold quote G sp prin quote But prin sp prin quote that prin subtract to sp mold quote G sp prin quote s prin sp prin quote his prin dot prin subtract to sp mold quote G sp prin subtract to sp mold quote B sp

TIOでは機能しませんが、Redインタープリターでは機能します。

赤いコンソール

説明:

言葉は簡単です-私はとリテラルとして(改行なしで印刷)してPRIN quote赤はスペースのために言葉を内蔵している- sp、などcommadot"そして'より興味深い:Iからスペースを減算することにより、それらをプリンBG、それぞれ、リテラルから始まるBGして文字列に最初にそれらを変換し、moldwtih(それらに使用減算するために)、次に文字にto spプロトタイプによる変換を有する-に変換します文字列で、タイプspは文字です)。


1
質問は明確にされました。彼らはそれから興味深い部分を削除しました。
アナトリグ

@anatolygおかげで、私はまだそれを必要としている'ので、272バイトのソリューションは同じです。
ガレンイワノフ

4

Forth(gforth)、351

CHAR A DUP EMIT
CHAR n EMIT
CHAR d EMIT
SPACE
CHAR s DUP EMIT
CHAR h EMIT
CHAR e EMIT
SPACE
EMIT
CHAR a EMIT
CHAR i EMIT
CHAR d EMIT
DUP CHAR m XOR EMIT
SPACE
CHAR f XOR DUP EMIT
CHAR B EMIT
CHAR u EMIT
CHAR t DUP EMIT
SPACE
DUP EMIT
CHAR h EMIT
CHAR a EMIT
EMIT
DUP EMIT
CHAR s EMIT
SPACE
CHAR h EMIT
CHAR i DUP EMIT
CHAR s EMIT
CHAR G XOR EMIT
EMIT

CHARまたはEMITを1文字の単語に再定義できないのは残念です。これには:and ;(eg : C CHAR ;)または'(eg ' CHAR ALIAS C)のいずれかを使用する必要があるためです

実際、単語を定義できれば、印刷: P CHAR EMIT ;してP xから印刷することができますx。しかたがない。

私もそこにバッファ、書き込みその文字列を作成し、メモリへの書き込みが使用する必要があるため、入力としてそれを使用することはできません!C!



3

ペペ、266バイト

rスタックを空にして、Rスタックに 's'があります

reeEeeeeeE reeEEeEEEe reeEEeeEee reEe REeEEEeeEE Reee reeEEeEeee reeEEeeEeE reEe Reee reeEEeeeeE reeEEeEeeE reeEEeeEee reeeEeEEee reEe reeeEeeeEe reeEeeeeEe reeEEEeEeE reeEEEeEee reEe reeEEEeEee reeEEeEeee reeEEeeeeE reeEEEeEee reeeEeeEEE Reee reEe reeEEeEeee reeEEeEeeE Reee reeeEeEEEe reeeEeeeEe

これはTIOにはありませんが、ここで試すことができます


3

dc、240バイト

主なアイデアは、スタックを継続的に1(K)ずつ増やしsX、スタックのサイズ()がz一意の各ASCIIコードと一致した場合にカスタムレジスタに保存することです。印刷(P)は全体で行われます。

KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKzsSKKzsQKKKKKzsqKKKKKzsCKKzsDKKKKKKKKKKKKKKKKKKKzPKzsBKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKzsaKKKzsdKzseKKKzshKzsiKKKKKzPldPlSPKKKKKzsszPlhPlePlSPlsPlaPliPldPlCPlSPlqPlBPKzdstzPdPlSPdPlhPlaPPlqPlsdPlSPlhPliPPlDPlqP

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

dリコール(lX)は2バイトであるため、スタック上で文字(例:t)を複製()してバイトを保存するなど、使用しない場合は文字を保存しないなど、最適化を行いました。


+、-、および*のマクロを作成して、算術を使用するDCソリューションを思い付きました。262バイトです。競争力を高めるために最適化を試み続けますが、(比較的)ナイーブなソリューションよりもはるかに太いことに失望していると言わざるを得ません。
brhfl

@brhflええ、dcはかなり速くなります。それでも、あなたの解決策を見たいので、投稿してください!それまでの間、私は現在の方法をもっとゴルフするか、プログラムを使用するか、DCの別のアイデアを考え出すことも考えています。
seshoumara

240を結ぶことができた!そして、1、2バイト余分にゴルフをすることができたとしても驚くことはないでしょうが、...それは、ほとんど/まったく利益を得られない、はるかに鈍いアプローチです。とにかく、私はどこかで...そこにそれを下に掲載
brhfl

最も一般的なレジスタの一部を入力/出力基数と精度で置き換えることにより、222になりました。ストアに1バイト、ロードごとに1バイトを節約します...数字は重要ではないので、何にも影響しません...これもあなたの利点に使えるかもしれません!
brhfl

3

80186+マシンコード、MS-DOS .COM形式、822 787バイト

文字に加えて、タブとスペースのみが使用されます。許容範囲内のオペコードのほとんどが特定のインクリメント、デクリメント、プッシュ、ポップ、レジスタ間接ANDおよびORであることを考えると、IMULに加えて、スタックレジスタが最後に達するとラップするという事実を利用しますコードを逆に変更するセグメントの!即値をプッシュしているため、80186 +アセンブリが必要です。

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXjhX   GXkOXYIQSX GXjdX    GXkOXwIIIIIIIIIQhhihs kOXeQh ihutSXH    GXHHHHHH GXSX GYkOXDAAAQSX GXjGX    GXkOXtQhidhsahe hshhd hAnSX GXjTX   GXkOXdIIIQkOXgAQSX GXHHHHHHHHHHHHHHHHHHHHH  GXSX GYkOXbAAAAAAAAAAAAAAQhhlh  Xhh qM

注釈付きソース(TASM形式):

IDEAL
P186

MODEL   TINY
CODESEG
ORG 100H

MAIN:   
REPT 582
    POP AX  ; Set up stack to end of string
ENDM

    PUSH 68H
    POP AX
    OR [BX+58H],AX
    IMUL CX,[BX+58H],59H ; 68H*59H=2428H
    DEC CX ; -1=2427H
    PUSH CX

    PUSH BX
    POP AX
    AND [BX+58H],AL
    PUSH 64H
    POP AX
    OR [BX+58H],AX
    IMUL CX,[BX+58H],77H ; 64H*77H=2E7CH
REPT 9
    DEC CX ; -9=2E73H
ENDM
    PUSH CX

    PUSH 6968H
    PUSH 2073H

    IMUL CX,[BX+58H],65H ; 64H*65H=2774H
    PUSH CX

    PUSH 6920H
    PUSH 7475H

    PUSH BX
    POP AX
    DEC AX
    OR [BX+58H],AX ; FFFFH
REPT 6
    DEC AX
ENDM
    AND [BX+58H],AL ; FFF9H
    PUSH BX
    POP AX
    AND [BX+59H],AL ; 00F9H
    IMUL CX,[BX+58H],44H ; 0F9H*44H=4224H
REPT 3
    INC CX ; +3=4227H
ENDM
    PUSH CX

    PUSH BX
    POP AX
    AND [BX+58H],AL
    PUSH 47H
    POP AX
    OR [BX+58H],AX
    IMUL CX,[BX+58H],74H ; 47H*74H=202CH
    PUSH CX

    PUSH 6469H
    PUSH 6173H
    PUSH 2065H
    PUSH 6873H
    PUSH 2064H
    PUSH 6E41H

;; CODE STARTS:
;; PUSH 0909H
;; POP AX
;; PUSH 046CH
;; POP DX
;; INT 21H
;; INT 20H

    PUSH BX
    POP AX
    AND [BX+58H],AL
    PUSH 54H
    POP AX
    OR [BX+58H],AX
    IMUL CX,[BX+58H],64H ; 54H*64H=20D0H
REPT 3
    DEC CX ; -3=20CDH
ENDM
    PUSH CX

    IMUL CX,[BX+58H],67H ; 54H*67H=21CCH
    INC CX ; 21CDH
    PUSH CX

    PUSH BX
    POP AX
    AND [BX+58H],AL
REPT 21
    DEC AX
ENDM
    OR [BX+58H],AX ; 0FFEBH
    PUSH BX
    POP AX
    AND [BX+59H],AL ; 0EBH
    IMUL CX,[BX+58H],62H ; 0EBH*62H=59F6H
REPT 14
    INC CX ; +14=5A04H
ENDM
    PUSH CX

    PUSH 6C68H
    PUSH 5809H
    PUSH 0968H

    JNO $+4FH

END MAIN
ENDS

これはアセンブリではなく、マシンコードです...
Artelius

@Arteliusまあまあ。説明を更新しました。
ErikF

3

Befunge-98(FBBI)125 124 121バイト

wab









And she said   But that s his












wakekekaayyeapwayyaayybyapayybyapcyabcyaayycayyba
a



b
wayapapoq

オンラインでお試しください! ファイルへの出力\n(単一の改行)という名前ます。脚本を書いてくれたジョー・キングに感謝します。

出力には、10個の末尾の改行が含まれます。

末尾の改行が1つのみの場合、+ 1バイト、次の行を変更して。

wakekekaayyeapwayydayybyapayybyapycyabcyaayycayyba

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


説明:

命令ポインタは次のように移動します。IPパス

プログラムは、その行をファイルに出力する前に、アルファベット以外の文字を適切な位置に配置します。

Befunge-98には、対応する16進値をスタックにプッシュする命令a...が含まfれています。他の数値を生成するには、これらの値をy引数として( "Get SysInfo")に渡し、取得します。

10  y-position
11  x-position
12  y-velocity (= 0)
13  x-velocity (= 1)

23* stack size

コードの大部分をy = 23に配置することによりayy、スタックサイズに繰り返しアクセスするために使用できます。その後、スタックサイズは文字コードの生成に使用されます。


末尾の改行は1つだけ許可されていませんか?
デリオス

投稿は「ホワイトスペースは完全に許可されています」と述べています。末尾の改行を正当化するためにこの文言を乱用するのはクールだと思います!
アナトリグ

2

Pyth、210バイト

pChyCdpCyhyhlGpCyytlGpdpChFhTyylGpCyylGpChyytlGpdpChFhTyylGpCtytytlGpChyylGpCyytlGpCyyhTpdpCtyyTpCyhCdpCtFyyCdhTpCyhFlGCdpdpCyhFlGCdpCyylGpCtytytlGpCyhFlGCdpCtyyTpChFhTyylGpdpCyylGpChyylGpChFhTyylGpCyhyhTpCtyyT

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

文字だけで表現できる数(T= 10、Z= 0、lG= length(alphabet)= 26、Cd= charcode(space)= 32)と、文字だけを使用して実行できるいくつかの機能(たとえばt=デクリメント、h=インクリメント、hF=インクリメント=加算の繰り返し適用)を実行してから、総当たり検索を実行して、必要な各文字になった関数と数字の最短の組み合わせを見つけました。


2

16ビットx86アセンブリコード、665バイト

(バイナリはソースではなくアルファベットです)

どういうわけか、空白を許可するルールを忘れていました。確かにコードは結果としてゴルフにかけることができます。

バイトコード:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXsBFVKZPFFPFPFPFPFPFPFPFPFPFPFPFPFPFPFPFPFPFPFPFPFPFPFPFPFPFPFPFPFPFPXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXkLAFQQZJJJRkDCGPLXDPDJRkDBEPZJJRLZDRDZAAAQPLYDQDYXXDQhishZhDRDhZsDQDhaththRDhuthZBDQDRhidhsaRDhhehZsDRDhndhZADTZPiDEFY

ソース:

    db    63 dup (58h) ;pop ax
    jnb   label1
    dw    5646h      ;magic #1
    dw    5a4bh      ;magic #2
    dw    4650h      ;magic #3
    dw    (42h-6)/2 dup ("PF")

label1:
    db    416 dup (58h) ;more pop ax
    imul  cx,[si+41h],46h ;cl=24h (string sentinel)
    push  cx         ;push string sentinel
    push  cx
    pop   dx         ;dl=24h
    dec   dx
    dec   dx
    dec   dx         ;dl=21h
    push  dx         ;save for later
    imul  ax,[si+43h],47h ;al=0CDh
    push  ax         ;push xxCDh
    dec   sp         ;insert xx
    pop   ax         ;ah=0CDh
    inc   sp         ;discard xx
    push  ax         ;push 0CDxx
    inc   sp         ;discard xx
    dec   dx         ;cl=20h (space)
    push  dx
    imul  ax,[si+42h],45h ;al=2Eh (dot)
    push  ax
    pop   dx         ;dl=2Eh
    dec   dx
    dec   dx         ;dl=2Ch (comma)
    push  dx         ;push xx2Ch
    dec   sp         ;insert xx
    pop   dx         ;dl=2Ch
    inc   sp         ;discard xx
    push  dx         ;push 2Cxxh
    inc   sp         ;discard xx
    pop   dx         ;dx=202Ch
    inc   cx
    inc   cx
    inc   cx         ;cl=27h (quote)
    push  cx         ;push xx27h
    push  ax         ;push xx2Eh
    dec   sp         ;insert xx
    pop   cx         ;ch=2Eh
    inc   sp         ;discard xx
    push  cx         ;push 2Exxh
    inc   sp         ;discard xx
    pop   cx         ;cx=272Eh
    pop   ax         ;discard xxxx
    pop   ax         ;ax=0CD21h
    inc   sp         ;discard xx
    push  cx         ;push ".'"
    push  7369h      ;push "is"
    push  685ah      ;push "h"+xx
    inc   sp         ;discard xx
    push  dx         ;" "+xx
    inc   sp         ;discard xx
    push  735ah      ;push "s"+xx
    inc   sp         ;discard xx
    push  cx         ;push "'"+xx
    inc   sp         ;discard xx
    push  7461h      ;push "at"
    push  6874h      ;push "th"
    push  dx         ;push " "+xx
    inc   sp         ;discard xx
    push  7475h      ;push "ut"
    push  425ah      ;push "B"+xx
    inc   sp         ;discard xx
    push  cx         ;push "'"+xx
    inc   sp         ;discard xx
    push  dx         ;push ", "+xx
    push  6469h      ;push "id"
    push  6173h      ;push "sa"
    push  dx         ;push " "+xx
    inc   sp         ;discard xx
    push  6568h      ;push "he"
    push  735ah      ;push "s"+xx
    inc   sp         ;discard xx
    push  dx         ;push " "+xx
    inc   sp         ;discard xx
    push  646eh      ;push "nd"
    push  415ah      ;push "A"+xx
    inc   sp         ;discard xx
    push  sp
    pop   dx         ;dx=sp
    push  ax
    imul  ax,[si+45h],5946h ;ah=09h

次のように機能します。

  • スタックポインターをPOP AXを介してコードの末尾に移動します(アルファベットではないためPOP SPはできません)。

  • DOS呼び出しをディスパッチする命令を構築します(アルファベット順ではないため、アルゴリズム的に)。

  • アルファベット以外の文字を作成します。

  • 文字列をスタックに配置します。

  • ディスパッチ命令をコードの正確な最後のスタックに配置し、実行がその命令に直接流れるようにします。

  • 文字列を出力する命令を構築します;

  • 文字列を表示し、すぐにクラッシュします。:-/(正常な終了にはより多くのコードが必要です)




0

80186マシンコード+ DOS、91バイト

テキスト版:

hm  j   j   PPjzjzjgaAAA    JSJJ    RU  Sq  ReAA    JdJJJ   RfiJElK JEiS GtI And she said   But that s his   

タブ(コード9)が置換され9、スペース(コード32)が置換されたテキストバージョン*

hm9j9j9PPjzjzjgaAAA9JSJJ9RU9Sq9ReAA9JdJJJ9RfiJElK9JEiS*GtI*And*she*said***But*that*s*his***

Hexdump:

68 6D 09 6A 09 6A 09 50 50 6A 7A 6A 7A 6A 67 61
41 41 41 09 4A 53 4A 4A 09 52 55 09 53 71 09 52
65 41 41 09 4A 64 4A 4A 4A 09 52 66 69 4A 45 6C
4B 09 4A 45 69 53 20 47 74 49 20 41 6E 64 20 73
68 65 20 73 61 69 64 20 20 20 42 75 74 20 74 68
61 74 20 73 20 68 69 73 20 20 20

マシンコードは、拡張子が付いたファイルに表示されます.com。実行すると、必要なメッセージが出力されてからハング(ランダムデータの実行)されます。

機能の概要説明:

  1. 定数値でレジスタを初期化します
  2. メッセージ内のスペースを必要な特殊記号(,'.$)に置き換えます
  3. コードをパッチしてint 21命令を生成し、メッセージを出力します
  4. DOSを呼び出します

アセンブリコード(でコンパイル可能tasm):

my_bp equ 7ah
my_si equ 7ah
my_di equ 67h
my_msg equ 13bh
    .model tiny
    .code
    .startup
    .186
    org 100h
    push 96dh   ; ax (ah = 0; al = don't care, but see below)
    push 9      ; cx
    push 9      ; dx
    push ax     ; bx = don't care
    push ax     ; don't care
    push my_bp
    push my_si
    push my_di
    popa
    inc cx
    inc cx
    inc cx
    or [bp+si+my_msg-my_bp-my_si+12], cx ; ,
    dec dx
    dec dx
    or [bp+si+my_msg-my_bp-my_si+14], dx ; '
    or [bp+di+my_msg-my_bp-my_di+23], dx ; '
    or [bp+si+my_msg-my_bp-my_si+30], dx ; '
    inc cx
    inc cx
    or [bp+si+my_msg-my_bp-my_si+29], cx ; .
    dec dx
    dec dx
    dec dx
    or [bp+si+my_msg-my_bp-my_si+31], dx ; $

    ; 0x2049 * 0x4b6c = 0x98301cc
    ; So this sets cx to 1cc (a temporary constant used to patch code)
    imul cx, [bp+si+my_msg-my_bp-my_si-2], 4b6ch
    ; 0x1cc | 0x2049 = 0x21cd (the instruction which calls DOS int 21)
    ; Here ah = 9 ("print" mode)
    or [bp+si+my_msg-my_bp-my_si-2], cx

    ; At address 101, there is the constant 96d, which was loaded into ax
    ; 0x96d * 0x7447 = 0x448013b
    ; So the following sets dx to 13b (adddress of the message)
    imul dx, [bp+di+101h-my_bp-my_di], 7447h

int21:
    dw 2049h

    db 'And she said   But that s his   '
    end

popa通常popは必要なすべてのレジスタを埋めることができないため、命令を使用してすべてのレジスタをポップします(pop di禁止されたオペコードなど)。

パッチするバイトのアドレスは0x100 ... 0x160の範囲です。幸運なことに、それらは許容値を持つ3バイトの合計として表すことができます:

  • 0x7aで bp
  • 中0x7Aのか0x67 sidi
  • 即値

メッセージ内のバイトのパッチはOR、0x20(スペース文字)と小さな定数(4、7、12、または14)で論理を行うことにより機能します。小さな定数を初期化することによって得られるcxdx9(タブ文字)とやってするINCか、DEC必要に応じて。

コードのパッチはIMUL命令を使用します。ブルートフォース検索を使用して乗算するために必要な16ビット定数が見つかりました。

最後に、メッセージのアドレス(0x13b)が乗算によって取得されます。スペースを節約するために、命令の1つから定数の1つを取得しました0x96d。これには即値が含まれています。ここでは、9部品はDOS印刷機能を選択し、6d部品は無料のパラメーターです。それが判明した6d、乗算後に0x13bを与えることができる唯一の可能性であることが。

コード部分の分解:

06BA:0100 686D09            PUSH    096D
06BA:0103 6A09              PUSH    +09
06BA:0105 6A09              PUSH    +09
06BA:0107 50                PUSH    AX
06BA:0108 50                PUSH    AX
06BA:0109 6A7A              PUSH    +7A
06BA:010B 6A7A              PUSH    +7A
06BA:010D 6A67              PUSH    +67
06BA:010F 61                POPA
06BA:0110 41                INC     CX
06BA:0111 41                INC     CX
06BA:0112 41                INC     CX
06BA:0113 094A53            OR      [BP+SI+53],CX
06BA:0116 4A                DEC     DX
06BA:0117 4A                DEC     DX
06BA:0118 095255            OR      [BP+SI+55],DX
06BA:011B 095371            OR      [BP+DI+71],DX
06BA:011E 095265            OR      [BP+SI+65],DX
06BA:0121 41                INC     CX
06BA:0122 41                INC     CX
06BA:0123 094A64            OR      [BP+SI+64],CX
06BA:0126 4A                DEC     DX
06BA:0127 4A                DEC     DX
06BA:0128 4A                DEC     DX
06BA:0129 095266            OR      [BP+SI+66],DX
06BA:012C 694A456C4B        IMUL    CX,[BP+SI+45],4B6C
06BA:0131 094A45            OR      [BP+SI+45],CX
06BA:0134 6953204774        IMUL    DX,[BP+DI+20],7447
06BA:0139 CD21              INT     21 (after the code patches itself)

楽しい事実:通常、offset messageハードコーディングされたの代わりに使用します13bhが、この場合、アドレスの解析時に不明であるため、tasmは16ビットの即時オフセットを生成し、1コードバイトを浪費します。

06BA:0131 098A4600          OR      [BP+SI+0046],CX
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.