さえめろ の めも🐰

さえめろの備忘録です。twitter : @sae_mero_

ksnctf #3「Crawling Chaos」

問題

ksnctf - 3 Crawling Chaos




解答までの道

htmlページのソースを確認。
scriptタグの中身が名伏しがたいものに…

どうやらこのうーにゃーが、きちんとJSとして動いているようです。



ソースコードをコピペして、js部分をconsole.log()で囲んで実行してみる。
余談ですが、Bracketsを使ってみました。使いやすい!



console画面への出力はこんな感じ。

f:id:saemero:20170623141533p:plain


ん…!?
ビ、ビンゴっぽい…!

f:id:saemero:20170623143627p:plain


うーにゃーはどうやらこの部分の動きをしてるようです。
とりあえず整形してみました。

$(function(){
    $("form").submit(function(){
        var t=$('input[type="text"]').val();
        var p=Array(70,152,195,284,475,612,791,896,810,850,737,1332,1469,1120,1470,832,1785,2196,1520,1480,1449);
        var f=false;

        if(p.length==t.length){
            f=true;
            for(var i=0;i<p.length;i++){
                if(t.charCodeAt(i)*(i+1)!=p[i]){
                   f=false;
                }
                if(f){
                   alert("(」・ω・)」うー!(/・ω・)/にゃー!");
                }
            }
        }
        if(!f){
            alert("No");
        }
        return false;
    });
});


配列pの中身をASCIIコード化し、i+1を乗算した文字列が一致していれば通るみたいです。
なので、i+1で除算し、ASCIIコードから元の文字を求めればフラグがでますね。

折角だしJavascriptで記述。

var p = Array(70,152,195,284,475,612,791,896,810,850,737,1332,1469,1120,1470,832,1785,2196,1520,1480,1449);
var answer = "";

for(var i = 0; i < p.length; i++){
    answer += String.fromCharCode(p[i] / (i+1));
}

console.log(answer);


実行したところ無事FLAGをゲット!



使ったものなど

・うーにゃーencode 
(」・ω・)」うー!(/・ω・)/にゃー!encode

ksnctf #2「Easy Cipher」

他の何問かを授業中に出題され、問いてみたらとても楽しかった。
とりあえずこのksnctfを全部終わらせよう!という目標を掲げて、復習も兼ねて記事を書いていこうと思います。

続きを読む

Cocos Creatorで物理演算を使ってみる

Cocos Creatorで物理演算を使ってみたよ〜というメモ。
よく物理演算を使った落ち物ゲーなどでみるような動きをCocos Creatorでもやってみます。

続きを読む

【AOJ】0001「List of Top 3 Hills」

山の高さ
山の高さをメートル単位の整数で表した 10 個のデータがあります。その 10 個のデータを読み込み、その中で、高い順から3つ出力するプログラムを作成して下さい。


Input

山の高さ1
山の高さ2
     .
     .
山の高さ10

Constraints
  ・0 ≤ 山の高さ ≤ 10,000

Output

1番目に高い山の高さ
2番目に高い山の高さ
3番目に高い山の高さ


高さが同じ山が複数ある場合でも、異なる順位を付けるものとします。


Javascript

process.stdin.resume();
process.stdin.setEncoding('utf8');
 
process.stdin.on('data', function (chunk) {
    var aaa = chunk.toString();
    var line = aaa.split("\n");
    for(var i in line){
        line[i] = new Number(line[i]);
    }
     
    line.sort(function(a,b){
        if( a > b ) return -1;
        if( a < b ) return 1;
        return 0;
    });
    
    for(var j = 0; i<3; i++){
        console.log(line[i].toString());
    }
});

この入力の受け取り方(stdin.on)はpaizaスキルチェック問題におけるJavascript標準のものになっています。
Javascriptでは配列のソートをする際、文字列だと頭文字から比較をしていくので(つまり9>12345)型変換を行なっています。

【Pythonメモ】format関数 - 変数を文字列に埋め込む

■format関数
 Pythonにおいて、変数を文字列への埋め込む時に使う。
 特に文字列と任意の変数を同時に出力する時に使えます。(print関数など)
 引数の部分に埋め込みたい変数を入れることで、{}の部分に変数が入った状態で出力できます。

 "文字列{}文字列".format{変数}

 例えば、以下のように使えます。

