ICS海事旗アルファベット


14

国際信号旗のアルファベット は、船舶、特に静的信号の通信に使用されます。

あなたの課題は、STDINからまたは引数として文字列を取得し、ICSフラグアルファベットで対応するテキストを表示するプログラムまたは関数を作成することです。言語が画面に表示されない場合は、ファイルに保存しても問題ありません。

あなたのプログラムや関数は、文字をサポートするものAZ大文字と小文字で、プラススペース改行を。他の文字との動作は未定義です。

ディスプレイは、少なくとも水平方向に8フラグ、垂直方向に6フラグを表示 できる大きさでなければなりません。改行を受信する前に右端に到達した場合、またはメッセージが長すぎてディスプレイに垂直に収まらない場合の動作は未定義です。

フラグのアルファベットは以下のとおりです(ローマ字は参照用であり、出力には必要ありません)。

ここに画像の説明を入力してください

寸法

これらのフラグの寸法については、普遍的に合意された標準はないため、この課題の目的のために以下が適用されます。

フラグは60x60ピクセルで、水平方向と垂直方向の両方に30ピクセルのギャップがあります。

AとBのアゲハチョウは、深さ15ピクセルでなければなりません。

他のすべての線は、水平、垂直、または45度でなければなりません。

特徴は、旗を辺3、4、5または6の仮想NxNグリッドに分割することにより配置されます。上記の画像を参照してください。ただし、さらに明確にするために:

A、E、H、K、L、およびUは2x2グリッドに基づいています。各カラーゾーンの幅は30ピクセルです。また、Fのダイアモンドのポイントは、旗の両側に沿って中間になければならない。

JとTは3x3グリッドに基づいています。各バンドは20ピクセルです。

P、N、およびSは4x4グリッドに基づいています。また、Yの対角線は、フラグのエッジを4に分割します。

C、D、R、およびXは、5x5グリッドに基づきます。十字の帯と腕の幅は12ピクセルでなければなりません。

G、W、M、Vは6x6グリッドに基づいています。GのバンドとWのボーダーは幅10ピクセルでなければなりません。MとVの十字の腕は、旗の各端の最初と最後の10ピクセルをカバーし、長い端に沿って40ピクセルの三角形ゾーンを残します。

Iの円は旗の中心にあり、直径は30ピクセルです。

上記のテキストからの+/- 1ピクセルのエラーは許可されます。ご使用の言語がスケーラブルなグラフィックスのみをサポートしている場合、「ピクセル」を「ユニット」を意味すると解釈できます。

色は、言語またはそのドキュメントで定義されているように、赤、白、青、黄、黒でなければなりません。言語で色が定義されていない場合は、赤FF0000、白FFFFFF、青0000FF、黄FFFF00、黒0000000を使用できます。

背景は灰色でなければなりません(r、g、bチャンネルは等しく、強度は25%から75%です)。

得点/ループホール

これはcodegolfです。バイト単位の最短コードが優先されます。

標準の抜け穴は許可されていません。

フラグを表示するための組み込み関数またはライブラリ関数は使用できません。出力は非テキストである必要があります(特に、ユニコード文字はフラグの形状を構築するために使用されません)。

JFK got
my VHS
PC
and XLR
web quiz

以下を生成する必要があります

ここに画像の説明を入力してください


ディスプレイは、少なくとも水平8フラグ垂直6フラグを表示するのに十分な大きさでなければならない」という意味が完全にはわかりません。答えはそれらの次元までのメッセージを処理する必要があり、より大きな次元を処理する必要はないというだけですか、またはすべての行を少なくとも8文字にパディングし、すべてのメッセージを少なくとも6行にパディングする必要がありますか?
ピーターテイラー

1
@PeterTaylor出力に応じてディスプレイのサイズを変更するためにプログラムまたは言語が十分にインテリジェントである場合、出力が小さい場合にディスプレイを8x6にパディングする必要はありません。出力は灰色の背景で、長方形(すべての行が少なくとも最も長い行の長さまでパディングされます。)
Level River St

回答:


15

CJam、464バイト

CJamには画像操作機能がないと思いましたか?まあ、あなたは正しいと思った!しかし、私はそれで私を止めさせませんでした。

"P3
690 690 4
"3a3*a690_@*a*qeuN/{0:U;{_'C<.5*:N;i[{XY+Z<[E8][9C]?XY<=}WWWW{XH<9F?}C{YC/[9FCF]=}{YC/3&9E?}{YH<9F?}{X29.5:R-zYR-z+H>FC?}{XA/1&9E?}{XH<FC?}{XR-_*YR-_*+F_*>E8?}{YK/(9F?}{XH<E9?}{XH<YH<^8E?}{XY+Z-A/XY-A/e&9F?}{XF/YF/^1&F9?}{XY<EC?}{XH-F/YH-F/|9F?}E{XHm6/YHm6/e&CE?}{XH-F/YH-F/|F9?}{XK/[CF9]=}{XH<YH<^FC?}{XY+Z-A/XY-A/e&FC?}{XR-zYR-ze>iA/[CF9]=}{XHm6/YHm6/e&F9?}{XY+F/1&CE?}]=:P~!!{60:Z{Z30:HYH-z-N*-{YV+_2$=XU+P2b1>4f*tt}fX}fY}*U90+:U;}/V90+:V;}/`"[]"-

