酒に酔った司教


42

公開キー暗号化では、公開キーフィンガープリントは、より長い公開キーを識別するために使用される短いバイトシーケンスです。

特にSSHでは、サーバーが実際に通信する予定のサーバーであり、中間者攻撃の標的になっていないことを確認するために使用できます。

それらは通常16進数の文字列として表されるため、期待する指紋と比較するのはかなり退屈で面倒です。

37:e4:6a:2d:48:38:1a:0a:f3:72:6d:d9:17:6b:bd:5e

少し簡単にするために、OpenSSHは指紋をASCIIアートとして視覚化する方法を導入しました。これは次のようになります。

+-----------------+
|                 |
|                 |
|          .      |
|     .   o       |
|o . o . S +      |
|.+ + = . B .     |
|o + + o B o E    |
| o .   + . o     |
|         .o      |
+-----------------+

これにより、ASCIIアートの大まかな形状を覚えて、サーバーの指紋が変更され、画像が異なって見える場合に(理論的に)認識できます。

使い方

撮影ディルク・ロス、トビアスLimmer、アレクサンダー・フォン・Gernler。2009.酔った司教:OpenSSH指紋可視化アルゴリズムの分析

グリッドの幅は17文字、高さは9文字です。「司教」は、行4 /列8(中央)から始まります。各ポジションは、[x、y]、つまり司教の開始ポジションの[8,4]として表すことができます。

            1111111
  01234567890123456
 +-----------------+
0|                 |
1|                 |
2|                 |
3|                 |
4|        S        |
5|                 |
6|                 |
7|                 |
8|                 |
 +-----------------+

司教は指紋を使って動き回ります。左から右へ、最下位ビットから最上位ビットまでバイト単位で読み取ります。

Fingerprint      37      :       e4      :       6a      :  ...  :       5e
Bits        00 11 01 11  :  11 10 01 00  :  01 10 10 10  :  ...  :  01 01 11 10
             |  |  |  |      |  |  |  |      |  |  |  |              |  |  |  |
Step         4  3  2  1      8  7  6  5     12 11 10  9             64 63 62 61

司教は次の計画に従って移動します。

Bits   Direction
-----------------
00     Up/Left
01     Up/Right
10     Down/Left
11     Down/Right

特殊なケース:

  • 司教が角にいて、再び角に移動する場合、彼はまったく動きません。例:司教は[0,0]次のステップにあります00。彼は[0,0]
  • ビショップがコーナーまたは壁にいて、壁の1つに移動する場合、司教は水平または垂直にのみ移動します。例:司教は[0,5]次のステップにあります01。彼は左に行くことができないので、彼はただ上に移動し[0,4]ます。

各ポジションには、司教がこのフィールドを訪問した頻度の値が保持されます。

Value      | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10| 11| 12| 13| 14| 15| 16|
Character  |   | . | o | + | = | * | B | O | X | @ | % | & | # | / | ^ | S | E |

値15(S)と16(E)は、それぞれ司教の開始位置と終了位置をマークし、尊重する位置の実際の値を上書きするという点で特別です。

ゴール

入力として英数字の指紋を取り、例に示すようにASCIIアート表現を生成するプログラムを作成します。

Input:
16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48

Output:
+-----------------+
|        .        |
|       + .       |
|      . B .      |
|     o * +       |
|    X * S        |
|   + O o . .     |
|    .   E . o    |
|       . . o     |
|        . .      |
+-----------------+

Input:
b6:dd:b7:1f:bc:25:31:d3:12:f4:92:1c:0b:93:5f:4b

Output:
+-----------------+
|            o.o  |
|            .= E.|
|             .B.o|
|              .= |
|        S     = .|
|       . o .  .= |
|        . . . oo.|
|             . o+|
|              .o.|
+-----------------+

Input:
05:1e:1e:c1:ac:b9:d1:1c:6a:60:ce:0f:77:6c:78:47

Output:
+-----------------+
|       o=.       |
|    o  o++E      |
|   + . Ooo.      |
|    + O B..      |
|     = *S.       |
|      o          |
|                 |
|                 |
|                 |
+-----------------+

ルール

  • これはです。最小バイトのコードが優先されます。
  • イメージを生成する既存のライブラリを使用することはできません
  • 好みの言語を使用してください!
  • あなたの提出物は完全なプログラムでなければなりません

