2015をQRコードとして出力


15

ミッションは簡単です。番号2015をQRコードとして出力し、名前のファイルに書き込むだけですnewyear.png、PNG形式でれます。コードはいつでも有効である必要があるため、現在の年を使用しないでください。

テキストとしてのQRコードは次のようになります。

# # # # # # #   # # # #     # # # # # # #
#           #           #   #           #
#   # # #   #   # #     #   #   # # #   #
#   # # #   #       #   #   #   # # #   #
#   # # #   #       #   #   #   # # #   #
#           #               #           #
# # # # # # #   #   #   #   # # # # # # #
                #   # #
#   #     # #     # #     # #       #   #
  # # #   #   #   #   # #   #     #   # #
#   # #   # # #   # # # # # #   #       #
# # #         # #         # # # #
# # # # #   #   #     #     #   #     #
                      # # # #
# # # # # # #       #   # #   # #   #   #
#           #   #         # # # #
#   # # #   #         #     #   #     #
#   # # #   #     #     # # # # #
#   # # #   #   #   #   # #   # #   #   #
#           #     # #       # # #   # # #
# # # # # # #   #           #   #   #   #

書き込まれる結果にnewyear.pngは、白い5ピクセルの境界線と1ピクセルのサイズのドットを持つQRコードが含まれている必要があります。QRコード以外のものを含めることはできません。


1
ハードコーディングできますか、またはqrコードを生成する必要がありますか?
地下

7
これがアスキーアートの出力ベースであり、画像出力ではない場合、さらに多くの答えがあります。
オプティマイザー14

6
コードはエラーなしで正確に正確でなければなりませんか、それとも正しくスキャンするのに十分ですか?(あなたがピクセルの多くを反転させることができ、彼らは仕事依然ますのでQRコードは、意図的な冗長性とエラー訂正の多くを持っています。)また、それはない持っている PNGする、あるいは我々は、他の画像フォーマットを使用することができます(私は考えています特にPBMについてはこちら)?
イルマリカロネン14

回答:


12

生ファイル、184バイト= 173バイトのファイル+ 11バイトのファイル名

これが標準的な抜け穴を壊さないことを願っています。しかし、出力は「高く 、それを生成する最短の方法は(ほとんどの場合)文字通りに印刷することです...」

newyear.png

ファイルのベース64:

iVBORw0KGgoAAAANSUhEUgAAAB8AAAAfAQAAAAA31SuUAAAAdElEQVR4XnXOMQ5BQRRA0euVRFgGCq1ubIyJpSh11I
qJWIjo+fnt/JnJe55WornlycXMVAB+Qp49A7U/J8rqlIQReG5Quz6Rx8eA6VaF5R7a5arooXg2LaKvd8KGRyBPJLoy
D640pxZ3pay/creL5KnEvwcfvE46ggJMibIAAAAASUVORK5CYII=

プログラムをゴルフする代わりに、結果のPNG画像をゴルフしました。QRコードは非常に柔軟な形式であり、入力できるエンコード、エラー修正レベル、マスキングイメージなど、さまざまなパラメーターを調整できます。これらはすべて異なるシンボルを生成するため、異なるサイズのファイルに圧縮されます。

したがって、これらすべての組み合わせ(結果として6720個のファイル)を生成するプログラムを作成し、PNGOUTを使用して最小のファイルに圧縮されたものを選択します。次のファイルであることが判明しました。

  • 最初に英数字モードで「20」を書き込みます
  • 次に、数値モードで「1」を書き込みます
  • 次に、数値モードで「5」を書き込みます
  • 「H」(高)エラー修正レベルを使用する
  • 「110」データマスキングを使用する

