0

0..255数字の範囲 ( ) を取得し、各数字を実行して、別の配列にない数字を見つける単純な Perl スクリプトを作成しようとしています。

これのポイントは、ゲームでまだ占有されていない Minecraft ブロック ID を見つけることができるようにすることです。最初の配列は、0..255可能な最大ブロック ID の範囲です。次の配列は、リストを作成した既に使用されている ID です。

したがって、考えられるすべてのブロック ID をチェックするある種のループが必要です。私は自分のコンピュータに到達したときに私が持っているものを投稿します.

4

4 に答える 4

4

最も簡単な(そして最も速い)方法は、他の配列をハッシュに変換し、そこにキーが存在するかどうかを確認することです。

my %hash = map { $_ => 0 } @array2;

print (exists $hash{$_} ? "$_ is there\n" : "$_ is not there\n") for(0..255);
于 2012-07-03T18:38:14.640 に答える
1

使わない理由

$occupied_lookup[$_] = 1 for 4,5,6;

それ以外の

@occupied_indexes = (4,5,6);

何かを占領するのがより簡単かつ迅速になります:

$occupied_lookup[$_] = 1;

空いているものをより簡単かつ迅速に作成できます。

$occupied_lookup[$_] = 0;

何かが占有されているかどうかを簡単かつ迅速に確認できます。

if ($occupied_lookup[$_])

占有されているすべてのインデックスを見つけるのは簡単です。

my @occupied_indexes = grep $occupied_lookup[$_], 0..$#occupied_lookup;

(他の人はハッシュを提案しましたが、配列の方が高速です。)

于 2012-07-03T19:14:50.673 に答える
0

2 つの配列の違いは、必ずしも for ループや while などが必要であることを意味するわけではありません。

#!usr/bin/perl
use warnings;
use strict;
my @allblocks=(0...255);
my @occupiedones=(1,2,80,255)

my %occupiedones=map{$_=>1} @occupiedones;

# the difference of two arrays

my @diff=grep(!defined $occupiedones{$_}, @allblocks);

# proof it works
print "This is in one array and not the other:\t$_\n" foreach (@diff);
于 2012-07-03T18:43:21.873 に答える
0

これはあなたが望むことをします。コード内のコメントで説明します。

#!/usr/bin/perl

use warnings;
use strict;

# Print members of @b that are not in @a.
# That is, loosely speaking, print @b minus @a.

my @a = (10, 20, 30, 40, 50);
my @b = (22, 25, 30, 40, 42);

my %a = map {$_=>1} @a;
$a{$_} or print "$_ " for @b;
print "\n";

アイデアは、ハッシュに@a変換し、ハッシュ%aを使用して減算を制御することです。ハッシュでは、キーのみが重要です。対応する値はすべて justであり、これはこの種のアプリケーションでは一般的です (ダミー値は、C++ でset1と呼ばれるものを実装するための Perl の方法です)。

于 2012-07-03T18:43:44.580 に答える