プログラミングパズルとコードゴルフ

プログラミング愛好家やコードゴルファーのためのQ&A

4
VIC暗号エンコーダーを書く
VIC暗号はこれまでに考案された最も複雑な鉛筆と紙暗号の一つです。ソビエトのスパイReinoHäyhänen(コード名「VICTOR」)が1950年代に使用した主な原理は、難読化によるセキュリティです。多くの難読化の。 あなたの仕事は、メッセージを受け取り、VIC暗号を使用してエンコードするプログラムまたは関数を作成することです。私はまたしているここVIC暗号デコーダチャレンジを掲載します。次の指示のいずれかが不明な場合は、コメントでそれらについて尋ねることをtoしないでください。指示はこのサイトから適応されます。 VIC暗号のエンコード 準備 5つの入力が必要です。 平文メッセージ あなたの言語で最も一般的な文字を含む短いキーワードまたはフレーズ 引用や歌の行などのキーフレーズ(20文字以上) 日付(または6桁以上の別の数値) パーソナルエージェント番号 実際には、これらの最後の4つは、送信者と受信者のエージェント番号がエンコードで使用されるかどうかを含め、送信者と受信者によって事前に合意される必要があります。 私のメッセージ例は次のとおりです。 We are discovered. Take what you can. Burn everything else. Move to Safehouse Foxtrot 3. 英語でエンコードします(ただし、好みの言語とアルファベットを使用できます)A, E, I, N, O, R, S, T。英語のアルファベットで最も一般的な文字はです。キーワードを使用しますSENATORI。 私のキーフレーズは、リチャード・ファインマンの引用です:「最初の原則は、あなたは自分をだましてはいけないということです—そして、あなたはだますのが最も簡単な人です。」 日付として、2016年7月31日(形式3172016)を使用します。これは、この説明を書いた日です。 私が自分用に選んだ個人番号は9です。 手順の概要 次の手順で使用する中間キーを導出します。 跨ぐチェッカーボードを作成して適用します。 最初の転置テーブルを構築して適用します。 2番目の(中断された)転置テーブルを作成して適用します。 メッセージインジケータグループを挿入して、メッセージを完成させます。 サブメカニズム 問題の本質を説明する前に、2つの事柄を説明します。チェーンの追加と順次化のプロセスです。 ラグ付きフィボナッチジェネレーターとも呼ばれるチェーン加算は、開始桁シーケンスを取得し、最初の2桁を運ぶことなく加算し(それらを一緒に加算しmod 10)、結果を末尾に追加します。例えば: 79081 7 …

13
予報パリンドローム日付
回文の日付は回文として表示される日付です。数字の文字列は、順方向と逆方向に読み取ることができます。北米の日付形式(MM / DD / YYYY)の場合、次のいくつかの回文日付は次のとおりです。 02/02/2020 12/02/2021 03/02/2030 チャレンジ 日付の範囲内に収まる一貫した共通の日付形式(選択した)ですべての回文日付を返す関数を作成します(編集:範囲自体を含む)。 ルール 回文の資格を得るには、日付の数字のみをチェックする必要があります。 日付は、月と日の両方に2桁、年に4桁を使用し、文字を使用して日付の各部分を区切る限りMM/DD/YYYY、任意の一般的な形式(、DD-MM-YYYY)にすることができます。出力では/、区切り文字(-、など)を保持する必要があります。関数は、1つの異なる日付形式のみを処理する必要があります。回答に形式を含めてください。 返される日付が複数ある場合は、カンマまたは改行で区切る必要があります。 最短回答が勝ちます! 例 date_palindrome('05/02/2050', '12/12/2060') >>>['05/02/2050', '06/02/2060']

4
SHA-256を実装する
バイトのシーケンスを指定して、シーケンスのSHA-256ハッシュ値を出力します。 SHA-256アルゴリズム 次の擬似コードは、SHA-2のウィキペディアのページから取得したものです。 Note 1: All variables are 32 bit unsigned integers and addition is calculated modulo 2^32 Note 2: For each round, there is one round constant k[i] and one entry in the message schedule array w[i], 0 ≤ i ≤ 63 Note 3: The compression function uses 8 …

