-
C++で正N角形上の3人目の最適な立ち位置を求める方法
問題の概要N辺の多角形を考えます。2人の子どもがそれぞれ頂点Aと頂点Bに立っているとき、もう1人が立つべき頂点番号を求めるのがこの問題の目的です。ただし、その人物が頂点Aと頂点Bの両方へ到達するために必要なジャンプ回数が最小になるような頂点を選ぶ必要があります。ここで押さえておくべき条件は次の2つです。多角形の頂点には時計回りに番号が付けられています。答えが複数存在する場合は、常に最も番号の小さい頂点を採用します。アルゴリズムの考え方関数vertexPosition(int sides, int vertexA, int vertexB)は、多角形の辺の数と、頂点A・Bの位置を引数として受け取
-
C++でDFA(決定性有限オートマトン)を使った除算と剰余の求め方
DFAによる除算とは決定性有限オートマトン(DFA:Deterministic Finite Automaton)は、ある数が別の数 k で割り切れるかどうかを判定するために利用できます。このアルゴリズムの優れた点は、割り切れない場合にその余り(剰余)まで求められることです。DFAベースの除算では、状態数 k 個の遷移表(DFAテーブル)を構築します。数値は2進表現として扱うため、各状態からの遷移で入力となるのは 0 と 1 のみです。遷移表の作成:createTransTable関数createTransTable(int k, int transTable[][2]) 関数は、遷移表 tr
-
C++で「THE」で終わらない文字列を判定するDFAの実装方法
決定性有限オートマトン(DFA:Deterministic Finite Automaton)を使うと、「THE」という部分文字列で終わらない文字列を効率的に判定できます。ここで注意すべき点は、「tHe」「The」「ThE」のように大文字・小文字が異なるバリエーションも含めて、文字列の末尾に「THE」が現れてはならないということです。 本記事では、C++によるDFAの実装手順を段階的に解説します。 DFAの状態管理の基本 まず、現在の状態を追跡するためのdfa変数を定義し、0で初期化します。この変数は、入力文字との照合が進むごとに次の状態へと遷移していきます。 int dfa = 0; 開始状
-
C++で正六角形の対角線を求める方法
正六角形の対角線の求め方正六角形は、6つの正三角形を組み合わせた図形です。この幾何学的な性質を利用すると、正六角形の対角線(最も長い対角線)は、次の式で簡単に求められます。対角線 = 2 × 辺の長さこれは、正六角形の中心を通る対角線が、ちょうど2つの正三角形の边に相当するためです。C++での実装例それでは、辺の長さから正六角形の対角線を計算するC++プログラムを見てみましょう。#include <iostream>using namespace std;int main(){ float side = 12; i
-
C++で正五角形の対角線の長さを求める方法
正五角形の対角線の公式正五角形の対角線の長さは、1辺の長さと黄金比を用いた次の公式から求めることができます。対角線 = (1 + √5) × 辺の長さ ÷ 2ここで、√5(ルート5)は約2.236です。したがって、実際の計算では「(1 + 2.24) × 辺 ÷ 2」という近似式を使うことができます。C++での実装例以下は、辺の長さから正五角形の対角線を計算するC++プログラムの実装例です。#include <iostream> using namespace std; int main(){ float side = 5; if (side < 0)
-
C++で二分木の対角和を求める方法
二分木の対角和とは二分木の対角和とは、傾き -1 の平行な直線(対角線)で木を分割したとき、それぞれの対角線上に位置するノードのデータをすべて合計した値のことです。本記事では、C++ を使って再帰的な木の走査と std::map を組み合わせて、各対角線ごとの合計を効率的に求める方法を解説します。ノード構造体の定義まず、データ本体と左・右の子ノードへのポインタを持つ、木のノードを表す構造体を定義します。最初に作成されたノードがルートノードとなり、それ以降に作成されるノードは子ノードとして扱われます。struct Node { int data;&n
-
C++で二分木の対角走査(ダイアゴナル・トラバーサル)を実装する方法
二分木の対角走査とは二分木の対角走査(Diagonal Traversal)は、傾き-1の直線を基準に考えます。同じ直線上に位置するノード同士をひとつのグループとして捉え、これらの対角線ごとにノードをたどりながらすべて出力していくのが対角走査です。まず、データと左右の子ノードへのポインタを持つツリーノードを表す構造体を定義します。最初に作成されたノードはルートノードとなり、それ以降に作成されるノードは子ノードとして扱われます。struct Node { int data; struct Node *leftChild, *rightChild
-
C++で対角優位行列を判定する方法
対角優位行列(対角優占行列)とは、すべての行において、その行の対角成分の絶対値が、同じ行内の他の非対角成分の絶対値の合計以上であるような行列のことです。この記事では、C++を使って与えられた行列が対角優位行列かどうかを判定するプログラムの実装方法を解説します。 定数Nの定義 まず、行列の次元を表す定数int型変数Nに値3を設定します。 const int N = 3; isDDM関数の実装 isDDM(int mat[N][N], int n)は、行列とそのサイズを受け取り、真偽値(bool)を返す関数です。関数内部では、ネストされたforループを使用して行列の行と列を順番に走査し、各行の全要
-
C++でO(n)の計算量で二分木の直径を求める方法【新手法】
はじめに二分木(バイナリツリー)の直径とは、木の中で最も長い経路の長さを指します。各ノードに対して「左部分木の高さ + 右部分木の高さ + 1」を計算し、その最大値が直径となります。本記事では、この性質を利用して、各ノードごとに「left_height + right_height + 1」を計算しながら結果を更新していく手法を紹介します。この方法なら、時間計算量はO(n)に抑えられます。ツリーノード構造体の定義まず、データ本体と左右の子ノードへのポインタを持つ、ツリーノードを表す構造体を定義します。最初に作成されたノードはルートノードとなり、それ以降に作成されるノードは子ノードとして扱われま
-
【PowerShell】Invoke-WebRequestを使ってWebサイトのリンクを取得する方法
PowerShellを使ってWebサイト上に存在するリンクを取得するには、まずInvoke-WebRequestコマンドレットで対象のWebページからデータを取得します。 $req = Invoke-WebRequest -uri https://theautomationcode.com $req 実行結果 コマンドを実行すると、Webページ全体のレスポンスが変数 $req に格納されます。このレスポンスオブジェクトには、HTMLコンテンツやステータスコード、リンク情報などさまざまなプロパティが含まれています。 Linksプロパティでリンク情報を取得する ページ内のリンクだけを取り出したい場
-
C++で特定の部分文字列を繰り返し削除し、文字列が空文字列になれるかどうかを判定する方法
2つの文字列 str1 と str2 が与えられているとします。str2 は str1 の部分文字列であり、str1 から削除することができます。また、str2 は str1 内に複数回出現する可能性があります。この問題の目的は、str1 から str2 を何度も繰り返し削除していったときに、最終的に str1 が空文字列(null string)になるかどうかを判定することです。空文字列にできる場合は 1 を返し、できない場合は 0 を返します。例えば、入力が str1 = CCCPPPPPP、str2 = CPP の場合、出力は true(1) となります。解決アプローチこの問題は、以下の
-
【C++】文字列に偶数長の回文部分文字列が含まれているか判定する方法
小文字の英字のみで構成された文字列が与えられたとします。この文字列の中に、「回文」かつ「偶数の長さ」を満たす部分文字列が存在するかどうかを判定し、存在する場合は 1 を、存在しない場合は 0 を返すのが課題です。例えば、入力が afternoon の場合、出力は 1(true)になります。「oo」という長さ 2 の回文部分文字列が含まれているためです。解法のポイントこの問題は、実は隣り合う文字を比較するだけで解くことができます。偶数長の回文では、中央に位置する 2 文字が必ず同じ文字になります。したがって、偶数長の回文が存在するならば、文字列内のどこかに「同じ文字が隣接している箇所」が必ず存在
-
C++で文字列がaⁿbⁿパターンに一致するかどうかを判定する方法
この問題では、「a」と「b」の2種類の文字のみで構成された文字列が与えられます。その文字列が anbn の形式、つまり「n個のa」の後に「n個のb」が続く形になっているかどうかを判定します。条件を満たす場合は1を、満たさない場合は0を返します。 例えば、入力が「aaaaaaaaaaaabbbbbbbbbbbb」の場合、aが12個、その後にbが12個続いているため、出力は1(true)となります。 解決のためのアプローチ この問題は、以下の手順で解決できます。 まず、入力文字列の長さを取得します。 先頭から順に文字を走査し、文字が「a」である限りループを続けます。「a」以外の文字が出現した時点
-
【C++】指定された方向に移動した後、開始位置(0,0)に戻れるかどうかを判定する方法
平面上の座標 (0, 0) を起点として、4種類の文字で構成された文字列が与えられます。この文字列は連続する移動方向を表しており、各文字は以下の方向に対応しています。E:東(east)W:西(west)N:北(north)S:南(south)この問題では、与えられたすべての移動指示を実行した後、再び開始位置 (0, 0) に戻ることができるかどうかを判定します。具体例たとえば入力が EENWWS の場合、出力は true になります。移動の流れを追うと以下のようになります。東へ2単位移動(E、E)北へ1単位移動(N)西へ2単位移動(W、W)南へ1単位移動(S)東西方向の移動が相殺され、南北方向
-
C++で開始座標から目標座標への移動が可能かどうかを判定する方法
2つの座標 (sx, sy) と (tx, ty) が与えられたとき、開始点から終点へ移動できるかどうかを判定する問題を考えてみましょう。ここでいう「移動」とは、ある点 (x, y) を (x, x+y) または (x+y, y) のいずれかに変換する操作のことです。例えば、入力が (1, 1) と (4, 5) の場合、答えは true(移動可能)となります。これは、(1, 1) → (2, 1) → (3, 1) → (4, 1) → (4, 5) という順番で移動できるためです。アルゴリズムの考え方この問題は、ユークリッドの互除法と同じ発想で逆算的に解くのが効果的です。前進する操作は座標
-
OSのデュアルモード操作とは?ユーザーモードとカーネルモードの基礎を解説
はじめにコンピュータシステムは、ハードウェアの計算処理を保護するために、主に2つの動作モードで運用されています。その2つのモードとは以下の通りです。ユーザーモード(User Mode)カーネルモード(Kernel Mode)ユーザーモード(User Mode)とはユーザーモードは、すべてのユーザーアプリケーションやプログラムが実行されるOSのモードです。このモードではユーザーからの命令が処理され、音楽の再生など日常的に使うソフトウェアが動作します。ユーザーモードではハードウェアへの直接アクセス権限が制限されているため、システム全体に影響を与える危険な操作は行えないようになっています。カーネルモ
-
C++でデューデニー数(Dudeney Number)を判定する方法
デューデニー数とは? デューデニー数(Dudeney Number)とは、数論で定義される特殊な自然数の一つです。「ある自然数が、別の自然数の完全立方数に等しく、かつ元の数の各桁の数字和が、その立方根となる数の桁和と一致する」とき、その数をデューデニー数と呼びます(Wikipediaより)。 この数は、イギリスの著名なパズル作家であるヘンリー・デューデニー(Henry Dudeney)によって発見されました。数学的には次の式で表されます。 有名な例としては 512 = 8³ が挙げられます。512 の桁和は 5 + 1 + 2 = 8 となり、立方根である 8 と一致するため、512 はデ
-
ダンプスターダイビング(トラッシング)とは?ハッカーの情報収集手法と対策を解説
ダンプスターダイビング(Dumpster Diving)、別名トラッシング(Trashing)とは、サイバーセキュリティおよびIT分野で用いられる手法の一つで、ハッカーがデータを抽出するために頻繁に利用します。この手法の根底にあるのは、「ある人にとって価値のないものが、別の人にとっては非常に有用なものになり得る」という考え方です。まさに「人のゴミは人の宝(One mans trash is another mans treasure)」という格言通りの仕組みと言えます。トラッシングとは、オンライン上のゴミ(未使用・放置された情報)を検索し、企業や個人に関する有益な情報を見つけ出して、ハッキング
-
C++で学ぶシュトラッセンの行列乗算アルゴリズム|7つの式を簡単に覚える方法
シュトラッセンのアルゴリズムとは シュトラッセンのアルゴリズム(Strassens Algorithm)は、分割統治法に基づく行列乗算アルゴリズムです。同じサイズの2つの行列を乗算する際に使用され、従来の手法と比べて乗算の回数を削減できることで知られています。 通常の行列乗算 2つの行列の積を求める場合、一般的には以下のように計算します。 シュトラッセンのアルゴリズムによる乗算 シュトラッセンのアルゴリズムでは、乗算の手順を簡略化することで計算のオーバーヘッドを削減します。具体的には、以下の7つの積(M1〜M7)を求めます。 M1 = a × (f − h) M2 = (a + b)
-
C++システムプログラミングにおけるエディタとは?種類と特徴を徹底解説
エディタとは、コンピュータ上のファイルを編集するために使用される基本的なソフトウェアです。プログラマーに対して、ドキュメントの作成・編集・更新・書式設定を、自分の望む順序で自由に行える環境を提供します。システムプログラミングにおいてエディタとは、プログラムを編集するために使われるソフトウェアやツールのことを指します。これらは、コード編集のための機能が統合された特殊なテキストエディタであると言えます。一般的なプログラミング用エディタとしては、Notepad++、Visual Studio Code、Sublime Textなどが挙げられます。また、単なるコード編集にとどまらない機能を備えたツール