Goで文字列を表示する別の方法

どういうわけか職場に座ってGoでコードを書いて、私は古い問題を思い出しました。その本質は、問題内の任意の数の分割を所定の条件に実装する必要があるということでした。 簡単に思えますが、2つの制限がありました。



1. 0を除いて、明示的な形式で数字を使用することはできません。

2.許可される数学演算数も制限されていました。



Goでは繰り返しませんでしたが、ソリューションオプションの1つを適用して行を表示することにしました。 このアイデアは新しいものではなく、著者としての完全な権利を主張するものではありません。共有することにしました。



一番下の行は、文字列がバイトに分割され、各バイトがビット単位のシフトのシーケンスに変換され、ユニットとのXORおよびOR演算が行われることです。



次のようになります。



EAX = uint8(unsafe.Sizeof(true)) (((EAX<<EAX^EAX)<<EAX|EAX)<<EAX<<EAX<<EAX^EAX)<<EAX)
      
      





さあ、行きます。 安全でないモジュールは、sizeof関数にのみ必要です。 他の方法でGoで構造のサイズを取得する方法を知っている人がいれば、それを共有していただければ嬉しいです。



インポートおよび定数セクションの作成
 import ( "fmt" "math/rand" "time" "unsafe" ) const ( EAX = uint8(unsafe.Sizeof(true)) ONE = "EAX" )
      
      







次に、与えられたバイトに対して、そのような組み合わせを見つけて生成する関数が必要です。 最も単純で明白なオプションは、最初に[0,1,1,0,1,1、...]という形式のテンプレートを計算することでした。 ここで、0-数値は偶数であることを意味し、1-数値は奇数であることを意味します。 数値を減らすたびに、ビット単位で右に1シフトします。



コードの形で書きます
 func getNumber(n byte) (buf string) { var arr []byte for n > EAX { if n%2 == EAX { arr = append(arr, EAX) } else { arr = append(arr, 0) } n = n >> EAX } }
      
      







したがって、スライスarrの長さは、初期数を取得するために完了する必要があるステップの数に等しくなります。



getNumber関数を補足する
 buf = ONE rand.Seed(time.Now().Unix()) for i := len(arr) - 1; i >= 0; i-- { buf = fmt.Sprintf("%s<<%s", buf, ONE) if arr[i] == EAX { if rand.Intn(2) == 0 { buf = fmt.Sprintf("(%s^%s)", buf, ONE) } else { buf = fmt.Sprintf("(%s|%s)", buf, ONE) } } }
      
      







arrスライスを実行して、「シフト」の文字列を生成します。奇数に遭遇した場合、この数値に対して1のOR演算またはXOR演算をランダムに実行します。



与えられた文字列をそのようなシフトのシーケンスに実際に変える関数を書くことは残っています。 例として、指定された文字列を取得できるコードを実行してコードを表示することにしました。



別の機能
 func TextToCode(txt string) string { b := []byte(txt) tmp := "var str []byte\n" for _, item := range b { tmp = fmt.Sprintf("%s\nstr = append(str, %s)", tmp, getNumber(item)) } tmp += "\nfmt.Println(string(str))" return tmp }
      
      







それだけです。 開始後、「Author: GH0st3rs 」という行に対して、次の結果が得られます。



緊張しないで
 var str []byte str = append(str, (EAX<<EAX<<EAX<<EAX<<EAX<<EAX<<EAX^EAX)) str = append(str, ((((EAX<<EAX^EAX)<<EAX|EAX)<<EAX<<EAX^EAX)<<EAX<<EAX^EAX)) str = append(str, (((EAX<<EAX^EAX)<<EAX|EAX)<<EAX<<EAX^EAX)<<EAX<<EAX) str = append(str, ((EAX<<EAX^EAX)<<EAX<<EAX|EAX)<<EAX<<EAX<<EAX) str = append(str, (((((EAX<<EAX^EAX)<<EAX<<EAX|EAX)<<EAX^EAX)<<EAX^EAX)<<EAX|EAX)) str = append(str, (((EAX<<EAX^EAX)<<EAX|EAX)<<EAX<<EAX<<EAX^EAX)<<EAX) str = append(str, (((EAX<<EAX^EAX)<<EAX|EAX)<<EAX<<EAX^EAX)<<EAX) str = append(str, EAX<<EAX<<EAX<<EAX<<EAX<<EAX) str = append(str, EAX<<EAX<<EAX<<EAX<<EAX<<EAX<<EAX) str = append(str, (((EAX<<EAX<<EAX<<EAX<<EAX^EAX)<<EAX|EAX)<<EAX^EAX)) str = append(str, (EAX<<EAX<<EAX<<EAX^EAX)<<EAX<<EAX<<EAX) str = append(str, (EAX<<EAX^EAX)<<EAX<<EAX<<EAX<<EAX) str = append(str, ((((EAX<<EAX^EAX)<<EAX|EAX)<<EAX<<EAX<<EAX^EAX)<<EAX^EAX)) str = append(str, (((EAX<<EAX^EAX)<<EAX|EAX)<<EAX<<EAX^EAX)<<EAX<<EAX) str = append(str, (((EAX<<EAX^EAX)<<EAX<<EAX<<EAX|EAX)<<EAX^EAX)) str = append(str, (((EAX<<EAX^EAX)<<EAX|EAX)<<EAX<<EAX<<EAX^EAX)<<EAX) str = append(str, ((((EAX<<EAX^EAX)<<EAX|EAX)<<EAX<<EAX<<EAX^EAX)<<EAX^EAX)) fmt.Println(string(str))
      
      







» GitHubで入手可能なプロジェクトソースコード



All Articles