5
ジョーダン分解
重要な注意:この課題は正方行列にのみ適用されるため、「行列」という用語を使用するときは常に、正方行列を参照していると想定されます。簡潔にするために、「正方形」の説明は省略します。 バックグラウンド 行列式の計算、線形システムの解決、スカラー値関数のマトリックスへの拡張など、マトリックスに関連する多くの操作は、同様の対角マトリックス(主対角上にない要素が0であるマトリックス)を使用することで簡単になります元の行列(つまり、入力行列Aと対角行列の場合D、; Pなどの可逆行列が存在し、固有値、行列式、トレースなどの重要なプロパティを共有します)。(解くことによって与えられた行列の特性多項式の根の異なる固有値を持つ行列のため、同じ寸法の単位行列である)、対角化は単純です。D = P^(-1) * A * PDAdet(A-λI) = 0λIADは、主対角線上に固有値を持つ行列であり、Pそれらの固有値に対応する固有ベクトルから形成された行列です(同じ順序で)。このプロセスはeigendecompositionと呼ばれます。 ただし、固有値が繰り返される行列は、この方法では対角化できません。幸いなことに、任意の行列のヨルダン正規形はかなり簡単に計算でき、通常の対角行列よりも作業するのはそれほど難しくありません。また、固有値が一意である場合、Jordan分解は固有分解と同一であるという優れた特性を備えています。 ヨルダン分解の説明 A固有値の幾何学的多重度がすべて1である正方行列の場合、ジョーダン分解のプロセスは次のように記述できます。 みましょうλ = {λ_1, λ_2, ... λ_n}の固有値のリストでA連続して登場する繰り返し固有値で、多様で、。 J要素がの要素である対角行列をλ同じ順序で作成します。 多重度が1より大きい各固有値について、最後を除いて1、の主対角の固有値の繰り返しのそれぞれの右側にa を配置しJます。 結果の行列Jは、のジョーダン正規形ですA(固有値の順序に応じて、特定の行列に対して複数のジョーダン正規形が存在する可能性があります)。 実例 ましょうはA、次の行列です: の固有値はA、多重度で、ですλ = {1, 2, 4, 4}。これらを対角行列に入れると、次の結果が得られます。 次に、1繰り返し固有値のそれぞれのうち1つを除くすべての右側にs を配置します。以来4唯一の繰り返し固有値は、我々は、単一の配置1最初の4の次に: これは、Jordanの正規形ですA(単一のマトリックスに複数の有効なJordan正規形が含まれる可能性がありますが、説明のためにその詳細を詳しく説明します)。 タスク A入力として正方行列を指定し、の有効なヨルダン正規形を出力しますA。 入力および出力は、任意の妥当な形式(2D配列/リスト/任意、リスト/配列/列または行ベクトルの任意、組み込み行列データ型など)になります。 の要素と固有値は、A常に範囲内の整数になります[-200, 200]。 簡単にするために、すべての固有値の幾何学的多重度は1になります(したがって、上記のプロセスが成り立ちます)。 A せいぜい10x10マトリックスと少なくとも2x2マトリックスになります。 固有値や固有ベクトルを計算したり、固有分解、ヨルダン分解、その他の種類の分解/対角化を実行する組み込み関数は許可されていません。行列演算、行列反転、およびその他の行列組み込みが許可されています。 テストケース [[1, 0], [0, 1]] …

15
g l f a t a n 2
時には、デカルト座標(x,y)を極座標に変換するのは本当に大変です(r,phi)。r = sqrt(x^2+y^2)非常に簡単に計算できますが、角度を計算する際にケースの区別が必要になることがよくあります。phiこれarcsinはarccos、arctanおよび他のすべての三角関数が、それぞれが円の半分のみに広がる共領域を持つためです。 多くの言語には、直交座標を極座標に変換するための組み込みatan2機能があります。または、少なくとも(x,y)角度を計算する関数がありますphi。 仕事 あなたのタスクは、2つ(浮動小数点、両方ではないゼロ)デカルト座標を取るプログラム/関数を記述することで(x,y)、対応する極角出力するphi、phiと(度、ラジアン、またはグレードでなければならないグレード Iは、平均グラジアン 1であります/ 400の完全な円)、あなたにとってより便利な方。 角度は正の方向で測定され、の角度はゼロです(1,0)。 詳細 あなたは、角度計算ビルトインを使用することはできませんphiを含む2点の座標、与えられたatan2、rect2polar、argOfComplexNumberおよび同様の機能を。ただし、通常の三角関数とその逆関数を使用できます。これらの関数は1つの引数のみを取ります。単位記号はオプションです。 半径はr非負でなければならない、とphiの範囲でなければなりません[-360°, 360°](それはあなたの出力かどうかは関係ありません270°か-90°)。 例 Input Output (1,1) 45° (0,3) 90° (-1,1) 135° (-5,0) 180° (-2,-2) 225° (0,-1.5) 270° (4,-5) 308.66°
18 code-golf  math  geometry  trigonometry  code-golf  number-theory  fibonacci  code-golf  math  sequence  fibonacci  code-golf  string  code-golf  math  graphical-output  geometry  code-golf  string  code-golf  math  geometry  code-golf  math  bitwise  number  popularity-contest  graphical-output  image-processing  fractal  code-golf  number-theory  code-golf  date  multi-threading  code-golf  math  code-golf  math  number  sequence  code-golf  math  number  sequence  arithmetic  code-golf  decision-problem  logic-gates  code-golf  decision-problem  balanced-string  code-golf  math  arithmetic  combinatorics  code-golf  expression-building  code-golf  physics  code-golf  abstract-algebra  code-golf  number  arithmetic  integer  code-golf  ascii-art  number  code-golf  number-theory  primes  code-golf  arithmetic  grid  code-golf  code-golf  sequence  code-golf  kolmogorov-complexity  compression  code-golf  math  number  arithmetic  array-manipulation  code-golf  primes  hexagonal-grid  complex-numbers  code-golf  number  counting  code-golf  math  number  arithmetic 

