Skip to content

Commit edac455

Browse files
add table
2 parents 49cb5e1 + 7ed58ff commit edac455

File tree

4 files changed

+166
-9
lines changed

4 files changed

+166
-9
lines changed

app.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ class Editorial(db.Model):
3131
like = db.Column(db.Integer)
3232
user_image_url = db.Column(db.String(1024), index=True)
3333
user_id=db.Column(db.Integer)
34+
problem_id=db.Column(db.String(64))
35+
3436

3537
#いいね情報
3638
class Like(db.Model):
@@ -44,6 +46,12 @@ class Tag(db.Model):
4446
tag=db.Column(db.String(64))
4547
user_id=db.Column(db.Integer)
4648

49+
class Problem_Tag(db.Model):
50+
id=db.Column(db.Integer,primary_key=True)
51+
problem_official_name=db.Column(db.String(64))
52+
problem_name=db.Column(db.String(64))
53+
first_tag=db.Column(db.String(64))
54+
4755
#コンテスト名に含まれる空白などを取り除く
4856
def _normalize_contestname(contestname):
4957
if isinstance(contestname, str):
@@ -77,6 +85,10 @@ def contest_search():
7785

7886
return render_template('search.html',problems=problem_list)
7987

88+
@app.route('/tag_search',methods=['POST'])
89+
def tag_search():
90+
tagName=request.args.get('tagName')
91+
return render_template('tag_result.html',tagName=tagName)
8092

8193
@app.route('/search/<problem_id>/<int:page>', methods=['GET','POST'])
8294
def contest_get(problem_id,page=1):
@@ -112,8 +124,13 @@ def contest_get(problem_id,page=1):
112124

113125
#ページネーション
114126
per_page = 10
127+
<<<<<<< HEAD
115128
editorials = db.session.query(Editorial).filter_by(contestname=problem_id).order_by(desc(Editorial.like)).paginate(page, per_page, error_out=False)
116129

130+
=======
131+
editorials = db.session.query(Editorial).filter_by(problem_id=problem_id).order_by(desc(Editorial.like)).paginate(page, per_page, error_out=False)
132+
133+
>>>>>>> update
117134
#ログインしている場合は、既にいいねしている「いいね欄」を塗りつぶす
118135
if current_user.is_authenticated==True:
119136
flag={}
@@ -147,7 +164,8 @@ def submit():
147164
params = {
148165
'title': request.form.get('title'),
149166
'description': request.form.get('description'),
150-
'contestname': _normalize_contestname(request.form.get('problem_id')),
167+
'contestname': _normalize_contestname(request.form.get('contest_name')),
168+
'problem_id':request.form.get('problem_id'),
151169
'url': request.form.get('url'),
152170
'like':int(0),
153171
'user_image_url': current_user.user_image_url,

templates/contest.html

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,9 @@ <h4 class="col-1"></h4>
7575

7676

7777
<div class="container-fluid">
78-
<a class="h4" href="https://atcoder.jp/contests/{{contest_id}}/tasks/{{problem_id}}" target="_blank">問題ページ</a>
78+
<a class="h5" href="https://atcoder.jp/contests/{{contest_id}}/tasks/{{problem_id}}" target="_blank">問題ページ</a>
7979
<h4 class="col-1"></h4>
80-
<a class="h4" href="https://img.atcoder.jp/{{contest_id}}/editorial.pdf" target="_blank">公式editorial</a>
80+
<a class="h5" href="https://img.atcoder.jp/{{contest_id}}/editorial.pdf" target="_blank">公式editorial</a>
8181
<h4 class="col-1"></h4>
8282

8383
{%if tag==None%}
@@ -95,12 +95,13 @@ <h4 class="card-header text-white bg-info col-10" data-toggle="collapse" data-ta
9595
<div class="collapse" id="sub1" data-parent="#submit-card" style="cursor: pointer;">
9696
<form action="/submited " method='POST'>
9797
<input type="hidden" name="csrf_token" value="{{csrf_token()}}" />
98+
<input type="hidden" name="problem_id" value="{{problem_id}}" />
9899
<input type="text" placeholder="タイトル" name="title" style="width:535px" />
99100
<br>
100101
<input type="text" placeholder="URL" name="url" style="width:535px" />
101102
<br>
102103
<textarea placeholder=" 解説文 " name="description" style="white-space:pre; word-wrap:break-word;" rows=15 cols=57></textarea>
103-
<button type="submit" class="btn btn-info" name="problem_id" value="{{problem_id}}">投稿</button>
104+
<button type="submit" class="btn btn-info" name="contestname" value="{{contestname}}">投稿</button>
104105

105106
</form>
106107
</div>

templates/search.html

Lines changed: 76 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,12 +90,24 @@ <h3>新着問題</h3>
9090
<br>
9191

9292
<div class="row container-fluid">
93-
<h3>検索</h3>
93+
<div>
94+
<h3>問題検索</h3>
95+
<form id="search" method="POST" action="">
96+
<input type="hidden" name="csrf_token" value="{{csrf_token()}}" />
97+
<input id="autocomplete_search" placeholder="問題名" style="width:600px" name="contestname" type="text" />
98+
</form>
99+
</div>
100+
<div>
101+
<h4 class="col-1"></h4>
102+
</div>
103+
<div>
104+
<h3>タグ検索</h3>
105+
<form id="search" method="POST" action="">
106+
<input type="hidden" name="csrf_token" value="{{csrf_token()}}" />
107+
<input id="tag_search" placeholder="タグ名" style="width:600px" name="tagName" type="text" />
108+
</form>
109+
</div>
94110
</div>
95-
<form id="search" method="POST" action="">
96-
<input type="hidden" name="csrf_token" value="{{csrf_token()}}" />
97-
<input id="autocomplete_search" placeholder="問題名" style="width:600px" name="contestname" type="text" />
98-
</form>
99111
<br>
100112
<br>
101113
<br>
@@ -170,6 +182,65 @@ <h3>検索</h3>
170182
});
171183