egg = 100
tomato = 200
total = egg + tomato
 
print("合計は{}円です".format(total))

 出力:合計は300円です。

■複数の引数を持つformat関数
 format関数には引数を複数設定することができます。
 その場合、複数の{}に対してどの変数を埋め込むかを指定する必要があり、インデックスで指定するのが最も一般的な方法。
 x番目の引数を埋め込みたい場合、{x}と記述します。

 # インデックスで指定する方法
 egg  = 100
 tomato = 200
 total = egg + tomato
 
 print("卵は{0}円で、みかんは{1}円。合計は{2}円でした。".format(egg, tomato, total))

 出力:卵は100円で、みかんは200円。合計は300円でした。

 また、キーワードで指定するか、辞書(ディクショナリ)形式で指定する方法も取れます。

 egg  = 100
 tomato = 200
 total = egg + tomato

  # キーワードで指定する方法
 print("卵は{egg}円で、みかんは{tomato}円。合計は{total}円でした。".format(egg=egg, tomato=tomato, total=total))
 # 辞書形式で指定する方法
 print("卵は{egg}円で、みかんは{tomato}円。合計は{total}円でした。".format(**{'egg':egg, 'tomato':tomato, 'total':total} ))


■list型を使用して埋め込む

 list型を使用して変数を埋め込むこともできます。
 listに埋め込みたい変数を入れ、インデックス番号で指定します。

 egg  = 100
 tomato = 200
 total = egg + tomato

 list = [egg, tomato, total]
 print("卵は{0[0]}円で、 みかんは{0[1]}円。合計は{0[2]}円でした。".format(list))

■n進数で出力
 format関数を使用することにより、n進数での数値の出力が可能です。
 {0:b}と表記することで2進数、
 {0:o}と表記することで8進数、
 {0:d}と表記することで10進数、
 {0:x}と表記することで16進数で出力できます。

 num = 444
 print("""{0}の
 2進数 = {0:b}
 8進数 = {0:o}
 16進数 = {0:x}""".format(num))

 出力:
 818の
 2進数 = 110111100
 8進数 = 674
 16進数 = 1bc

※ """か'''でくくって出力することにより、改行をそのまま出力に反映できる。


■色々な数値指定

#小数点以下指定した桁まで表示
print('{:.3f}'.format(0.12345))

#3桁ずつカンマで区切る
print( '{:,}'.format(123456789))

#パーセントで表示
seito = 150
otoko = 90
print('男子は全生徒の{:.1%}です'.format(otoko / seito))
#出力:男子は全生徒の60.0%です

【AOJ】0000「QQ」

QQ

九九
以下のような表記で、九九を出力して終了するプログラムを作成してください。×記号の代わりに、小文字の x を使用してください。

1x1=1
1x2=2
.
.
9x8=72
9x9=81


Input

この問題に入力はありません。


Output

1x1=1
1x2=2
.
.
9x8=72
9x9=81


Javascript

process.stdin.resume();
process.stdin.setEncoding('utf8');
 
for(var i = 1; i<10; i++){
    for(var j = 1; j<10; j++){
        var k = i*j;
        console.log(i +"x" + j + "=" + k);
    }   
}

二重ループで九九の表を出力するだけ。
これだとkの場所を取るだけ無駄なので、console.log(i +"x" + j + "=" + i*j)の方が多分いいですね。


■Python3

for i in range(1,10):
    for j in range(1,10):
        print("{0}x{1}={2}".format(i,j,i*j))

Python始めたてなので、出力の部分で変数を埋め込むのにちょっとこけた。
format関数を使用することで文字列に変数を埋め込んで出力したり、書式を指定したりすることができるみたいです。


C++

#include <iostream>
using namespace std;

int main(){
    for(int i = 1; i<10; i++){
        for(int j = 1; j<10; j++){
            cout << i << "x" << j << "=" << i*j << endl;
        }   
    }
    return 0;
}

JavascriptのコードをそのままC++に変えただけですね。
paiza.io上での実行時間はJavascriptの0.07sに対して、C++は0.00s(???)とその差は一目瞭然でした。

プロジェクトオイラー#6 について

#6「二乗和の差」についてのお話。

続きを読む