SQLでolympiadをどのように実行したしたか

2016幎の秋の初めに、リヌダヌシップは私にSQLオリンピアヌドの技術的な郚分を準備するタスクを蚭定したした。 私の元を含む同僚ず状況に぀いお話し合った埌、私は突かれたした突かれたしたか、SQLの宣蚀的なスタむルで、迷路からの最短出口を構築するタスクが解決された蚘事に。 芁求の1぀のヒヌプ郚分に集たり、それを実際のベヌスで実行した埌、「魔法..」ずささやいお、オリンピックがあるこずに気付きたした。







オリンピックでのHabrの兞型的な読者は少なくずも䞀床はいるず思いたすが、むしろ䞻催者ではなく参加者の圹割でした。 私はたた別のものに行きたしたが、なぜそれがいく぀かのオリンピアヌドで面癜いのか、そしお他の人の必死の憧れなのかはい぀も驚きでした。 この劇堎がカヌテンの向こう偎にどのように芋えるか、そしおどのようにこのオリンピアヌドを興味深いものにしようずしたかを瀺すこずができたす。 陰謀、スキャンダル、調査-これは起こりたせん。 しかし、タスクがどのように準備されたか、それらに䜕が期埅され、䜕が結果であったかを説明したす。







入門



2016/17オリンピック それは蚘念日のように、10回開催されたした。 オリンピアヌドは囜際的に宣蚀されおいたすが、その䞻芁蚀語はロシア語であるため、個人的にはオヌルナニオンず呌んでいたす。 私はコンテストの技術的な郚分をSQLプログラミング蚀語で準備しおいたした他にもノミネヌトがありたした。 理論的には、この指名の2番目の䞻催者はOracleでしたが、私は圌らの代衚者に䌚ったこずがありたせん。 したがっお、Oracleからの唯䞀のトレヌスは、関連するすべおのSQLの詳现を備えたOracleデヌタベヌスを䜿甚したこずです。







オリンピアヌド2016/17決勝の公匏りェブサむトでのレポヌトは次のずおりです。http  //world-it-planet.org/press/news/detail.phpID = 323774







これに぀いおは、クレゞットが完了したずみなし、偵察を提䟛したした。 もう少し䞀般的な蚀葉ず私は行動に移りたす。







経営陣フルカルテブランシュから远加の指瀺は䞎えられなかったため、オリンピックの䞻な目暙はSQL蚀語を普及させるこずでした。 ずころで、これは実際に実際に䜿甚されおいる数少ない宣蚀型プログラミング蚀語の1぀です。 たた、デヌタベヌス、特にサヌバヌを備えた産業甚デヌタベヌスが地平線䞊に登堎する堎合、代替手段はたったくありたせん。産業暙準は事実䞊です。 さらに、倚くのニッチ゜リュヌションでは、䜕かを遞択しおグルヌプ化たたは䞊べ替える必芁がある堎合、SQLのようなク゚リ構文を䜿甚したす。 たずえば、JIRAのJQLたたはSphinx Search Engineのク゚リ蚀語。







はい、それで、䞻な目暙が蚭定されたした-SQLを普及させるこず。 より倚くの人がSQLを知っおおり、SQLを䞊手に曞くこずができるように。 それから、私たちの人員予備で、すべおが倧䞈倫です。 道に沿っお、私たちは確かに自分自身を宣䌝し、才胜を求めたす。 蚀うたでもない。 しかし、䞻なこずはSQLに泚意を匕くこずです。 そしお䞀床普及したら、それは興味深いはずです。







䞻催者は、次のコンテストのレむアりトを発衚したした。2぀の通信ツアヌずフルタむムの決勝です。 䞀般的な抂念は次のように定矩されたす。 最初のラりンドは予遞です。トピックに参加しおいない人の倚くを陀倖する必芁がありたす。 2回目のラりンドは最も興味深いものです。 「しかし、1぀のSQLク゚リで匱くお、そういうこずをしたすか」 振り返る機䌚があるように、より倚くの時間を䞎えたすが、座っお時間がないように制限したす。 同じ粟神でフルタむムの決勝戊を開催するこずはできたせん。決勝戊の3時間たずえ8時間であっおもは、SQLのようなものを思い付くのは問題です。 ぀たり、どこに行くべきか、電撃がありたす。 これは確かに最も匷力なプログラマヌを決定するための最良の方法ではありたせんが、それでも乱数ゞェネレヌタヌに尋ねるよりも少し良いです。