test-3-1-H-Diamonds.bmp以下のプログラムを使用した場合に呼び出されます。この画像は、PNGOUTを実行した後の175バイト長です。「バージョン1」QRコードの「高」エラー修正レベルを使用すると、データを損なわずにデータ部分の最大8ピクセルを変更できます。少し手作業で試行錯誤することで、上記の173バイトにさらに減らすことができます。それはおそらく小さいことが、すべての組み合わせを排出することは必要とすることができます208の C 8〜7.5×10 13私はやるつもりはありませんチェックを;)


すべての組み合わせを生成するRust(0.13.0-nightly(5ba610265))プログラム:

/* 

Also put these into your Cargo.toml: 

[dependencies]
qrcode = "0.0.3"
bmp = "0.0.3"

*/

extern crate qrcode;
extern crate bmp;

use qrcode::bits::Bits;
use qrcode::optimize::Segment;
use qrcode::types::{Version, EcLevel, Mode};
use qrcode::ec::construct_codewords;
use qrcode::canvas::{Canvas, MaskPattern, Module};

use bmp::{Image, Pixel};

use std::num::Int;

const BLACK: Pixel = Pixel { r: 0, g: 0, b: 0};
const WHITE: Pixel = Pixel { r: 255, g: 255, b: 255 };

static SEGMENT_SEPARATIONS: [&'static [(uint, uint)]; 8] = [
    &[(0, 1), (1, 2), (2, 3), (3, 4)],
    &[(0, 1), (1, 2), (2, 4)],
    &[(0, 1), (1, 3), (3, 4)],
    &[(0, 2), (2, 3), (3, 4)],
    &[(0, 1), (1, 4)],
    &[(0, 2), (2, 4)],
    &[(0, 3), (3, 4)],
    &[(0, 4)],
];

const ALL_EC_LEVELS: &'static [EcLevel] = &[EcLevel::L, EcLevel::M, EcLevel::Q, EcLevel::H];
const ALL_MODES: &'static [Mode] = &[Mode::Numeric, Mode::Alphanumeric, Mode::Byte];
const ALL_MASK_PATTERNS: &'static [MaskPattern] = &[
    MaskPattern::Checkerboard,
    MaskPattern::HorizontalLines,
    MaskPattern::VerticalLines,
    MaskPattern::DiagonalLines,
    MaskPattern::LargeCheckerboard,
    MaskPattern::Fields,
    MaskPattern::Diamonds,
    MaskPattern::Meadow,
];

fn run(ec_level: EcLevel, mask_pattern: MaskPattern, segments: &[Segment], filename: &str) {
    let version = Version::Normal(1);
    let mut bits = Bits::new(version);
    if bits.push_segments(b"2015", segments.iter().map(|s| *s)).is_err() {
        return;
    }
    if bits.push_terminator(ec_level).is_err() {
        return;
    }
    let data = bits.into_bytes();
    let (encoded_data, ec_data) = construct_codewords(&*data, version, ec_level).unwrap();
    let mut canvas = Canvas::new(version, ec_level);
    canvas.draw_all_functional_patterns();
    canvas.draw_data(&*encoded_data, &*ec_data);
    canvas.apply_mask(mask_pattern);
    let canvas = canvas;

    let width = version.width();
    let real_image_size = (width + 10) as uint;
    let mut image = Image::new(real_image_size, real_image_size);
    for i in range(0, real_image_size) {
        for j in range(0, real_image_size) {
            image.set_pixel(i, j, WHITE);
        }
    }
    for i in range(0, width) {
        for j in range(0, width) {
            if canvas.get(i, j) == Module::Dark {
                image.set_pixel((i + 5) as uint, real_image_size - (j + 6) as uint, BLACK);
            }
        }
    }
    image.save(filename);
}