172184
})();
185+
186+
(async function() {
187+
const tag = ["フロー", "最小費用流", "最大マッチング", "最大流", "数学",
188+
"包除原理", "連立方程式", "半環", "確率", "期待値", "FFT",
189+
"アダマール変換", "メビウス変換", "ゼータ変換", "XOR", "中国剰余定理",
190+
"線形計画法", "フィボナッチ数列", "有理数", "木構造",
191+
"LCA", "HL分解", "オイラーツアー", "木の同型判定",
192+
"重心分解", "LinkCutTree", "DynamicTree", "グラフ理論",
193+
"スペクトルグラフ理論", "行列木定理", "ケイリーの公式", "橋",
194+
"関節点", "サイクル基底", "lowlink", "ダイクストラ", "ベルマンフォード",
195+
"ワーシャルフロイド", "オイラー路", "強連結成分分解", "最小パス被覆",
196+
"Dilworthの定理", "トポロジカルソート", "最大クリーク", "最大独立集合",
197+
"BFS", "後退解析", "最小全域木", "プリム", "クラスカル", "ブルーフカ",
198+
"データ構造", "UnionFind", "セグメントツリー", "BIT", "遅延評価セグメントツリー",
199+
"永続データ構造", "平衡二分木", "SparseTable", "WaveletMatrix", "動的計画法",
200+
"区間DP", "桁DP", "CHT", "MongeDP", "AlianDP", "インラインDP", "きたまさ法",
201+
"行列累乗", "戻すDP", "全方位木DP", "木DP", "bitDP", "挿入DP", "連結DP", "inlineDP",
202+
"枝刈り", "マンハッタン距離", "しゃくとり法", "二分探索", "三分探索",
203+
"imos法", "累積和", "最長部分増加列", "Mo'sAlgorithm",
204+
"平方分割", "ローリングハッシュ", "SuffixArray", "LCP", "KMP",
205+
"Aho-Corasick", "Z-algorithm", "PalindromicTree", "Manacher",
206+
"SuffixTree", "Nim", "Grundy数", "後退解析", "ミニマックス法",
207+
"2-SAT", "マージテク", "エラトステネスの篩", "区間篩", "分割統治法", "凸包",
208+
"構築", "乱択アルゴリズム", "半分全列挙", "最近点対", "幾何", "構文解析", "平面走査"
209+
];
210+
$('#tag_search').autocomplete({
211+
source: tag,
212+
autoFocus: true,
213+
delay: 100,
214+
minLength: 2,
215+
appendTo: "menu",
216+
217+
//候補をクリックすることでsubmitできるようにする
218+
select: function(event, ui) {
219+
var name = ui.item.label;
220+
$("#tag_search").val(name);
221+
$('form').attr('action', '/tag_search?tagName=' + name);
222+
$("#search").submit();
223+
}
224+
});
225+
226+
//input内でのEnter無効化
227+
$(function() {
228+
$(document).on("keypress", "input:not(.allow_submit)", function(event) {
229+
return event.which !== 13;
230+
});
231+
});
232+
233+
//日本語入力をスタートしたら無効化
234+
$('#tag_search').on('compositionstart', function() {
235+
$('#tag_search').autocomplete('disable');
236+
});
237+
238+
//日本語入力が確定したら有効化
239+
$('#tag_search').on('compositionend', function() {
240+
$('#tag_search').autocomplete('enable').autocomplete('search');
241+
});
242+
243+
})();
173244
</script>
174245
</body>
175246