そしお、準備䜜業が沞隰し始めたした。







最初のラりンド修食子。 2016幎12月



ここでは、もちろん、同じコンペティションの同僚の業瞟を掻甚したしたが、前幎には、圌らに個別に感謝しおいたす。 IT Planetには、テストを実行する特別な゚ンゞンがありたす。 100を超える質問のデヌタベヌスが、遞択する回答オプションずずもに収集されたした。 参加者には30の質問がありたす。 昚幎参加者が参加したずしおも、1぀たたは2぀以䞊の質問が繰り返されるこずはほずんどありたせん。 そしお、それは誰にずっおもあたり倩気をしたせん。







そのため、質問を根本的に倉曎したり、既存の質問を揺さぶったり、気付いたいく぀かの間違いを修正したり、将来の䞖代ず離婚するために䜕かを残したりしたした。 このような質問は、兞型的なプロメトリックオンラむンテストのレベルである元気なものであるこずがわかりたした。 さらに、各質問ですべおの正しいオプションを遞択する必芁がありたしたが、それらのどれだけが正しく瀺されなかったかずいう問題が意図的に䜜成されたした。 この堎合、すべおの正解が瀺されおいる質問のみがカりントされたした。 ぀たり、単にマりスで぀぀いお、いく぀かのテストのように、平均25が䞀床でもうたくいかないずいうこずです。 その結果、私自身、質問/回答の読み蟌みの正確性を確認しながら、すべおの質問を完党に通過しながら、定期的にいく぀かの質問に誀っお回答したした。







このようなふるいは、SQL党般、特にOracle SQLの知識レベルに応じお参加者を適切に分散させるこずが期埅されおおり、より知識のあるものがより高い地䜍を占めたす。 各参加者の30の質問は、個々の質問の「機胜」を統蚈的に平準化したす。 さらに、すべおが深刻であり、容赊ないずいう参加者ぞの治療効果。







緎習は期埅の正しさを確認したした;実際、参加者はポア゜ンに埓っおかなりよく分垃し、平均で7぀の質問に正しく答えたした。 1人の参加者が30の質問すべおに正しく答えるこずさえできたしたそこに幞運でした、4人の参加者はすでに正しい答えを持っおいたす。 䞀床も掚枬せずに、6人がきれいに合栌したした。 芁するに、必芁なもの。 このアプロヌチにより、2回目のラりンドで必芁な数の参加者を圢成するために適切な合栌スコアを遞択し、最適なものを遞択するこずが可胜になりたした。 䞻催者の蚈画によるず、玄200人の参加者がかなり合理的な制限を持っお第2ラりンドに参加する必芁があり、囜や倧孊ごずの参加者の倚様性を最倧限に高めたした。







第2ラりンド、メむンラりンド。 2017幎3月



2回目のラりンドは、間違いなくこのオリンピアヌド党䜓で最も興味深いむベントでした。 その䞭で、ハヌドコアなSQLマゞックを詊すこずができたした。







ずにかくこれらのタスクを再利甚するこずは䞍可胜なので、それらはすでに点灯しおいるので、ここに持っおきたす。 郚分的に、この出版物はSQL蚀語のさらなる普及のために準備されたタスクを共有する機䌚ずしお考えられたした。 比fig的に蚀えば、各タスクは「Into one SQL query ...」ずいう蚀葉で始たり、その埌、䜕かが完党に異なりたす©Monty Python。 残念ながら、タスクを1぀のフレヌズにたずめるこずは䞍可胜でした。条件の正しいステヌトメントに぀いお詳现な説明を远加し、テストデヌタずこれらのテストデヌタの解決䟋を明確にするために提䟛する必芁がありたした。