fn main() {
    for (z, separations) in SEGMENT_SEPARATIONS.iter().enumerate() {
        let mut segments = separations.iter().map(|&(b, e)| Segment {
            mode: Mode::Numeric, begin: b, end: e
        }).collect::<Vec<_>>();

        let variations_count = ALL_MODES.len().pow(segments.len());
        for i in range(0, variations_count) {
            let mut var = i;
            for r in segments.iter_mut() {
                r.mode = ALL_MODES[var % ALL_MODES.len()];
                var /= ALL_MODES.len();
            }
            for ec_level in ALL_EC_LEVELS.iter() {
                for mask_pattern in ALL_MASK_PATTERNS.iter() {
                    let filename = format!("results/test-{}-{}-{}-{}.bmp", z, i, *ec_level, *mask_pattern);
                    run(*ec_level, *mask_pattern, &*segments, &*filename);
                }
            }
        }
        println!("processed {}/{}", z, 8u);
    }
}

1
私がここで見る主な問題は、あなたの提出物自体がプログラミング言語で書かれていないことです。
マーティンエンダー14

4
@MartinBüttnerそれは、選ばれた少数の人々の主観的な意見です。そうは言っても、ファイルの取得方法はプログラムされていたので、これは完全に有効な提出だと思います。また、これは簡単なアプローチです。
Nit 14

1
@Nitこれは、ダウン投票のないメタ投稿です。これは、基本的にコミュニティコンセンサスがSE(少なくともPPCG)で機能する方法です。同意できない場合は、その答えに投票するか、代替案を提供できます。そうは言っても、おそらくコルモゴロフの複雑さの課題については個別のメタポストを作成します。
マーティンエンダー14

@Nit 完了。メタでこれについて議論してください。
マーティンエンダー14

gifからの変換は短く見えました。
jimmy23013 14

5

Mathematica、217 177 176 166バイト

ここから始まります:

"newyear.png"~Export~ImagePad[Image[IntegerDigits[36^^fl6ibg25c8z00uef53p4657dgd6hjzg41e5joead1qgz0l2xchqgso5r1a51v5no4zkw9v22okk‌​lg0cymmy2,2,441]~Partition~21],5,1]

少ないゴルフ:

"newyear.png"~Export~ImagePad[
 Image[
  IntegerDigits[
    36^^fl6ibg25c8z00uef53p4657dgd6hjzg41e5joead1qgz0l2xchqgso5r1a51v5no4zkw9v22okk‌​lg0cymmy2,
    2,
    441
  ]~Partition~21
 ],
 5,
 1
]

QRコードは、36進数でエンコードされます。もちろん、拡張ASCII(ベース256)でエンコードすることもできますが、それでは文字列が30バイトしか短縮されず、それよりはるかに少ないコストで変換できるかどうかはわかりません。

もちろん、これはMathematicaなので、63バイトもあります

"newyear.png"~Export~ImagePad[BarcodeImage["2015","QR",21],5,1]

しかし、私はそれが標準的な抜け穴だと思います。;)(これにより、チャレンジのQRコードとは異なるQRコードが生成されるため、QRコードは一意ではないと思いますか?)


1
はい。QRコードで同じ文字列をエンコードする方法は複数あります。たとえば、さまざまなレベルのエラーチェック、エンコードスキーム、マスキングイメージなどを使用します。圧縮を考慮しない場合
ケニー14

FromDigits?36^^fl6ibg25c8z00uef53p4657dgd6hjzg41e5joead1qgz0l2xchqgso5r1a51v5no4zkw9v22okklg0cymmy2代わりに使用できます。
ケニー14

@KennyTMおお、すごいトリックだ。ありがとうございます:)私はそれで、ベース256は本当に価値がないと思います(私は両方ToCharacterCodeを必要としFromDigitsます)
マーティン・エンダー14

3

Matlab 545バイト

新年

骨の折れる組み込みの文字列圧縮/会​​話なしで、骨の折れる手作業でハードコーディングされています。私はそれがまだ他の答えほど良くないことを知っていますが、私はまだ幸せです=)