このプログラムは、CJamができる最善の方法で画像を出力します。PPM ファイルとして保存されたときに画像を表すテキストとして。ちなみに、オンラインインタープリターで実行しないでください。あなたはスタックを爆破します。Javaインタープリターで実行し、のようなコマンドで出力をファイルにパイプしますjava -jar cjam-0.6.4.jar flags.cjam > flags.ppm。入力を提供したら、UNIXのctrl + DまたはWindowsのctrl + ZでEOF(改行の直後が必要な場合があります)を送信します。

サンプル

本当に必要な場合は、元の〜3MBの画像ソースをどこかに貼り付けてみることができます。しかし、GIMPで開かれ、PNGに変換された結果は次のとおりです。

ABCDEFG
hijklmn
OPQRSTU
vwxyz z

flags_alphabet.png

説明

ソースで簡単に識別できる画像ヘッダーは、マジック番号、幅、高さ、および最大チャネル値で構成されます。そのため、出力は690 * 690画像(間隔が30pxの8 * 8 60pxフラグに十分)で、R、G、Bの各値は0から4です。

画像データは3で埋められた690 * 690 * 3配列として初期化され、画像全体が明るい灰色になります。次に、入力が読み取られ、大文字に変換され、行に分割されます。行はループで処理され、各反復でフラグY座標が90ずつ増加し、各行で各文字がループで処理され、フラグX座標が各反復で90ずつ増加します。今、魔法が始まります。

各文字は、呼び出されたときにフラグの位置(X、Y)にあるピクセルの色を返すフラグのピクセル関数にマップされます。これは、ほとんどの苦労の対象でした。26個の画像を数学関数として簡潔に説明します。これらの各関数は、8〜15のカラー値を返します。この範囲は、基数2に変換されると、結果のビット配列が[1、R、G、B]として解釈できるという事実を利用しています。最初の要素を削除し、残りの要素に4を掛けて、考えられるすべてのフラグ色(および緑、シアン、マゼンタ)をカバーするピクセル値を簡単に指定できます。また、10〜15に初期化された1文字の変数があり、変数はそれらを構文的に分離するためのスペースを必要としないため、うまく機能します。

関数が取得されたら、XとYの両方を0〜60で繰り返し、各ステップで関数を呼び出し、結果を画像データ配列に書き戻すだけです。抜け目のないオブザーバーは、各フラグ関数によって返される色の値がグレーを許可しないことに気付くかもしれません。そのため、スペースをスキップするための追加のロジックが少しあります。しかし、「A」と「B」にはまだアゲハチョウのカットがあります。そのため、そこには少し余分なロジックもあります。文字値が「C」よりも小さい場合、Xループの上限がYに関して正しく変化し、カットアウト領域が描画されないように値が設定されます。

全体として、私はこれがどのように出てきたかにかなり満足しています。大変な仕事をしましたが、楽しかったです。一部のフラグは参照画像と完全には一致しませんが、すべての形状がターゲットの1ピクセル以内に収まっていると思います(それ以上離れている場合はお知らせください。修正します)。26個のフラグ関数の間にはかなりの冗長性があるため、最適化の可能性は間違いなくあります。


誤解を招く最初の試行、559バイト