「SQLでこれは本圓に可胜か」などのタスクに顕著なワり効果があるこずを確認し、非垞に特殊なスキルを必芁ずする埓来のオリンピアヌドのトピックから離れるように、私は䞀生懞呜努力したした。 各タスクの耇雑さは、最初に、問題の叀兞的なプログラミングに察しおも完党に独立しおいお自明ではない宣蚀的メ゜ッド自䜓を想像するこずで構成されおいたした。 たた、参加者に各タスクの説明文を䜜成するよう芁求したした。 䞀方で、私たちは自分の考えを明確に述べるこずができる人々に興味があり、そのような人々を奚励したかったのです。 䞀方、第2ラりンドのタスクに察する回答が招埅されたすべおの参加者から送信された堎合、そのような説明は怜蚌に非垞に圹立ちたす。 今埌、第2ラりンドの200人以䞊の参加者のうち、回答を送信したのは34人だけでした。 これはそれほどではありたせんが、驚くべきこずに前幎の第2ラりンドのアクティブな参加者の数ずほが同じです。 これにより、すべおの䜜業を培底的に手動で再確認し、最終的に最も䟡倀のあるものを呌び出すこずができたした。







䞻催者のスケゞュヌルに関する2回目のツアヌは、3月1日に始たりたした。 5぀の問題を解決するために、3月12日23時59分たで1週間半、さらにそれ以䞊を䞎えたした。 そのため、期間の終わりは3月8日以降の週末になりたす。 参加者が最埌の2日間で䞀生懞呜働くこずができ、同時に個人の生掻をあたり損なうこずがないようにしたす。 自分ず同僚のテストでは、各タスクに半日から1日かかるこずが瀺されたした。 さらに、蚭蚈のための時間を加えお、調敎しおスむングしたす。 ぀たり、十分な時間があるはずですが、過剰ではありたせん。







たあ、私たちはタスクに぀いお運転したした。 スポむラヌの䞋に隠しお、スペヌスを取りたせんようにしたす。







タスク番号1。 カレンダヌ

ポケットカレンダヌを生成する単䞀のSQLク゚リを蚘述したす。 タスクのパラメヌタヌには、カレンダヌの幎ず、月のマトリックスを圢成するための行ず列の数が瀺されたす。 パラメヌタは、次のク゚リによっお蚭定されたす。







with param(year, c, r) (
)
      
      





ここで、それぞれ、







  • 幎-暊幎
  • cは、カレンダヌマトリックスの列数です。
  • rは、行列の行数です。


月は、カレンダヌマトリックスのセルに巊から右、䞊から䞋の順に配眮されたす。 各月の数字は、曜日、最初の列の最初の曜日などにありたす。 週の初めは、リク゚ストが起動された時点のデヌタベヌスロヌカリれヌション蚭定に察応しおいる必芁がありたす。 月の名前もロヌカラむズ蚭定から取埗され、数字の䞊の䞭倮に衚瀺されたす。 隣接する月の数が「互いにくっ぀かない」ように、月の間にはギャップを残す必芁がありたす。 最初の行は幎の䞭倮に行く必芁がありたす。 空行があっおはなりたせん。







たずえば、次のパラメヌタヌを䜿甚したす。







 with param(year, c, r) as (select 2016, 3, 4 from dual)
      
      





次のク゚リ出力を取埗する必芁がありたす。







  2016    1 2 3 1 2 3 4 5 6 7 1 2 3 4 5 6 4 5 6 7 8 9 10 8 9 10 11 12 13 14 7 8 9 10 11 12 13 11 12 13 14 15 16 17 15 16 17 18 19 20 21 14 15 16 17 18 19 20 18 19 20 21 22 23 24 22 23 24 25 26 27 28 21 22 23 24 25 26 27 25 26 27 28 29 30 31 29 28 29 30 31    1 2 3 1 1 2 3 4 5 4 5 6 7 8 9 10 2 3 4 5 6 7 8 6 7 8 9 10 11 12 11 12 13 14 15 16 17 9 10 11 12 13 14 15 13 14 15 16 17 18 19 18 19 20 21 22 23 24 16 17 18 19 20 21 22 20 21 22 23 24 25 26 25 26 27 28 29 30 23 24 25 26 27 28 29 27 28 29 30 30 31    1 2 3 1 2 3 4 5 6 7 1 2 3 4 4 5 6 7 8 9 10 8 9 10 11 12 13 14 5 6 7 8 9 10 11 11 12 13 14 15 16 17 15 16 17 18 19 20 21 12 13 14 15 16 17 18 18 19 20 21 22 23 24 22 23 24 25 26 27 28 19 20 21 22 23 24 25 25 26 27 28 29 30 31 29 30 31 26 27 28 29 30    1 2 1 2 3 4 5 6 1 2 3 4 3 4 5 6 7 8 9 7 8 9 10 11 12 13 5 6 7 8 9 10 11 10 11 12 13 14 15 16 14 15 16 17 18 19 20 12 13 14 15 16 17 18 17 18 19 20 21 22 23 21 22 23 24 25 26 27 19 20 21 22 23 24 25 24 25 26 27 28 29 30 28 29 30 26 27 28 29 30 31 31
      
      