b=[[61:67,69,71:73,75:81,92,98]+100,
    1,3:4,6,12,23,25:27,29,31:35,37,39:41,43,54,56:58,60,63:64,66,68,70:72,74,85,87:89,91,97,99]+200,
    [1:3,5,16,22,24:26,30,36,47:53,55,57,59,61:67,87:89]+300,
    [9,11,15:16,20:21,24,27,29,40,42,48:50,57,59,71,74:75,77:79,81,85,89:90]+400,
    [2,9,11:12,14:15,18,34:37,39,42:43,46:47,50:51,72,74:75,77:79,81:82,95:99]+500,
    [0:1,3:8,10:12,14:15,26,32,37,40:41,43:45,57,59:61,63,67:69,71:77,88,90:92,94,97]+600,
    [19,21:23,25,27,33,37:39,50,56,59,62,66,69,81:87,89:91,95,99:101]+700];
z=zeros(31);z(b)= 1;imwrite(~z,'newyear.png')

より読みにくい(実際の545バージョン):

z=zeros(31);
z([
    [61:67, 69, 71:73, 75:81, 92, 98] + 100,
    [1, 3:4, 6, 12, 23, 25:27, 29, 31:35, 37, 39:41, 43, 54, 56:58, 60, 63:64, 66, 68, 70:72, 74, 85, 87:89, 91, 97, 99] + 200,
    [1:3, 5, 16, 22, 24:26, 30, 36, 47:53, 55, 57, 59, 61:67, 87:89] + 300,
    [9, 11, 15:16, 20:21, 24, 27, 29, 40, 42, 48:50, 57, 59, 71, 74:75, 77:79, 81, 85, 89:90] + 400,
    [2, 9, 11:12, 14:15, 18, 34:37, 39, 42:43, 46:47, 50:51, 72, 74:75, 77:79, 81:82, 95:99] + 500,
    [0:1, 3:8, 10:12, 14:15, 26, 32, 37, 40:41, 43:45, 57, 59:61, 63, 67:69, 71:77, 88, 90:92, 94, 97] + 600,
    [19, 21:23, 25,27, 33, 37:39, 50, 56, 59, 62, 66, 69, 81:87, 89:91, 95, 99:101] + 700
])= 1;
imwrite(~z,'newyear.png')

31 x 31のゼロ行列を作成しますが、ベクトルとしてアクセスし、インデックスがbtoのすべてのセルを設定し1ます。私が使用したトリックは、連続した整数の表記法でした[1,2,3,4] = 1:4)と、ベクトルのすべての値にスカラーを追加することにより100桁から1つを削除することでした。

誰かがそれを打ち負かすことができるかどうか見てみましょう=)


だから私は単語をunreadable正しく読みませんreadableでした...間違いなく読んでください。それを提案した直後にそれを見て、私の編集を読んだ人が誰でもそれを拒否することを望んでいたが、彼らはそれを見逃したようだ。悪い編集についてごめんなさい...
pseudonym117 14

説明の中で参照する方が簡単なので、最初のバージョンを含めたかっただけです。
flawr 14

2

バッシュ、206の252の257バイト

convertバンドルされているコマンドを使用すると、imagemagickさらに46バイト節約できます。

base64 -d<<<UDQKMzAgMzAKAAAAAAAAAAAAAAAAAAAAAAAAAAAH9L+ABBkggAXULoAF2S6ABdOugAQeoIAH+r+AB9zVAABIlwABHU6AAsIaAAFXS4AAD+QAB/ywAAQT5QAF3pIABd6SAAXdTgAEHBsAB/1OAAAAAAAAAAAAAAAAAAAAAAAAAAAA|convert - newyear.png

変換base64エンコードpbmに画像pngと画像imagemagickconvert

decode (-d)特定のbase64バイナリに合わせてパラメーターを調整する必要がある場合があります。Ubuntu 14.04 LTSでテスト済み。

<<</ here-string を使用して5バイトを保存しました。