13
DCでのゴルフのヒント
DCでゴルフをするための一般的なヒントは何ですか? dcは、C言語より前のUNIX / Linux用の計算ユーティリティです。DCプログラム(計算?)を短くする方法に興味があります。少なくともDCに少し固有の一般的なコードゴルフに適用できるアイデアを探しています(たとえば、コメントを削除することは有益な答えではありません) 回答ごとに1つのヒントを投稿してください。
18 code-golf  tips  dc 

3
フィールドで最高のスコア
前書き フィールドを、文字とのみで満たされた長方形-とし[0-9]ます。フィールドの例は次のとおりです。 11-011123 111-010-- 0010---01 111-01234 このフィールドは、3つの小さな領域に分割されていることがわかります。 より小さなエリアのスコアを計算するには、すべての数値を加算します。例えば: 11 111 0010 111 1 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + 1 + 1 = 9 このエリアの合計スコアは9です。次に、2番目の領域についても同じことを行います。 011123 010 0 + 1 + 1 + 1 + 2 + …
18 code-golf  number  grid 

9
前後のシーケンス
で構成されたパスを想像<し、>そしてで終わる@、例えば ><>@ ウォーカーは左端のセルから始まります。彼は次のようにパスを横断します。 歩行者が@セル上にいる場合、彼は目標に到達して完了です。 歩行者が>セル上にいる場合、経路全体が右に1ステップずつ周期的に移動し、歩行者を連れて行きます。 歩行者が<セル上にいる場合、パス全体が左に1ステップずつ周期的に移動し、歩行者を連れて行きます。 その後、歩行者は一歩を踏み出します。彼がパスのどちらかの端にいる場合、彼は端から離れます。それ以外の場合、彼は最後のステップで移動した方向に(回転を無視して)移動し続け、最初は右に歩きます。 上記の例を見ていきましょう。歩行者の位置には次のマークが付いてい^ます。 ><>@ --rotate--> @><> ^ ^ step right (first step): @><> --rotate--> ><>@ ^ ^ step right: ><>@ --rotate--> @><> ^ ^ step left (dead end): @><> --rotate--> ><>@ ^ ^ step left: ><>@ --rotate--> @><> ^ ^ step left: @><> Goal reached! …

6
文字列の長さエンコード
以下のルールを使用して、ASCII印刷可能文字のみを含み、*-string と呼ばれる別の文字列から単一の文字列をプルするとします。プロセスが停止する前に文字列がなくなった場合、それはエラーであり、その場合のプロセスの結果は未定義です。 皮切りに d=1, s="" a *に出会うたびにd、2を掛けます。別の文字に出会うたびに、それを最後に連結し、sから1を引きdます。今ならd=0、停止して戻るs 定義された例: d->d 769->7 abcd56->a *abcd56->ab **abcd56->abcd *7*690->769 ***abcdefghij->abcdefgh 未定義の例:(空の文字列もこれらの1つになることに注意してください) *7 **769 *7* *a*b * あなたの仕事は、文字列を*取得し、その文字列を生成する最短の文字列を返すことです。 プログラム例: 7->7 a->a ab->*ab abcd->**abcd 769->*7*69 プログラムは、少なくとも1文字と非*ASCII印刷可能文字のみを含む文字列を処理する必要があります。定義上、どの文字列も生成できないため、プロセスが未定義の文字列を返すことはできません。 標準の抜け穴とI / Oルールが適用されます。
18 code-golf  string 