タスク番号2。 茞血

3リットルず5リットルの容量を持぀2぀の容噚ず、氎が入った蛇口がありたす。 ある容噚から別の容噚に氎を移しそのうちの1぀がいっぱいになるか、空になるたで、氎を泚ぎ完党にのみ、蛇口から䞊郚たで容噚を満たしたす。 正確に4リットルを枬定できるすべおの茞血オプションを芋぀ける必芁がありたす。 ルヌプを回避するために、血管の充満状態が繰り返されるオプションは砎棄されたす。







SQLク゚リは、可胜なすべおの茞血オプションを次の圢匏で衚瀺する必芁がありたす。各オプションに぀いお、適切なステップで各容噚の氎量を瀺す数倀のペアの圢で茞血チェヌンを出力したす。 数字はマむナスで区切られ、ペアはコンマずスペヌスで区切られたす。







䞀般的な方法で問題を解決する必芁がありたす。パラメヌタは、最初のv1および2番目のv2血管の容量ず、茞血の結果ずしお取埗する必芁があるresの結果を指定したす。 条件の䟋







 with param(v1, v2, res) as (select 3, 5, 4 from dual)
      
      





出力䟋







 PATH --------------------------------------------------------------------------------- 0-0, 3-0, 3-5, 0-5, 3-2, 0-2, 2-0, 2-5, 3-4 0-0, 3-0, 0-3, 3-3, 3-5, 0-5, 3-2, 0-2, 2-0, 2-5, 3-4 0-0, 3-0, 0-3, 3-3, 1-5, 0-5, 3-2, 0-2, 2-0, 2-5, 3-4 ...
      
      





タスク番号3。 方法に぀いお

頂点ず゚ッゞで定矩された無向グラフがありたす。 ゚ッゞの長さず開始ピヌクず終了ピヌクの名前を指定したす。 1぀のSQLク゚リでは、最初の頂点から最埌の頂点たでの最短距離のパスを芋぀ける必芁がありたす。 結果は、2぀の倀の圢匏で衚瀺される必芁がありたす。







  1. パス行では、頂点の名前はマむナスでリストされたす。
  2. パスの長さ゚ッゞの長さの合蚈。


昇順のパス長で゜ヌトされた3぀の最短オプションを導出する必芁がありたす。 問題の状態では、頂点のペアずそれらの間の距離が蚭定されたすグラフは無指向性であり、距離は最初の頂点から2番目ぞ、およびその逆も2番目から1番目ぞの移動にも有効です、最短パスを構築するための初期および最終頂点。







グラフ内の゚ッゞの数は合理的に制限されおおり、50゚ッゞ以䞋です。







次のテストデヌタに぀いお







 with edges (from_node, to_node, range) as ( select '', '-', 706 from dual union all select '', '', 516 from dual union all select '', '', 1793 from dual union all select '', '', 3956 from dual union all select '', '', 1345 from dual union all select '', '', 3356 from dual union all select '', ' ', 421 from dual union all select '', '', 6274 from dual union all select '', '', 856 from dual union all select '', '', 272 from dual union all select '', '', 3723 from dual union all select '', '', 4141 from dual union all select '', '', 666 from dual union all select '', '', 524 from dual union all select '', '', 9141 from dual union all select '', '', 237 from dual union all select '', '', 265 from dual union all select '', '', 146 from dual union all select '', ' ', 856 from dual union all select '', '', 1598 from dual union all select '', '', 2923 from dual union all select '', '', 790 from dual union all select '', '', 751 from dual union all select '', '', 2139 from dual union all select '', '', 2861 from dual ) , param(begin_node, end_node) as (select '', '' from dual)
      
      





次の結果が埗られたす。







 PATH LEN -------------------------------------------------- ---------- --- 10480 ---- 10485 -- 10486
      
      





タスク番号4。 電卓

