ゲーム15



1880年の初め、ウスターの歯科医であるチャールズ・ペビーは、次の問題を解決するために1000ドル(当時は良いお金でした)を提供することで一般の注目を集めました。写真のように。 タスクは、チェッカーを連続して移動することにより、それらを通常の位置に戻すことでしたが、チェッカー14と15の順序は修正する必要があります。



当社では、各従業員が週5時間独習することができます(Habrでの読み取り/書き込み、F#の学習、またはSICPの読み取り)。 時間が経つにつれて、このプラクティスはミニプロジェクトの作成に進化しました。 そのため、たとえば、経験豊富なJavaScript開発者であるマキシムは、iOSアプリケーションの作成に手をかけることにし、約1か月半でタグをリリースしましたが、広告なしで1週間の売上でロシアのApp Storeのトップ10に入りました。



さらに、Objective-Cの検証コードと、Yakov Isidorovich PerelmanによるLive Mathematicsの本の合格点の原則。



私たちの多くにとって、考えられるすべての組み合わせ(1,307,674,368,000)の正確に半分に解決策がないことに驚きました。 可解性をテストするために、ウィキペディアから式を取りました。数値iの正方形を、左から右、上から下に数える場合、 iより小さい数値のk正方形まで配置します。 n i = kを取ります。つまり、 i番目の番号を持つナックルの後にiより小さい番号がない場合、 k = 0です。また、番号e-空のセルの行番号(1からカウント)を導入します。 量が







奇妙な場合、パズルの解決策は存在しません。



Objective-C検証コード



#import "GamePositionValidator.h" @interface GamePositionValidator(){ NSInteger emptyCellRowNumber; } @property (nonatomic, retain) NSArray* validPosition; @property (nonatomic, retain) NSArray* currentPosition; @end @implementation GamePositionValidator @synthesize validPosition; @synthesize currentPosition; -(id) initWithValidPosition:(NSArray *) _validPosition emptyCellRowNumber:(NSInteger ) _emptyCellRowNumber{ if(self = [super init]){ self.validPosition = _validPosition; emptyCellRowNumber = _emptyCellRowNumber; } return self; } -(NSInteger) positionOfChipInValidPosition:(NSInteger) chipNumber{ for(NSInteger i=0; i<self.validPosition.count; i++){ NSNumber* number = [self.validPosition objectAtIndex:i]; if(number.intValue == chipNumber){ return i; } } return -1; } -(NSInteger) countOfDisordersInPosition:(NSInteger) position{ NSInteger chipNumber = ((NSNumber*)[self.currentPosition objectAtIndex:position]).intValue; NSInteger chipPosition = [self positionOfChipInValidPosition:chipNumber]; NSInteger countOfDisorders = 0; for( NSInteger i= position+1; i<15; i++){ chipNumber = ((NSNumber*)[self.currentPosition objectAtIndex:i]).intValue; NSInteger nextChipPosition = [self positionOfChipInValidPosition:chipNumber]; if( nextChipPosition < chipPosition){ countOfDisorders ++; } } return countOfDisorders; } -(BOOL) isPositionCanBeTransformedToValidPosition:(NSArray*) position{ self.currentPosition = position; NSInteger totalDisorders = 0; for(NSInteger i=0; i<self.currentPosition.count; i++){ totalDisorders+=[self countOfDisordersInPosition:i]; } self.currentPosition = nil; return (totalDisorders + _emptyCellRowNumber) % 2 == 0; } @end
      
      





これはMaxの最初のObjective-Cアプリケーションなので、安全に批判できます。



最後に、Y。I. Perelman「Living Mathematics」の本の「タグ」の通過の原則:

「雑多な混乱の中に15個のピース​​が配置される配置を想像してください。 動きの近くでは、常にチェッカー1を所定の位置に置くことができます。 同様に、チェッカー1に触れることなく、チェッカー2を右隣の場所に移動することができます。 その後、チェッカー1と2に触れることなく、通常の場所にチェッカー3と4を配置できます:誤って最後の2つの垂直列にない場合は、チェッカーをこの領域に簡単に持ち込み、いくつかの動きで目的の結果を達成できます。

これで、一番上の行1、2、3、4が整理され、チェッカーをさらに操作して、この行には触れません。



同様に、2行目を並べようとします:5、6、7、8; これが常に達成可能であることを確認するのは簡単です。 さらに、最後の2行のスペースでは、チェッカー9と13を通常の位置に移動する必要があります。 常に可能です。 1、2、3、4、5、6、7、8、9、および13の順序で配置されたすべてのチェッカーは、その後移動されません。







6つのフィールドからなる小さな領域が残っており、そのうち1つは空いています。残りの5つは、ランダムな順序でチェッカー10、11、12、14、15によって占有されています。 この6人乗りセクション内で、チェッカー10、11、12は常に通常の場所に持ち込むことができます。これが達成されると、最後の行にチェッカー14と15が通常の順序でまたは逆に配置されます。 頑張って



All Articles