覚書

だいたいC#で何か書いてます。だいたい競プロ。

ksnctfとかいうものに出会った

SECCONとか参加してみたいけど前提知識とかないからどっかで勉強してから行きたいなーとか思ってたら面白そうなサイトと出会った。

https://ksnctf.sweetduet.info/

ksnctf
コンピュータセキュリティに関する問題を出題します。 各問題からFLAG_123456xyzという形式の答え(Flag)を探してください。 Twitterでログインすると、ランキングに参加できます。
ctfq.sweetduet.infoの指定されたポート以外への攻撃はしないでください。
Attack is allowed only to ctfq.sweetduet.info and specified ports only.

目的は単純に問題出すから答え当てろみたいなものらしい。これはゆるふわな感じでとてもいいと思った。最後の二行怖いけど。

https://ksnctf.sweetduet.info/problem/1

Test Problem 1pt
This is a test problem. Submit the following flag and make sure that you can get points.

FLAG_SRORGLnTh2Q5fTwu

この一問目はFLAG以下をコピーペーストするだけで良いらしい。
二問目に進む

https://ksnctf.sweetduet.info/problem/2

f:id:sh10:20170613121455p:plain

意味がわからない。というかまず英語ですらない。キモい。
とりあえずぐぐってみるとシーザー暗号だとかROT13だとか呼ばれてる暗号らしい。
全てのアルファベットを13ずらして表記しているらしいのでとりあえずコード書いて平文に直してもらう。

#include "stdafx.h"

int main()
{
	char str[] = {"EBG KVVV vf n fvzcyr yrggre fhofgvghgvba pvcure gung ercynprf n yrggre jvgu gur yrggre KVVV yrggref nsgre vg va gur nycunorg.EBG KVVV vf na rknzcyr bs gur Pnrfne pvcure, qrirybcrq va napvrag Ebzr.Synt vf SYNTFjmtkOWFNZdjkkNH.Vafreg na haqrefpber vzzrqvngryl nsgre SYNT." };
	for (int i = 0; i < sizeof(str); i++) 
	{
		if ((str[i] >= 'a'&&str[i] <= 'm')|| (str[i] >= 'A'&&str[i] <= 'M'))
		{
			str[i] += 13;
		}
		else if((str[i] >= 'n'&&str[i] <= 'z') || (str[i] >= 'N'&&str[i] <= 'Z'))
		{
			str[i] -= 13;
		}
	}
	printf_s("%s", str);
	return 0;
}

結果

ROT XIII is a simple letter substitution cipher that replaces a letter with the letter XIII letters after it in the alphabet.ROT XIII is an example of the Caesar cipher, developed in ancient Rome.Flag is (解).Insert an underscore immediately after FLAG.

解は伏せたほうがいい風習があるらしいのでそれに従う。

大まかに訳すると「ROT13はアルファベット後ろ13文字で置き換えるシンプルな暗号置換で、古代ローマで開発されたシーザー暗号の例だよ。FLAGは(解)でFLAGの直後にアンダーバーいれるよ」とのことらしい。

送ってみる。

f:id:sh10:20170613130338p:plain

正解画面が出てきた。今はとりあえずもう少しやってみようかなぁって感じ。

ALDS1_4_A わからない

探索 1 | アルゴリズムとデータ構造 | Aizu Online Judge

n個の整数を含む数列Sと、q個の異なる整数を含む数列Tを読み込み、Sに含まれる整数の中でTに含まれるものの個数Cを出力するプログラムを作成してください。

二重for文にif入れたら簡単かなぁと思って書いてみる。

using System;
using System.Linq;

namespace ALDS1_4_Acs
{
    class Program
    {
        static void Main(string[] args)
        {
            int count = 0;
            Console.ReadLine();
            int[] a = Console.ReadLine().Split().Select(int.Parse).ToArray();
            Console.ReadLine();
            int[] b = Console.ReadLine().Split().Select(int.Parse).ToArray();
            for(int i = 0; i < a.Length; i++)
            {
                for(int j = 0; j < b.Length; j++)
                {
                    if (a[i] == b[j])
                    {
                        count++;
                    }
                }
            }
            Console.WriteLine(count);
        }
    }
}

f:id:sh10:20170529094125p:plain

judge case 8で引っかかっていたのでInputを確認

http://analytic.u-aizu.ac.jp:8080/aoj/testcase.jsp?id=ALDS1_4_A&case=8&type=in

f:id:sh10:20170529094644p:plain

どうやら2行目でコンソールに入力できる一行当たりの文字数上限に引っかかったっぽい。これはどうすんだ。

C#の便利そうなやつ(書きかけ)

amzn.asia

一章の半分読み終えたので使えそうなので忘れそうなのをメモ

1.6
配列の中から初めて0より小さい値が出たときに報告するというもの
Firstメソッドが便利って話

using System;
using System.Linq;

namespace BadKnowHowShow1_6B
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] array = { 1, -1, 2, -2, 3 };
            Console.WriteLine(array.FirstOrDefault(c => c < 0));
        }
    }
}

ALDS1_3_A Elementary data structures - Stack

スタック | アルゴリズムとデータ構造 | Aizu Online Judge

逆ポーランド記法は、演算子オペランドの後に記述する数式やプログラムを記述する記法です。例えば、一般的な中間記法で記述された数式 (1+2)*(5+4) は、逆ポーランド記法では 1 2 + 5 4 + * と記述されます。逆ポーランド記法では、中間記法で必要とした括弧が不要である、というメリットがあります。

逆ポーランド記法で与えられた数式の計算結果を出力してください。

System.Collectionsを使えば楽に解ける

using System;
using System.Collections.Generic;
namespace ALDS1_3_A
{
    class Program
    {
        static void Main(string[] args)
        {
            var poland = new Stack<int>();
            string[] str = Console.ReadLine().Split();
            for (int i = 0; i < str.Length; i++)
            {
                if (str[i] == "+")
                {
                    poland.Push(poland.Pop() + poland.Pop());
                }
                else if (str[i] == "-")
                {
                    poland.Push(-1 * (poland.Pop() - poland.Pop()));
                }
                else if (str[i] == "*")
                {
                    poland.Push(poland.Pop() * poland.Pop());
                }
                else
                {
                    poland.Push(int.Parse(str[i]));
                }
            }
            Console.WriteLine(poland.Pop());
        }
    }
}

演算時が-の処理-1の乗算以外にかっこいい方法あったら誰か教えてください


Stackのリファレンス(MSDN)
Stack クラス (System.Collections)