算術匏は文字列ずしお指定されたす。 匏の倀を蚈算するには、1぀のSQLク゚リが必芁です。 この匏には、加算、枛算、乗算、陀算、べき乗、単項マむナス、括匧の挔算の笊号が含たれおいたす。 単項マむナスは、匏の開始時たたは開き括匧の埌にのみ発生したす。 数倀には小数郚分が含たれる堎合があり、圢匏はデヌタベヌスの珟圚の蚀語蚭定のNUMBERタむプに完党に察応したす。 明確にするために、匏にはスペヌス文字を含めるこずができたす。 匏の長さは合理的に制限されおいたす。50オペランド以䞋、括匧の深さは20以䞋です。匏は垞に正しいです。







芁求は、NUMBER圢匏で単䞀の倀を返す必芁がありたす。







サンプルテストデヌタ







 with param(expr) as ( select '(-1 + 5^(1/2) ) / 2' from dual )
      
      





このデヌタに察するク゚リの結果の䟋







  VAL ------------------------------------------------- ,61803398874989484820458683436563811772
      
      





タスク番号5。 ラビリンス

ラビリンスは番号付きの行の圢匏で蚭定されたす。 壁には「」、入口点「s」、出口「e」が付いおいたす。 囜境を越えるこずは䞍可胜であり、行番号は順番に進み、すべおの行の長さは同じです。 1぀のSQLク゚リでは、文字 "*"を䜿甚しお、入力から出力ぞの最短パス耇数のパスがある堎合はそのうちの1぀を描画する必芁がありたす。







迷路のサむズは制限されおいるため、迷路を通過する内郚ルヌプなしオプションの数は10,000を超えたせん。







サンプルテストデヌタ







 with maze(linenum, line) as ( select 01,'## ### ######' from dual union all select 02,'s # # ' from dual union all select 03,'#### ### # ##### ' from dual union all select 04,' # # # ' from dual union all select 05,' # ### ######### ' from dual union all select 06,' # e' from dual )
      
      





このデヌタに察するク゚リの結果の䟋







 ##***### ###### s**#* # ####*### # ##### #***# # # ###*######### # **********e
      
      





もちろん、もっず時間があれば、タスクをさらに改善できただろう。 しかし、それはかなりうたくいきたした。 各タスクには、独自の驚きず萜ずし穎がありたした。







たずえば、突然、カレンダヌに関する最初のタスクは非垞に重芁でした。 困難はすでに動的に生成されたマトリックスが原因であり、突然すべおの人がその幎のすべおの日を正しく生成できたわけではありたせん。 レバレッゞを考慮するず、通垞は365たたは366です。しかし、1582幎には、グレゎリオ暊で10月5日から10月14日たでの日はありたせん。 1582幎を正しく凊理できたのはごく少数です。 さらに、異なるロケヌルの週は別の日に始たりたす。 予想倖の埅ち䌏せが非垞に倚かったため、月の名前を揃えおレヌキを螏む人さえいたせんでした。 途䞭で故障するこずなくこれに到達したすべおの人は、UTF8゚ンコヌディングで間違った語長を䞎える関数を䜿甚しおいたした。







「進行䞭」の問題番号3は、巡回セヌルスマン問題のテヌマのバリ゚ヌションです。 撮圱された郜垂は、圓瀟の代衚的なオフィスがある郜垂であり、距離はアトラスからの道路の長さに実際に察応しおいたす。 すでに条件を送信したので、パスのサむクルの有無を明瀺的に芏定しおいないこずがわかりたした。 どういうわけか、巡回セヌルスマンの問題はサむクルで解決できるず考えるこずはすぐには起こりたせんでした。 怜蚌䞭に、䞡方のアプロヌチが正しいず芋なされる必芁がありたした。 ただし、参加者がサむクルを蚱可しおいる堎合のみ、このアプロヌチで適切な゜リュヌションがすべお芋぀かりたす。 怜蚌テストを完了する必芁がありたした。 予想倖のこずから、すべおの参加者が再垰のようなプログラミングの基本抂念に粟通しおいるわけではないこずが刀明したした。 1人の氞続的な人の決定では、レベル11たで深くネストするこずにより、再垰が手動で行われたした。 問題の状態からのテスト䟋ずしおはこれで十分でした。もちろん、他のテストは䞀切行わず、あらゆる皮類の゚キゟチックなテストを採点したした。 これを芋るのは驚くべきこずでした。SQLで曞く孊生や若い専門家そしお、これが明らかに最初のプログラミング蚀語になるこずはできたせんは、再垰に぀いお知っお、それを実践できるず思いたした。 これがなければ、プログラミングにはたったく方法がありたせん。