3
セルが14回以上アクセスされることはないと想定できますか?
マーティンエンダー

2
一部のフィールドが14回以上アクセスされることになる、カバレッジが最小限のいくつかのコーナーケースがあります。33:33:33:...:33cc:cc:cc:...:ccこの例です。フィンガープリントは通常MD5ハッシュであるため、このような結果が得られる可能性は非常に低いです。これらに対処する方法に関する信頼できる情報源は見つかりませんでしたので、今のところ私は言うでしょう:セルは14回以上訪問されないと仮定します。
パダロム

回答:


2

Pyth、125バイト

Jj*17\-"++"JVc9XXsm@"^ .o+=*BOX@%&#/"hdrS+*U9U17K.u.e@S[0b*8hk)1.b+tNyYNYsm_c4.[08jxsM^.HM16 2d2cz\:,4 8 8ieK17\E76\SjN"||")J

オンラインで試す:デモンストレーションまたはテストスイート

私は数日前に書いたが、私はそれについて本当に幸せではなかったので、それを投稿しませんでした。

説明:

基本的な考え方は次のとおりです。ペアから始め(4, 8)ます。移動するたび(m1,m2)に、からに移動(x, y)(x-1+2*m1, y-1+2*m2)ます。これらの座標が境界線の外に出ないことを確認するために、いくつかのリストを作成し、それらをソートして中央の要素を返します(sorted(0,8,newx)[1], sorted(0,16,newy)[1])

私はすべてのポジションを追跡します。この位置のリストに、可能なすべての位置のリストを追加し、それらをソートして、それらをランレングスエンコードします。これにより、各ポジションに番号が付けられます。この数値を使用して、coorect charを選択し、最後に開始位置と終了位置の文字を上書きできます。


9

Dyalog APL(178)

{⎕ML←3⋄F←9 17⍴0⋄5 9{(⍺⌷F)+←1⋄×⍴⍵:(1 1⌈9 17⌊⍺-1 1-2×↑⍵)∇1↓⍵⋄(⍺⌷F)←16⋄F[5;9]←15⋄K⍪(M,' .o+=*BOX@%&#/^SE'[1+F],M←'|')⍪K←'+','+',⍨17⍴'-'}⊃,/{↓⊖4 2⍴⍉(4/2)⊤¯1+⍵⍳⍨⎕D,'abcdef'}¨⍵⊂⍨':'≠⍵}

これは、文字列を正しい引数として受け取り、ASCIIアート表現を含む文字マトリックスを返す関数です。例:

      F←{⎕ML←3⋄F←9 17⍴0⋄5 9{(⍺⌷F)+←1⋄×⍴⍵:(1 1⌈9 17⌊⍺-1 1-2×↑⍵)∇1↓⍵⋄(⍺⌷F)←16⋄F[5;9]←15⋄K⍪(M,' .o+=*BOX@%&#/^SE'[1+F],M←'|')⍪K←'+','+',⍨17⍴'-'}⊃,/{↓⊖4 2⍴⍉(4/2)⊤¯1+⍵⍳⍨⎕D,'abcdef'}¨⍵⊂⍨':'≠⍵}


      F '16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48'
+-----------------+
|        .        |
|       + .       |
|      . B .      |
|     o * +       |
|    X * S        |
|   + O o . .     |
|    .   E . o    |
|       . . o     |
|        . .      |
+-----------------+
      F 'b6:dd:b7:1f:bc:25:31:d3:12:f4:92:1c:0b:93:5f:4b'
+-----------------+
|            o.o  |
|            .= E.|
|             .B.o|
|              .= |
|        S     = .|
|       . o .  .= |
|        . . . oo.|
|             . o+|
|              .o.|
+-----------------+