base64 -d>newyear.png<<<iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeAQMAAAAB/jzhAAAABlBMVEX///8AAABVwtN+AAAAX0lEQVQI12PACdi/7G9gYJFUaGBgvaIHJG6CiMvrgGJyCxoY2H/tBxJ3rgIVekxnYGCU9WtgYDokBWSFezcwMPA/ARrwZwMDA4vwUwYG1nuTYMRdP6CYjDRQ9q8fbrsBLRkaYOOP83wAAAAASUVORK5CYII=

古いバージョン(257バイト):
echo iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeAQMAAAAB/jzhAAAABlBMVEX///8AAABVwtN+AAAAX0lEQVQI12PACdi/7G9gYJFUaGBgvaIHJG6CiMvrgGJyCxoY2H/tBxJ3rgIVekxnYGCU9WtgYDokBWSFezcwMPA/ARrwZwMDA4vwUwYG1nuTYMRdP6CYjDRQ9q8fbrsBLRkaYOOP83wAAAAASUVORK5CYII=|base64 -d > newyear.png

base64でエンコードされたpngファイルをstdinに書き込む単純なシェルコマンドチェーンbase64は、-dフラグのためにそれをデコードし、そのstdoutをnewyear.pngに書き込みます。


おそらくのようなものを持つ文字保存することができますbase64 -d>newyear.png<<<[the long string]が、私はLinuxマシンのRNではないと私は必須である空白を知らない
undergroundmonorail

base64 -d>newyear.png<<<[base64 string]Ubuntu 14.04での動作が確認されました。
PurkkaKoodari

提案されたコードを使用する場合は、Bash、Ksh、Zshなどの特定の見出しに答えを編集するだけです。一般的なシェル(POSIX互換のSh、Ash、Dashなど)は、here-string構文をサポートしていません。
マナトワーク14

我々はnetpbmのルーチンを使用することができれば、我々は、圧縮されたビットマップを供給し、40バイトを失うことができます:エコーUDQKMzEgMzEKAAAAAAAAAAAAAAAAAAAAAAAAAAAH95 / ABBBQQAXWV0AF0VdABdFXQAQQEEAH9V / AAAWAAAUzMUADqtLABbv0QAcMPAAH1JSAAADwAAfxbUAEFDwABdCUgAXSfAAF1W1ABBMdwAf0FUAAAAA AAAAAAAAAAAAAAAAAAAAAAAを== | base64で-d | pnmtopng> newyear.png
swstephe

@manatwork編集したばかりで、Androidスマートフォンでテストしたとおり、Bashで動作するはずです。
ジャイアントツリー14

1

Python 2 + PIL、 216 215

基本的にMathematicaソリューションの移植版。

from PIL import*
b=Image.new("1",[21]*2)
b.putdata(map(int,'0'*7+bin(int('FL6IBG25C8Z00UEF53P4657DGD6HJZG41E5JOEAD1QGZ0L2XCHQGSO5R1A51V5NO4ZKW9V22OKKLG0CYMMY2',36))[2:]))
ImageOps.expand(b,5,255).save("newyear.png")

0

共通シェルツール+ Imagemagick、215

(echo "P1
21 21"
base64 -d<<<H95/ggoN1lduirt0VdggIP9V/ALAFMzFdVpdu/R4YeH1JSAB4H8W1goeF0JSuk+F1W1gmO/9BVA=|xxd -c99 -p|tr a-f A-F|dc -e2o16i?p|tr -d '\n\\'|fold -21)|convert -border 5 -bordercolor white - newyear.png

少し複雑ですが、他のシェルの答えよりも短いです

  • Base64は、Base64からベース256(拡張ASCII)に変換します
  • xxdは16進数に変換します
  • trは16進数を大文字にし、dcに適しています
  • dcは16進数を読み取り、1と0のバイナリ文字列を出力します
  • trは\と空白を削除します
  • 折り畳むと、行が21文字(21ピクセル)になります
  • この出力P1\n21 21は、PBM P1形式です
  • convert(Imagemagick)は、これを5ピクセルのボーダーで.pngに変換します。

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

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