問題番号5の「ラビリンス」は個人的に私にずっお最も魔法のようです。オリンピアヌドの第2ラりンド党䜓からむンスピレヌションを受けたのは圌女でした。 ただし、最初の4぀のタスクの埌で、おそらく既にその結果は発生しおいたせん。 条件では、すべおのオプションを列挙した額の解決策が機胜するこずを明確に芏定したした。 ずころで、私たちはこの制限を䞀般にどのように定匏化できるかを長い間考えおいたした。 壁のない空の迷路7x7は、それを通過するためのオプションの数が倚いため、すでに長い間蚈算されおいたす。 䞀方、倚数の壁を持぀迷路および、それに応じお少数の通路オプションは、60x60のサむズであっおも迅速に解決されたす。 もちろん、この問題を解決するためにりェヌブアルゎリズムを䜿甚する方がより適切です。 この方法は迅速に機胜し、最短パスを最適に芋぀け、明らかに悪いオプションを砎棄したすが、実装はより困難です。 参加者の䞀人からのこのタスクの付随する説明でこれらの考慮事項を芋るのは非垞に楜しかったです。 しかし、Waveアルゎリズムを実装した人はいたせん。 しかし、私たちもそうしたせんでした。







タスク番号4の「蚈算機」は、技術的に最も困難なものでした。 2段階のアプロヌチが想定されおいたした。たず、匏をより消化しやすいものPOLIZたたはスタック衚蚘に倉換しおから、結果を蚈算したす。 実際、それを決定した参加者は最も少なかった。 䞀郚の人々は、正芏衚珟を䜿甚しお解決を詊み、数えられる別の郚分匏を順番に取り出しお蚈算倀に眮き換えたしたが、そのような実装はすべお誀っお、 "(( (-(( ((((( - ( (-(-(-( ( - ((-,0-,0))) ) ))))) ) ) ))))) ) ) "



実装も䞍完党で、文字列を䜿甚しおSQLスタックを実装する必芁がありたした。これにより、デヌタベヌス内の文字列フィヌルドの長さに関する技術的な制限により、スタックのネストの深さが制限されたす。







茞血に関する問題2は䌁業のwikiから取ったもので、ここではか぀お私たちのプログラマヌから私たちのプログラマヌに心を枩めるために提䟛されおいたした。 最初にさたざたな叀兞的なプログラミング蚀語で解決し、次に゚キゟチックで難解なものたずえばBrainfuckで解決し、最埌に宣蚀的にSQLで解決したした。 オリンピックでそのようなよく考えられた仕事を䜿わないのは眪だった。







Brainfuckずいえば。 タスクを準備する過皋で、brainfuckむンタヌプリタヌは単䞀のSQLク゚リに実装されたした。 名前に関連するあいたいさを避けお、タスクでそれを提瀺し始めたせんでした。 それでも、これが実珟可胜であるずいう確認された事実がありたす。 垌望する人は繰り返すこずができたす。







タスクを考え出すこずは、解決するこずよりももっず楜しいず思いたす。 発明の過皋でそれらを解決するこずも必芁でした。 たず、問題の解決策が存圚するこずを確認する必芁がありたした。 第二に、魅力的なコンポヌネントを可胜な限り残し、可胜であれば䞍芁なルヌチンを削陀するために、条件を解決するプロセスで指定されたした。 その埌、参加者が定幎たで産業甚プログラミングのルヌチンに参加できるようにしたす。 さらに、途䞭で、あらゆる皮類の非自明性が浮䞊したした。 そしお第䞉に、怜蚌䞭に参加者の決定を比范するための参照゜リュヌションが必芁でした。







タスクは、最倧コヌドで10ポむント、付随する説明で10ポむントで評䟡されたした。 コヌドは準備されたデヌタセットで実行され、最初のデヌタセットは垞にタスクの状態にあったものでした。 ぀たり、問題の状態からのデヌタに関する正しい結果は、少なくずも1぀のポむントを䞎えたした。 文曞化は難しく、客芳的に少なくずも正匏に客芳的に評䟡するこずには問題がありたした。 2぀の異なる゜リュヌションを比范するずきに、より倚くのポむントでより良いドキュメントが評䟡されるように詊みたした。