私はこれを完全に終了したことはありませんが、かなり興味深いので投稿します。(X、Y)→色の関数で各フラグをモデリングする代わりに、フラグは単純な形状の構成として描画されます。しかし、私は、さまざまな形状ごとにかなりの量のレンダリングコードを記述する必要があることを心配していました。多くの熟考の後、私はそれらをすべて、いくつかの巧妙なオーバーラップとオーバードローイングで、たった1つの擬似形状で表現できることに気付きました。チェス盤距離は正方形、マンハッタン距離はダイヤモンド、ユークリッド距離は円を与えます。これは、すべての形状が同じ5つのパラメーター(色、距離モード、x、y、

"P3
690 690 4
"3a3*a690_@*a*qeuN/{0:U;{_'C<.5*:N;i[[8EX30:Q0Q9X60:ZQQCXQZQ]LLLL[F9TTQQ]Ca[9FTQ42QCTQ54QFTQ66Q9TQ78Q][E9TIQI9T42QI][9FTQZQ][FCXQQQ][E9T40QQET50QQ9TZQQET70QQ9T80QQ][FCTZQQ][E8YQQF][9FTQAQ9TQ9~Q][E9TZQQ][8ETTTQETZZQ][F9XQTK9XZQK9XQZK9XTQK][F4{4{JW^1&6*9+TJ)F*W)F*F}fJ}fW][CEX0ZZ][9FTQQF]Ea[E[TZ]_m*{CT@~24}/][F9TQQF][9FTAQQCT9~QQ][FCTTTQCTZZQ]C9$1>9a/Fa*+[9FTQQKCTQQA]9 6$1>Ca/Fa*+[C7{7\-_1&2*C+X@TT@F*}/]]=_!!{([TQQQ]+\+}*5/{~:R;.5-:H;.5-:G;:M;2b1>4f*:O;Z{ZQWQ-z-N*-{JG-{zM_!+#}:P~WH-PM{+}{e>}?RP<{WV+_2$=JU+Ott}*}fJ}fW}/U90+:U;}/V90+:V;}/`"[]"-

1
素晴らしい、これは私が探していた創造的な答えの一種です。後で実行しようとします。
レベルリバーセント

1
これはおそらく私が見た中で最長のCJamコードです。いい仕事ですが、+ 1。
アレックスA.

繰り返しますが、CJamはその日を救うように見えます。
ASCIIThenANSI

9
残念ながら、200バイトを超えるCJamコードを投稿することは連邦犯罪です。私はあなたを拘留する必要があります。
デウソビ

2

PHP、811バイト

function f($s){echo"<body bgcolor=#ccc>";$z=split("\n",gzinflate(base64_decode("vVfNasMwDL7vKQK7xlT+iaHQ9LDTLnuIQus6ENhgxS19+kmO0yRrkhbqGIxtyV8sWbIkZ/Prjtm52p9suYbMHqqjPdHMVYfzx/elhBzyNbXtZoXQ7dvm+Q9+dieb7csvZFkJToNlEq6Zqeq6fAcw2arDqCKXUPMCEYQicIc1xmNfUkBDzXgQkpMQ3W0PEGF7fz49dT7IuSCQ1APJ5h9IKAIhdGn1jIHH6oUzvCpZzhtGjoDiePzuzAPJEkG1JPk1uw29G5rC7pxAvAFxuHqd+nQxpCP65S4gR6wzAkphE4rPHfbYaAueky59BrmrZ4wU0Ss8SES/pCNugMduiBSYs25oJTeBSYNMbHO6+bUg22PPhA8E5LCWhT3SFBjEwxaWiOMYD1+FtZSZxateEAZ7pvsEL7w1aQxD3HxLcmayfNA9ZeXzcdteJLm0H5ZITzAwolDkXeGwVAvlSzUOSDDkMRqRxDkuLquVecbKMRKFaESLSYOMg4b6qVHQMnkMns5jyZLBAnksRehirQWrwClEqakDNrqKpjqKpZ8K5rVYTFE56ZmCyT68KinJX+n/puFpyHXg4RRLwg1oW6YipqfimfJTt6/c6XIv6Tnc/HxNXIj+a9nORdwN5Qa3qzvGHw==")));while($c=ord(ucfirst($s))){$s=substr($s,1);echo$c<32?'<br>':($c^32?$z[$c-64]:$z[0]);}}

圧縮されたblobには、26個の各フラグのSVGコードが含まれています。次に、単純なループが、入力の各文字に対応するSVG画像を抽出して出力します。

「これは\nテストです」のサンプル出力:

<body bgcolor=#ccc><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h20v60h-20z fill=#f00 /><path d=M20,0h20v60h-20z fill=#fff /><path d=M40,0h20v60h-20z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h30v60h-30z fill=#fff /><path d=M30,0h30v60h-30z fill=#f00 /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#ff0 /><path d=M15,30a15,15,0,0,1,30,0a15,15,0,0,1-30,0z fill=#000 /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#fff /><path d=M15,15h30v30h-30z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#ff0 /><path d=M15,30a15,15,0,0,1,30,0a15,15,0,0,1-30,0z fill=#000 /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#fff /><path d=M15,15h30v30h-30z fill=#00f /></svg><br><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h30v60h-30z fill=#00f /><path d=M45,30l15-30h-30v60h30z fill=#fff /></svg><svg width=90 height=90 viewBox=0,0,90,90></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h20v60h-20z fill=#f00 /><path d=M20,0h20v60h-20z fill=#fff /><path d=M40,0h20v60h-20z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v30h-60z fill=#00f /><path d=M0,30h60v30h-60z fill=#fff /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h60v60h-60z fill=#fff /><path d=M15,15h30v30h-30z fill=#00f /></svg><svg width=90 height=90 viewBox=0,0,90,90><path d=M0,0h20v60h-20z fill=#f00 /><path d=M20,0h20v60h-20z fill=#fff /><path d=M40,0h20v60h-20z fill=#00f /></svg>

ideone試してみることができますが、ページはレンダリングされません。)

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