templates/tag_result.html

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<!DOCTYPE html>
2+
<html lang="ja">
3+
4+
<head>
5+
<!-- Google Tag Manager -->
6+
<script>
7+
(function(w, d, s, l, i) {
8+
w[l] = w[l] || [];
9+
w[l].push({
10+
'gtm.start': new Date().getTime(),
11+
event: 'gtm.js'
12+
});
13+
var f = d.getElementsByTagName(s)[0],
14+
j = d.createElement(s),
15+
dl = l != 'dataLayer' ? '&l=' + l : '';
16+
j.async = true;
17+
j.src =
18+
'https://www.googletagmanager.com/gtm.js?id=' + i + dl;
19+
f.parentNode.insertBefore(j, f);
20+
})(window, document, 'script', 'dataLayer', 'GTM-WW39BS6');
21+
</script>
22+
<!-- End Google Tag Manager -->
23+
<meta charset="utf-8" />
24+
<meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no">
25+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
26+
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
27+
<link rel="icon" type="image/x-icon" href="/favicon.ico">
28+
<title>AtCoder Editorials</title>
29+
</head>
30+
31+
<body style="padding-top:5rem">
32+
<!-- Google Tag Manager (noscript) -->
33+
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-WW39BS6" height="0" width="0"
34+
style="display:none;visibility:hidden"></iframe></noscript>
35+
<!-- End Google Tag Manager (noscript) -->
36+
<noscript>You need to enable JavaScript to run this app.</noscript>
37+
38+
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
39+
<a href="/" class="navbar-brand">AtCoder Editorials</a>
40+
41+
<button class="navbar-toggler" data-toggle="collapse" data-target="#nav1">
42+
<span class="navbar-toggler-icon"></span>
43+
</button>
44+
45+
<div class="collapse navbar-collapse" id="nav1">
46+
<ul class="navbar-nav">
47+
<li class="nav-item"><a href="/" class="nav-link">ホーム</a></li>
48+
<li class="nav-item"><a href="/search" class="nav-link">問題</a></li>
49+
<li class="nav-item"><a href="/ranking/1" class="nav-link">ランキング</a></li>
50+
{% if current_user.is_authenticated==True %}
51+
<li class="nav-item"><a href="/user/{{current_user.id}}/1" class="nav-link">ユーザーページ</a></li>
52+
{%endif%}
53+
</ul>
54+
{% if current_user.is_authenticated==False %}
55+
<span class="navbar-text"><a href="/oauth/twitter" class="btn btn-info">ログイン</a></span> {%else%}
56+
<span class="navbar-text"><a href="/logout" class="btn btn-danger">ログアウト</a></span> {%endif%}
57+
</div>
58+
</nav>
59+
<h1>{{tagName}}</h1>
60+
61+
62+
<script src="https://code.jquery.com/jquery-3.4.1.js" integrity="sha256-WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU=" crossorigin="anonymous"></script>
63+
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
64+
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
65+
</body>
66+
67+
</html>

0 commit comments

Comments
 (0)