27
カウントアップ、交換、繰り返し!
定義 CURRシーケンスのn 番目の配列を次のように定義します。 シングルトン配列A = [n]から始めます。 各整数のためにKにA、エントリ交換Kを用いてKからカウントアップ、自然数1にK。 前のステップn-1をさらに繰り返します。 たとえば、n = 3の場合、配列[3]から始めます。 3を1、2、3に置き換えて、[1、2、3]を生成します。 私たちは今取り替える1、2、および3と1。1、2および1、2、3(それぞれ)、[ 1、1、2、1、2、3 、]を生成します。 最後に、配列内の6つの整数すべてに対して前のステップと同じ置換を実行し、[ 1、1、1、2、1、1、2、1、2、3 ]を生成します。これは3番目のCURR配列です。 仕事 入力として厳密に正の整数nが与えられると、n 番目の CURR配列を計算する関数のプログラムを作成します。 出力は、ある種のフラットリストである必要があります(関数から返された配列、言語の配列構文の文字列表現、空白区切りなど)。 これはcode-golfです。バイト単位の最短コードが勝つように! テストケース 1 -> [1] 2 -> [1, 1, 2] 3 -> [1, 1, 1, 2, 1, 1, 2, 1, 2, 3] 4 -> [1, 1, 1, …

3
ジグザグ化された行列を再構築する
JPEG標準は、圧縮アルゴリズムの一部として、交互の方向の対角線に沿って行列を展開してベクトルにします。 あなたの仕事は、展開されたベクトルを行列の次元とともに取得し、対応する行列を再構築することです。例として: [1, 2, 5, 9, 6, 3, 4, 7, 1, 2, 8, 3], 4, 3 もたらすべきです [1 2 3 4 5 6 7 8 9 1 2 3] 一方、寸法6, 2は [1 2 6 3 1 2 5 9 4 7 8 3] ルール 入力としてディメンションの1つのみを選択することもできます。個々の入力は任意の順序で取得できます。幅と高さが正であり、指定されたベクトルの長さに対して有効であると仮定できます。 ベクトル要素はより小さい正の整数であると仮定でき10ます。 プログラムまたは関数を作成し、STDIN(または最も近い代替)、コマンドライン引数または関数引数を介して入力を取得し、STDOUT(または最も近い代替)、関数の戻り値または関数(out)パラメーターを介して結果を出力できます。 入力ベクトルは、便利で明確なフラットリストまたは文字列形式で指定できます。 出力マトリックスは、便利で曖昧さのないネストされたリストまたは文字列形式、または両方のマトリックス次元と一緒にフラットリストにすることができます。(または、もちろん、あなたの言語がそれらを持っているなら、マトリックス型として。) 標準のコードゴルフ規則が適用されます。 …

1
ASCIIハマンタッシェンを数えてください!
今日のプリムでは、1つの習慣として、hamantaschen(単数形:hamantasch)と呼ばれるフィリング付きの三角形のクッキーを配ります。別の習慣は、大量に飲むことです。 私は最も完璧なパン屋ではありません。...配る不規則なサイズのハマンタッシェンはたくさんありますし、配る友達もたくさんいます!クッキーの写真を送った場合、どのサイズと詰め物をいくつ持っているか教えてもらえますか?しかし、それはPurimであり、私はあまりにも多くのコードを読むにはあまりにも酔っているので、できる限り小さいコードである必要があります。 定義 サイズ ハマンタッシュのサイズは任意です。最小のハマンタッシュはサイズ1で、次のようになります。 /\ -- -- \/ 時には、複数のハマンタッシェンが重なることがあります。以下の形状は、2つのハマンタッシェンとしてカウントされます(1サイズ1、1サイズ2): /\ /\ \ ---- 一部のハマンタッシェンには詰め物があります。これは、内部のすべての空白を文字で埋めることによって示されます。サイズ1のhamantaschenには詰め物がないことに注意してください。 私たちはします名前充填およびサイズに基づいてhamantaschenを。この形式<filling> <size>を使用して、埋められていない場合- <size>は、の代わりにスペースを使用できます-が、マークダウンはそれを好みません。 以下がa . 2、a . 4、およびa - 3です。 /\ /./\ ---- /./ \ \../ /./ \ \/ -------- これらは、a @ 3、a、. 2およびa - 4です。 /\ / /\ /\ / /@@\ /..\ / /@@@@\ …

23
パリティビットを生成する
パリティビットは、チェックサムの最も単純な形態の一つです。まず、偶数または奇数のパリティを選択する必要があります。偶数を選択するとしましょう。次に、送信するメッセージが必要です。メッセージが「Foo」だとしましょう。これは次のようにバイナリで書かれています。 01000110 01101111 01101111 ここで、115の合計数をカウントします。15は奇数であるため、メッセージの最後に1ビットを追加する必要があり、偶数の「オン」ビットがあります。 。この最後に追加されたビットは、「パリティビット」と呼ばれます。チェックサムに奇数パリティを選択した場合、オンビットの数が奇数のままになるように、余分な「0」を追加する必要があります。 チャレンジ: 文字列の正しいパリティビットを決定するプログラムまたは関数を作成する必要があります。プログラムには2つの入力が必要です。 文字列s。これは、チェックサムが計算されるメッセージです。これは、95個の印刷可能なASCII文字に制限されます。 文字または単一の文字列pのいずれかになります、e偶数パリティのために、またはo奇数パリティのために。 正しいパリティビットを表す真偽値を生成します。aの場合は真実1、aの場合は偽です0。 文字列または文字の「オン」ビットの数をカウントする組み込み関数は許可されていません。たとえば、これを行う機能f:f('a') == 3またはf('foo') == 16禁止されています。基本変換など、その他はすべて公平なゲームです。 テストIO: (without the quotes) s: "0" p: 'e' output: 0 s: "Foo" p: 'e' output: 1 s: "Hello World!" p: 'o' output: 0 s: "Alex is right" p: 'e' output: 1 s: "Programming Puzzles …

2
針で干し草の山を見つける
干し草の山で針を見つけるのにひねりを加えるには、ちょうど 1本の 針を含む最大の連続した干し草を見つける必要があります。対角線上のセルは接続できず、左/右/上/下のみ接続できることに注意してください。 入力 'N'(針)および'#'(干し草)文字の配列(またはユーザー入力行の数、選択)。入力にはこれらの2文字のみが含まれ、それぞれ少なくとも1文字が含まれている必要があります。例えば: N#N#N #NN## ###N# N##N# 出力 有効な最大の干し草のサイズ。この例では、11を出力します(11個の干し草と1本の針があります)。 # # ## ###N# ## # これはcode-golfなので、最短のコードが優先されます。標準的な抜け穴の制限が適用されます。 テストケース 左に入力、右に可能な最大の干し草の山 ケース1:4 N## ## NN# # #NN N #N# # ケース2:7 ### ### N#N # NNN N ### ### ケース3:10 N###N ### #N#N# #N# #N#N# # # N###N ### ケース4:10 N#N#N …

1
単語の雲を転置する
バックグラウンド 次のように、きれいな単語雲を作りたいと思いました。 these are words floating (x,y)各単語の最初の文字の-座標を計算し、それらを単語クラウドジェネレーターにプラグインして、その仕事をさせました。ただし、誤って(y,x)-coordinatesを使用したため、結果は次のようになります。 these floating words are 私は座標を再計算するのが面倒なので、私のために単語の雲を転置する必要があります。 入力 入力は、小文字のASCII文字とスペースの長方形のグリッドです。つまり、すべての行に同じ長さになるようにスペースが埋め込まれます。入力は、複数行の文字列または文字列の配列として取得できます。 単語は、文字の水平セグメントであり、その位置がある(x,y)、その左端の文字、グリッドの存在の左上隅の-coordinates (0,0)。常に少なくとも1つの単語があり、スペースの末尾の行または列はありません。ただし、スペースの先頭の行または列が存在する場合があります。 出力 出力は、位置(x,y)を持つすべての単語をposition に移動することにより取得される、文字の別の長方形グリッドです(y,x)。出力には、スペースの余分な末尾の行または列を含めることはできません。先行する行と列は保持する必要があり、出力は長方形でなければなりません。 この変換は、重複する単語を作成せず、複数の単語を1つにマージしないと仮定できます。これは、出力でプログラムを実行すると元の入力が生成されることを意味します。 ルールとスコアリング 完全なプログラムまたは関数を作成できます。最小のバイトカウントが優先され、標準の抜け穴は許可されません。 テストケース わかりやすくするため(およびStack Exchangeはスペースのみの行を嫌うため)、すべての行はパイプ文字で終わり|ます。 これらは実際の入力または出力の一部ではないため、削除する必要があります。各出力でプログラムを実行すると、対応する入力も生成されることに注意してください。 Input: oneword| Output: oneword| Input: spaces| Output: | | spaces| Input: | row| Output: row| Input: these are| words | | floating | Output: …
18 code-golf  string  grid 

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