0

このコード ゴルフ チャレンジに出くわしました: https://codegolf.stackexchange.com/questions/19196/transform-number-into-7-segment-display-pattern

独自の解決策を試みたところ、スケール 1 でかなり簡単に解決できました。しかし、画像を適切にスケーリングする方法がわかりません。これは、これまでのところです。場所 a ~ f は、ディスプレイ マッピングをどのようにレイアウトしたかを示したこの画像を参照しています。

地図

use strict;
use warnings; 

my $charmap = 
    {   a => [split //, '_ __ _____'], 
        b => [split //, '|||||  |||'],
        c => [split //, '|| |||||||'],    
        d => [split //, '_ __ __ _ '],     
        e => [split //, '| |   | | '],     
        f => [split //, '|   ||| ||'],     
        g => [split //, '  _____ __']     
    };

my @nums  = split //, shift; 
my $scale = shift; 

print ' ';
foreach ( @nums ) {
  print fill('a', $_) . '  '
}
print "\n";
foreach ( @nums ) {
  print fill('f', $_) . fill('g', $_) . fill('b', $_)
}  
print "\n";
foreach ( @nums ) {
  print fill('e', $_) . fill('d', $_) . fill('c', $_)
} 
print "\n";

sub fill {
    my ($k, $n) = @_;  

    return $charmap->{$k}->[$n];
}

スケール= 1で実行すると:

archer@mac$ perl print_as_led.pl 0123456789 1
 _     _  _     _  _  _  _  _  
| |  | _| _||_||_ |_   ||_||_|
|_|  ||_  _|  | _||_|  ||_|  |

これらを倍率でスケールアップする方法について何か考えはありますか? だから私が実行すると:

archer@mac$ perl print_as_led.pl 0123456789 2

私は見るでしょう:

 __      __  __      __  __  __  __  __
|  |   |   |   ||  ||   |      ||  ||  |
|  |   | __| __||__||__ |__    ||__||__|
|  |   ||      |   |   ||  |   ||  |   |
|__|   ||__  __|   | __||__|   ||__|   |

ヒント/ヘルプをいただければ幸いです。私はゴルフのソリューションを作成しようとしているのではなく、通常のソリューションを作成しようとしています。

4

2 に答える 2

0

やり過ぎ

この投稿に興味を持ち、「7 セグメント表示パターン」の概念を拡張することにしました。最終的に、表示をより細かく制御できるパッケージのグループを作成しました。モジュラー設計は急ぎましたが、かなりうまく機能します。

タイトルが推測しているように、 hash lookup を書くのにかかる時間ははるかに短かったでしょうinput_char => ascii_image。さまざまなスタイルの多数のディスプレイが必要な場合や、ディスプレイのスタイルが定期的に更新される場合に役立ちます。

新しくインスタンス化されたオブジェクトを提供するために必要な 5 つの主要な情報があります。

  • string - 入力として提供される文字列。
  • 画像テンプレート- 個々の画像と画像内の各セグメントの位置を表す文字列。
  • セグメント ID ルックアップ テーブルへの入力文字- 特定の入力文字を入力するセグメントを検索するために使用されるハッシュ。
  • セグメント id からセグメント char ルックアップ テーブル- 特定のセグメントを埋めるために使用する文字をルックアップするために使用されるハッシュ。
  • 表示形式- 表示の向きを制御するための書式文字列または書式ハンドラー。

上記のさまざまなバリエーションを提供することで、表示スタイルの多くの側面を制御できます。

画像テンプレートのアプローチを使用することにしたため、「倍率で拡大」という元のクエリを満たすのは簡単ではありません。代わりに、希望する縮尺で画像テンプレートを提供します。要素を組み込みたい場合は、2 つ以上の画像テンプレート間のパターンを解読し、目的の画像テンプレートを自動的に生成するルーチンを作成できます。

セグメント ID とセグメント文字に同じ文字を使用すると、検索と置換の競合が問題になる可能性があることに注意してください。

$perl display.pl 0123456789ABCDE

コード:

#!/usr/bin/perl
use strict;
use warnings FATAL => qw/ all /;

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

package display::image_template;

our $roman_small = <<'template';
00000 
0 1 0 
06720 
05430 
00000 
template

our $roman_medium = <<'template';
000000 
0 11 0 
06  20 
067720 
05  30 
054430 
000000 
template

our $roman_large = <<'template';
0000000 
0 111 0 
06   20 
06   20 
0677720 
05   30 
05   30 
0544430 
0000000 
template

our $italic_small = <<'template';
000000 
0   10 
0 6720 
0543 0 
000000 
template

our $italic_medium = <<'template';
000000000 
0     110 
0   6  20 
0  6772 0 
0 5  3  0 
05443   0 
000000000 
template

our $italic_large = <<'template';
000000000000 
0       1110 
0     6   20 
0    6   2 0 
0   67772  0 
0  5   3   0 
0 5   3    0 
054443     0 
000000000000 
template

our $roman_roman_shadow_small = <<'template';
00000 
0 1 0 
06720 
05430 
05730 
06120 
00000 
template

our $roman_italic_shadow_small = <<'template';
000000 
0 1  0 
0672 0 
0543 0 
0D7A 0 
0 C1B0 
000000 
template

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

package display::input_char_to_segment_ids;

our $alphanumeric =
{
    # input_char => segment_ids

    ' ' => [ ],
    0   => [ 0, 1, 2, 3, 4, 5, 6    ],
    1   => [ 0,    2, 3             ],
    2   => [ 0, 1, 2,    4, 5,    7 ],
    3   => [ 0, 1, 2, 3, 4,       7 ],
    4   => [ 0,    2, 3,       6, 7 ],
    5   => [ 0, 1,    3, 4,    6, 7 ],
    6   => [ 0, 1,    3, 4, 5, 6, 7 ],
    7   => [ 0, 1, 2, 3,            ],
    8   => [ 0, 1, 2, 3, 4, 5, 6, 7 ],
    9   => [ 0, 1, 2, 3, 4,    6, 7 ],
    A   => [ 0, 1, 2, 3,    5, 6, 7 ], 
    B   => [ 0, 1, 2, 3, 4, 5, 6, 7 ],
    C   => [ 0, 1,       4, 5, 6,   ],
    D   => [ 0, 1, 2, 3, 4, 5, 6    ],
    E   => [ 0, 1,       4, 5, 6, 7 ],

    # etc
};

our $alphanumeric_shadow = expand_segment_ids( { %$alphanumeric }, { 3 => 'A', 2 => 'B', 6 => 'C', 5 => 'D' } );

sub expand_segment_ids
{
    my ( $input_char_to_segment_ids, $old_segment_id_to_new_segment_id ) = @_;

    while ( my ( $input_char, $segment_ids ) = each %$input_char_to_segment_ids )
    {
       while ( my ( $old_segment_id, $new_segment_id ) = each %$old_segment_id_to_new_segment_id )
       {
          push @$segment_ids, $new_segment_id if grep { $_ eq $old_segment_id } @$segment_ids;
       }
    }

    return $input_char_to_segment_ids;
}

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

package display::segment_id_to_segment_char;

our $roman = 
{
    # segment_id => segment_char

    0 => ' ', # border

    1 => '_',
    2 => '|',
    3 => '|',
    4 => '_',
    5 => '|',
    6 => '|',
    7 => '_',
};

our $italic = 
{
    # segment_id => segment_char

    0 => ' ', # border

    1 => '_',
    2 => '/',
    3 => '/',
    4 => '_',
    5 => '/',
    6 => '/',
    7 => '_',
};

our $roman_italic_shadow = 
{
    # segment_id => segment_char

    0 => ' ', # border

    1 => '_',
    2 => '|',
    3 => '|',
    4 => '_',
    5 => '|',
    6 => '|',
    7 => '_',

    A => '\\',
    B => '\\',
    C => '\\',
    D => '\\',
};

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

package display::display_format;

our $vertical     = undef;

our $horizontal   = sub { return '~~' . '^*' x $_[0] . " \n"; };

our $horizontal_b = sub { formline( '~~' . '^*' x @{$_[1]} . " \n", @{$_[1]} ); return $^A; };

#our $diagonal     = sub { };

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

package display;

# hacky way to generate accessor subroutines.
eval 'sub ' . $_ . ' { if ( $#_ ) { $_[0]->{' . $_ . '} = $_[1]; return $_[0] } else { return $_[0]->{' . $_ . '}; } }' for qw/ string image_template input_char_to_segment_ids segment_id_to_segment_char blank_segment_char images display_format /;

sub new
{
    return bless { }, $_[0];
}

sub execute
{
    my ( $self ) = @_;

    my $string                     = $self->string                     // die 'string required';
    my $image_template             = $self->image_template             // die 'image_template required';
    my $input_char_to_segment_ids  = $self->input_char_to_segment_ids  // die 'input_char_to_segment_ids required';
    my $segment_id_to_segment_char = $self->segment_id_to_segment_char // die 'segment_id_to_segment_char required';
    my $blank_segment_char         = $self->blank_segment_char         // ' ';

    my @images;

    my @input_chars = split //, $string;

    for my $input_char ( @input_chars )
    {
        my $image_template_copy = $image_template;

        my $input_char_segment_ids_list = $input_char_to_segment_ids->{$input_char} // die "cannot retrieve segment ids for input char '$input_char'";
        my %input_char_segment_ids_hash = map { $_ => 1 } @$input_char_segment_ids_list; # instead of repeatedly using grep below.

        while ( my ( $segment_id, $segment_char ) = ( each %$segment_id_to_segment_char ) )
        {
            $segment_char = $blank_segment_char unless exists $input_char_segment_ids_hash{$segment_id};

            $image_template_copy =~ s/$segment_id/$segment_char/eg;
        }

        push @images, $image_template_copy;
    }

    $self->images( \@images );

    return $self;
}

sub display
{
    my ( $self ) = @_;

    my $images         = $self->images         // die 'execute before display in order to construct images';
    my $display_format = $self->display_format;

    my $display;

    if ( defined $display_format )
    {
        $^A = '';

        if ( ref $display_format eq ref sub { } )
        {
            $display = $display_format->( $self, $images );
        }
        else
        {
            formline( $display_format, @$images );
            $display = $^A;
        }
    }
    else
    {
        local $" = "\n";
        $display = "@$images";
    }

    return $display;
}

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

package main;

my $string = shift // '';

my $display = display->new
                     ->string                    ( $string )
                     ->image_template            ( $display::image_template::roman_large )
                     ->input_char_to_segment_ids ( $display::input_char_to_segment_ids::alphanumeric )
                     ->segment_id_to_segment_char( $display::segment_id_to_segment_char::roman )
                     ->display_format            ( $display::display_format::horizontal_b );

print $display->execute->display;

$display->image_template            ( $display::image_template::roman_italic_shadow_small );
$display->segment_id_to_segment_char( $display::segment_id_to_segment_char::roman_italic_shadow );

print $display->execute->display;

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

__END__

出力:

 ___             ___     ___             ___     ___     ___     ___     ___     ___     ___     ___     ___     ___
|   |       |       |       |   |   |   |       |           |   |   |   |   |   |   |   |   |   |       |   |   |
|   |       |       |       |   |   |   |       |           |   |   |   |   |   |   |   |   |   |       |   |   |
|   |       |    ___|    ___|   |___|   |___    |___        |   |___|   |___|   |___|   |___|   |       |   |   |___
|   |       |   |           |       |       |   |   |       |   |   |       |   |   |   |   |   |       |   |   |
|   |       |   |           |       |       |   |   |       |   |   |       |   |   |   |   |   |       |   |   |
|___|       |   |___     ___|       |    ___|   |___|       |   |___|    ___|   |   |   |___|   |___    |___|   |___


 _             _      _             _      _      _      _      _      _      _      _      _      _
| |      |     _|     _|    |_|    |_     |_       |    |_|    |_|    |_|    |_|    |      | |    |_
|_|      |    |_      _|      |     _|    |_|      |    |_|     _|    | |    |_|    |_     |_|    |_
\ \      \    \_      _\     _\     _\    \_\      \    \_\     _\    \_\    \_\    \      \ \    \_
 \_\      \     _\     _\    \ \    \_     \_      _\    \_\    \_\    \_\    \_\    \_     \_\    \_
于 2014-02-17T11:20:47.860 に答える