提出された䜜品では、同䞀の゜リュヌションの2぀のクラスタヌが芋぀かりたした。 それはもちろん、それらは個々のシンボルずどこか別の単語でさえ異なっおいたした。 そしお、少し曞匏蚭定したす。 しかし、それらが同䞀であるこずが明らかでした。 実際、参加者はお互いを盞殺せず、単に問題を䞀緒に解決したず思いたす。 しかし、私たちはろうそくのそばに立っおおらず、゜リュヌションの本圓の䜜者が誰で、誰が単に曞き盎したのかわからなかったので、盗䜜の痕跡ですべおの䜜品を倱栌にしなければなりたせんでした。 なぜ圌らはいく぀かの答えで同じ解決策を送ったのですか 誰も気付かないず本圓に思った 人が批刀的に考える胜力を完党に倱うずきに、人々にそのような奇劙な行動に出䌚ったのはこれが初めおではありたせん。 さお、圌の評刀を確認する責任があるオリンピアヌドの䞻催者は、圌が同じ芁求に盎面しおいるこずを理解できないでしょうか さお、2人の異なる人がすべおの䞭間テヌブルずその䞭のフィヌルドを同じ名前で芋぀けるこずはできたせん。 そしお、同様のものであっおもできない。







技術蚭蚈に関するいく぀かの蚀葉。 参加者は、自動テストのためにスクリプトの䞋からSQL * PLUSで実行するファむルを準備する必芁がありたした。 カットの䞋の詳现、おそらく誰もが興味があるわけではありたせん。







技術蚭蚈タスク

゜リュヌションは、倖郚ラッパヌスクリプトから起動された別のファむルで実行するこずでした。 これは、タスクパラメヌタヌず゜リュヌションを分離するために行われたした。 "with params as (select 1,2,3 from dial)"



ずいう圢匏のパラメヌタは、倖郚スクリプトにありたした。 次にラッパヌスクリプトの䟋を瀺したす。







 set pagesize 999 linesize 999 numwidth 50 trimspool on trimout on set heading off verify off feedback off set serveroutput on size 999999 whenever sqlerror exit spool taskX.log -- test dataset here with param(num) as (select 10 from dual) @taskX.sql / exit
      
      





次に、 taskX.sqlスクリプトが実行され、出力がtaskX.logファむルに蚘録されたす。







param.numで指定された数倀の階乗を考慮するtaskX.sql゜リュヌションスクリプトの内容は次のずおり です 。







 -- = IT Planet, SQL 2016/17 = -- = Task X (Sample) = -- -- with param(num) as (select 10 from dual) , seq(n, fact) as ( select 1, 1 from dual union all select n+1, fact*(n+1) from seq, param where n < param.num ) select fact as factorial from seq, param where n = num
      
      





このように特別に準備されたすべおのテストデヌタで実行されるスクリプトを䜜成したら、結果を芋お、「参照」゜リュヌションず比范できたす。







登録時の゚ラヌの数を枛らすために、すべおのタスクのテンプレヌトファむル タスク[1,2,3,4,5] .sqlファむル およびそれらに察応する「 ランチャヌ 」ずタスク条件からのテストデヌタが準備され、参加者に送信されたした。 問題を解決するためのテストケヌスも䜜成され、送信されお、すべおがどのように芋えるかが瀺されたした。 これは同じ階乗であり、より高いです。







前述したように、2回確認したした。 最初のテスト実行ず結果の分析の埌、タスクのテストのいく぀かを明確にする必芁があるこずが刀明したした。 そしお、私たちが䞋さなかった決定の分析䞭に明らかになったいく぀かの驚きをカバヌするために、新しいものを䜜るこずの䞀郚。 その埌、2人が独立しお意思決定の完党なチェックを行い、その埌、すべおの䞍䞀臎の分析ず完党に調敎したした。







最終プロトコルは長い間怜蚌されたしたが、私の意芋では、参加者の正しいランキングを完党に反映しおいたした。 本圓に巚倧な人間が決勝に進出したした。







続く 蚘事のボリュヌムは倧きくなり、第2郚で続きたした 。







PSこの機䌚を利甚しお、このオリンピアヌドの䜜成、蚭蚈、および行動に参加しおくれた同僚に感謝したす。 ゚ゎヌル、栄光、ミシャ、アルチョヌム-あなたが最初。








All Articles