説明:

  • ⎕ML←3:に設定⎕ML3ます。これにより、文字列を分割するのに便利です。

  • F←9 17⍴0:17行9列のゼロの行列を作成します。F各ポジションにアクセスした回数を表します。

  • ⍵⊂⍨':'≠⍵:文字で分割:ます。

  • {... :各グループ:
    • ¯1+⍵⍳⍨⎕D,'abcdef':文字列内の各文字のインデックスを検索します'01234567890abcdef'。APLはデフォルトで1からインデックス付けされるため、1を減算します。
    • (4/2)⊤:値を4ビット表現に変換します(2行4列の行列になります)。
    • ↓⊖4 2⍴⍉:マトリックスを回転し、要素を使用して代わりに2行4列のマトリックスを塗りつぶし、そのマトリックスを水平にミラーリングしてから、各行を個別に取得します。これにより、必要な4つの2ビット値が得られます。
  • ⊃,/:結果のリストを結合して、2ビットステップのリストを提供します。
  • 5 9{... }:ステップのリストが与えられ、位置[9,5]から開始します。
    • (⍺⌷F)+←1:の現在の位置をインクリメントしますF
    • ×⍴⍵::ステップのリストが空でない場合:
      • ↑⍵:リストから最初の一歩を踏み出す
      • ⍺-1 1-2×:そのステップのデルタを取得し、現在の位置から減算します
      • 1 1⌈9 17⌊:移動をフィールド内に制限する
      • (... )∇1↓⍵:新しい位置と残りのステップを続行します
    • それがもしある空:
      • (⍺⌷F)←16F最終位置で16に設定
      • F[5;9]←15F開始位置で15に設定
      • ' .o+=*BOX@%&#/^SE'[1+F]:各位置を対応する文字にマッピングします
      • K⍪(M,... ,M←'|')⍪K←'+','+',⍨17⍴'-':結果を行に折り返します

8

Perl、300 + 1(-n)= 301バイト

perl -ne 'sub b{$b=$_[0]+$_[1];$_[0]=$b<0?0:$b>$_[2]?$_[2]:$b}$v=pack"(H2)*",/\w\w/g;($x,$y)=(8,4);$a[b($y,($_&2)-1,8)*17+b($x,($_&1)*2-1,16)]++for map{vec$v,$_,2}0..63;@a[76,$y*17+$x]=(15,16);$c=" .o+=*BOX@%&#/^SE";print$d="+".("-"x17)."+\n",(map{+"|",(map{substr$c,$_,1}@a[$_*17..($_+1)*17-1]),"|\n"}0..8),$d'

この答えはうんざりしますが、このパズルの最初の答えでもあるので、今のところはやります。

-nSTDINの入力行を取得して入力します$_

# b($v, -1 or 1, max) modifies $v within 0..max
sub b{$b=$_[0]+$_[1];$_[0]=$b<0?0:$b>$_[2]?$_[2]:$b}

# turn $_ into a binary string
$v=pack"(H2)*",/\w\w/g;

# initialize cursor
($x,$y)=(8,4);

# find an element of single-dimensional buffer @a
$a[
    # y += (bitpair & 2) - 1, within 8
    b($y,($_&2)-1,8) * 17
    # x += (bitpair & 1) * 2 - 1, within 17
  + b($x,($_&1)*2-1,16)
# and increment it
]++
# for each bit pair (in the right order!)
  for map{vec$v,$_,2}0..63;

# overwrite the starting and ending positions
@a[76,$y*17+$x]=(15,16);

# ascii art lookup table
$c=" .o+=*BOX@%&#/^SE";

# output
print
  # the top row, saving it for later
  $d="+".("-"x17)."+\n",
  # each of the eight middle rows
  (map{+
    # converting each character in @a in this row as appropriate
    "|",(map{substr$c,$_,1}@a[$_*17..($_+1)*17-1]),"|\n"
  }0..8),
  # the bottom row
  $d

7

R、465の 459 410 393 382 357バイト

f=function(a){s=strsplit;C=matrix(as.integer(sapply(strtoi(el(s(a,":")),16),intToBits)[1:8,]),2);C[!C]=-1;n=c(17,9);R=array(0,n);w=c(9,5);for(i in 1:64){w=w+C[,i];w[w<1]=1;w[w>n]=n[w>n];x=w[1];y=w[2];R[x,y]=R[x,y]+1};R[]=el(s(" .o+=*BOX@%&#/^",""))[R+1];R[9,5]="S";R[x,y]="E";z="+-----------------+\n";cat(z);for(i in 1:9)cat("|",R[,i],"|\n",sep="");cat(z)}

インデントと改行あり:

f=function(a){
    s=strsplit
    C=matrix(as.integer(sapply(strtoi(el(s(a,":")),16),intToBits)[1:8,]),2)
    C[!C]=-1
    n=c(17,9)
    R=array(0,n)
    w=c(9,5)
    for(i in 1:64){
        w=w+C[,i]
        w[w<1]=1
        w[w>n]=n[w>n]
        x=w[1]
        y=w[2]
        R[x,y]=R[x,y]+1
    }
    R[]=el(s(" .o+=*BOX@%&#/^",""))[R+1]
    R[9,5]="S"
    R[x,y]="E"
    z="+-----------------+\n"
    cat(z)
    for(i in 1:9)cat("|",R[,i],"|\n",sep="")
    cat(z)
}

使用法:

> f("16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48")
+-----------------+
|        .        |
|       + .       |
|      . B .      |
|     o * +       |
|    X * S        |
|   + O o . .     |
|    .   E . o    |
|       . . o     |
|        . .      |
+-----------------+
> f("37:e4:6a:2d:48:38:1a:0a:f3:72:6d:d9:17:6b:bd:5e")
+-----------------+
|                 |
|                 |
|          .      |
|     .   o       |
|o . o . S +      |
|.+ + = . B .     |
|o + + o B o E    |
| o .   + . o     |
|         .o      |
+-----------------+

一度「m」と定義することで「マトリックス」関数をゴルフすることはできませんか?「関数」でも同じですか?
いとこコカイン

'cat'関数に 'sep ='は必要ないと思います
-CousinCocaine

sepのデフォルトはスペースなので、オーバーライドする必要がありますが、実際にはマトリックスをエイリアスできます。
プランナパス

また、私が知る限り、エイリアスはできませんfunction
プランナパス

5

オクターブ、277

d=reshape(rot90(dec2bin(hex2dec(strsplit(input('','s'),':'))))>'0',2,[])*2-1;p=[9;5];for m=1:64 p=[max(min(p(:,1)+d(:,m),[17;9]),1) p];end;A=' .o+=*BOX@%&#/^SE';F=A(sparse(p(2,:),p(1,:),1,9,17)+1);F(5,9)='S';F(p(2,1),p(1,1))='E';[a='+-----------------+';b=['|||||||||']' F b;a]

説明:

%// convert the input to binary and rearrange it to be
%//   an array of vectors: [x_displacement; y_displacement]
d=reshape(rot90(dec2bin(hex2dec(strsplit(input('','s'),':'))))>'0',2,[])*2-1;

%// start position array with vector for the start position
p=[9;5];
%// for each move, add displacement, clamping to valid values
for m=1:64 p=[max(min(p(:,1)+d(:,m),[17;9]),1) p];end;

%// alphabet for our fingerprint
A=' .o+=*BOX@%&#/^SE';

%// create a sparse matrix, accumulating values for duplicate
%// positions, and replace counts with symbols
F=A(sparse(p(2,:),p(1,:),1,9,17)+1);

%// correct the start and end symbols and construct the final output
F(5,9)='S';F(p(2,1),p(1,1))='E';
[a='+-----------------+';b=['|||||||||']' F b;a]

サンプル実行:

>> bish
b6:dd:b7:1f:bc:25:31:d3:12:f4:92:1c:0b:93:5f:4b
ans =

+-----------------+
|            o.o  |
|            .= E.|
|             .B.o|
|              .= |
|        S     = .|
|       . o .  .= |
|        . . . oo.|
|             . o+|
|              .o.|
+-----------------+

3

ピス、145 143 140

Jm*17]09A,4K8FYcz\:V4AmhtS[0^2d+@,HGdtyv@+_.BiY16*7\0+-4dyN),3 4 X@JGHh@@JGH; X@J4K15 X@JGH16
=Y++\+*17\-\+VJ++\|s@L" .o+=*BOX@%&#/^SE"N\|)Y

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

Pythは、反復処理の課題にはあまり適していません。私はCJamがそれを簡単に打ち負かすと期待しています。


3

JavaScript(ES6)249 208

追加された行方不明の境界線の編集

EcmaScript 6準拠のブラウザーで以下のスニペットを実行してテストします

B=f=>f.replace(/\w+/g,b=>{for(b=`0x1${b}`;b-1;b>>=2)++g[p=(q=(p=(q=p+~-(b&2)*18)>0&q<162?q:p)+b%2*2-1)%18?q:p]},p=81,z=`+${'-'.repeat(17)}+`,g=Array(162).fill(0))&&g.map((v,q)=>q?q-81?q-p?q%18?' .o+=*BOX@%&#/^'[v]:`|
|`:'E':'S':z+`
|`).join``+`|
`+z

// TEST
console.log=x=>O.innerHTML+=x+'\n'

;['37:e4:6a:2d:48:38:1a:0a:f3:72:6d:d9:17:6b:bd:5e'
,'16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48'
,'b6:dd:b7:1f:bc:25:31:d3:12:f4:92:1c:0b:93:5f:4b'
,'05:1e:1e:c1:ac:b9:d1:1c:6a:60:ce:0f:77:6c:78:47'  
].forEach(t=>console.log(t+'\n'+B(t)+'\n'))


// Less golfed

BB=f=>(
  p = 81,
  g = Array(162).fill(0),
  f.replace(/\w+/g, b => {
    for(b = `0x1${b}`;b != 1; b >>= 2)
      q = p+~-(b&2)*18,
      p = q>0&q<162?q:p,
      p = (q=p+b%2*2-1)%18?q:p,
      ++g[p]
  }),
  g.map((v,q) => q-81?q-p?q%18?' .o+=*BOX@%&#/^'[v]:'\n':'E':'S')
  .join``
)
pre { font-family: menlo,consolas; font-size:13px }
<pre id=O></pre>


あなたのゴルフコード自体もボーダーを印刷できる必要があります。現在、テストケースのみforEachでの上下の境界線が印刷されますが、垂直方向の境界線はまだありません。
パダロム

@Padarom私はあなたの「合理的」なコメントを誤解し、国境は要求されていないと考えていた
-edc65

使用する入力および出力の方法について合理的であることを意味します。誤解を招く恐れがある場合は謝罪します。編集します
Padarom

3

パイソン、381 328

-51 @JonathanFrechに感謝

def h(f):
 s=[f'{int(o,16)>>s&3:02b}'for o in f.split(':')for s in(0,2,4,6)];r=[0]*153;p=76;w=17
 for d in s:r[p]+=1;p+=(-(p%w!=0),p%w!=16)[int(d[1])]+(-w*(p//w!=0),w*(p//w!=8))[int(d[0])]
 r[76]=15;r[p]=16;b='+'+'-'*w+'+';print(b);i=0
 while i<153:print(f"|{''.join(' .o+=*BOX@%&#/^SE'[c]for c in r[i:i+w])}|");i+=w
 print(b)

説明のためにわずかに制限なし:

def h_(f):
 #Alias 17 because it gets used enough times for this to save bytes
 w=17

 #Input parsing
 s=[f'{int(o,16)>>s&3:02b}'for o in f.split(':')for s in(0,2,4,6)]

 #Room setup
 r=[0]*153
 p=76

 #Apply movements
 for d in s:
  r[p]+=1
  p+=(-(p%w!=0),p%w!=16)[int(d[1])]+(-w*(p//w!=0),w*(p//w!=8))[int(d[0])]
 r[76]=15 #Set start position
 r[p]=16 #Set end position

 #Display result
 b='+'+'-'*w+'+'
 print(b)
 i=0
 while i<153:
  print(f"|{''.join(' .o+=*BOX@%&#/^SE'[c]for c in r[i:i+w])}|")
  i+=w
 print(b)

行のこの混乱:

r[p]+=1;p+=(-(p%w!=0),p%w!=16)[int(d[1])]+(-w*(p//w!=0),w*(p//w!=8))[int(d[0])]

機能的にこれと同等です:

if int(d[0]): #Down, Y+
  if p//17!=8:
    p+=17
else: #Up, Y-
  if p//17!=0:
    p-=17
​
if int(d[1]): #Right, X+
  if p%17!=16:
    p+=1
else: #Left, X-
  if p%17!=0:
    p-=1

しかし、このスタイルのゴルフショートカットにはすべての条件が入れ子になっています:(false_value,true_value)[condition] うまくいけば、残りはかなり自明です

テスト

h('16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48')
+-----------------+
|        .        |
|       + .       |
|      . B .      |
|     o * +       |
|    X * S        |
|   + O o . .     |
|    .   E . o    |
|       . . o     |
|        . .      |
+-----------------+

h("b6:dd:b7:1f:bc:25:31:d3:12:f4:92:1c:0b:93:5f:4b")
+-----------------+
|            o.o  |
|            .= E.|
|             .B.o|
|              .= |
|        S     = .|
|       . o .  .= |
|        . . . oo.|
|             . o+|
|              .o.|
+-----------------+

h("05:1e:1e:c1:ac:b9:d1:1c:6a:60:ce:0f:77:6c:78:47")
+-----------------+
|       o=.       |
|    o  o++E      |
|   + . Ooo.      |
|    + O B..      |
|     = *S.       |
|      o          |
|                 |
|                 |
|                 |
+-----------------+
```

こんにちは、PPCGへようこそ。1文字の変数名を使用し、単一行のforループを1行に入れることでコードをゴルフできます。(1,0)[p%17==16]+(p%17!=16)、または場合によってもp%17!=16です。
ジョナサンフレッチ

さらに、には余分なスペースがあり] forます。
ジョナサンフレッチ

あるfpべきだと思うf
ジョナサンフレッチ


2
なぜ使用したの~16ですか?少し難読化してもゴルフを傷つけることはありません!
ジョナサンフレッチ

2

ルビー288

->k{w=17
r=[z=?++?-*w+?+]
(0...w*9).each_slice(w).map{|o|r<<?|+o.map{|x|c=76
q=0
k.split(?:).flat_map{|b|(0..7).map{|i|b.to_i(16)[i]}}.each_slice(2){|h,v|v<1?(c>w&&c-=w):c<w*8&&c+=w
c+=h<1?c%w>0?-1:0:c%w<16?1:0
c==x&&q+=1}
x==76?'S':c==x ?'E':' .o+=*BOX@%&#/^'[q]}.join+?|}
(r+[z]).join'
'}

オンラインで試す:http : //ideone.com/QOHAnM

読みやすいバージョン(私がゴルフを始めたバージョン)はこちらです:http : //ideone.com/XR64km


2

C-488

これを小さくする方法が必要です。

#include<stdio.h>
#define H ++p;h[i]|=(*p-(*p>58?87:48))<<
#define B ((h[j]>>n*2)&3)
#define L puts("+-----------------+")
#define F(m,s)for(m=0;m<s;m++)
int h[16],m[17][9],i,j,n,x=8,y=4;main(w,v)char**v;{char*p=v[1]-1,c[17]={32,46,111,43,61,42,66,79,88,64,37,38,35,47,94,83,69};for(;*p;p++,i++){H 4;H 0;}F(j,16)F(n,4){if(B&1)x+=!(x==16);else x-=!(x==0);if(B&2)y+=!(y==8);else y-=!(y==0);m[x][y]++;}m[8][4]=15;m[x][y]=16;L;F(i,9){printf("|");F(j,17)printf("%c",c[m[j][i]]);puts("|");}L;}

0

錆-509バイト

fn b(s:&str)->String{let(mut v,mut b)=([[0;11];20],[9,5]);v[19]=[19;11];for i in 0..16{let mut c=usize::from_str_radix(&s[i*3..i*3+2],16).unwrap();for k in 0..4{for j in 0..2{v[j*18][i%9+1]=18;v[i+k][j*10]=[17,3][(i+k+17)%18/17];b[j]=match(if c&(j+1)==j+1{b[j]+1}else{b[j]-1},j,){(0,_)=>1,(18,0)=>17,(10,1)=>9,x@_=>x.0 as usize,}}v[b[0]][b[1]]+=1;c>>=2;}}v[9][5]=15;v[b[0]][b[1]]=16;(0..220).fold("\n".to_string(),|s,i|{format!("{}{}",s," .o+=*BOX@%&#/^SE-|\n".chars().nth(v[i%20][i/20] as usize).unwrap())})}

大きいが... Cにほぼ近い。通常どおり、Rustが自動的に型を相互にキャストしないため、多くのバイトが消費されます。しかし、おそらく改善の余地もあります....おそらく他のソリューションからのいくつかのアイデアを使用できます。

無料版はRust Playgroundオンラインにあります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.