うちぱらららららr

プログラミングやその周辺のことを主に書きます。

Goのスライスの要素の削除について

Golangにスライスの要素を削除する関数がない

Goを書いているときにスライスの要素を消してやりたいぜ…みたいな感じで使いたくなり調べてみたら,Goにはスライスの要素を削除する関数がないということでした(ぱっと調べた感じ)

なので,簡単に実装してみました.

Hoge

index番号を指定して値を消すやつ(Pythonのpopてきな)

package main

import "fmt"

func pop(slice []int, search int) []int {
    result := []int{}
 
    for i, s := range slice {
        if i != search - 1 {
            result = append(result, s)
        }
    }
    return result
}

func main() {
    list := []int{0, 12, 3, 7, 5, 9}
    fmt.Println(list)

    list = pop(list, 2)
    fmt.Println(list)
}

Poyo

値を指定するとその値を消してくれるやつ(Pythonのremoveてきな)

指定した値がスライスに二つ以上ある場合はそいつらも消えます.

package main

import (
    "fmt"
)

func remove(slice []int, search int) []int {
    result := []int{}

    for _, v := range slice {
        if v != search {
            result = append(result, v)
        }
    }
    return result
}

func main() {
    list := []int{1, 2, 3, 4, 5, 6}
  fmt.Println(list)
 
  list = remove(list, 3)
  fmt.Println(list)
}

動かないとかここおかしいとかこうしたほうがいいよとか関数ありますとかあったら教えてくれるとうれしいです.

二分探索 ~hogehoge~

ほ GE 

新年あけましておめでとうございます().

新年初の記事です.

いつの間にか年が明けたと思ったら,新学期が始まっていました.かなしいですね.まあ,頑張っていきましょう.

今年は,文章力や語彙力などを上げるためになるべく記事を書いていこうと思います.

ぽよ

ふとアルゴリズムとデータ構造を勉強したいなとおもったのでいい感じに書いていこうと思います.なるべく続けていくぞ~~.

二分探索ってなんやねん

二分探索とは…

https://ja.wikipedia.org/wiki/%E4%BA%8C%E5%88%86%E6%8E%A2%E7%B4%A2

らしいです.

Sort済みの配列を半分にして真ん中の値をとり,探したい値より小さいか大きいかを判定してうぇ~~~ってしてそこからまた繰り返すみたいな感じですね.

実装

Python3で実装してみます.

def binary_search(list1, search):
    '''
    探索して見つかった場合は配列の番号を返し,
    見つからない場合はNoneを返す.
    '''
    low = 0
    high = len(list1) - 1

    while low <= high:
        mid = (low + high) // 2  #中央の値

        if search == list1[mid]: # 一致した場合
            return mid
        if search > list1[mid]: # 小さかった場合
            low = mid + 1
        else:                   # 大きかった場合
            high = mid - 1

    return None            # なかった場合

def main():
    print(binary_search(list(range(20)), 3))  #0~19の中に3があるか
    print(binary_search(list(range(20)), -1)) #0~19の中に-1があるか

if __name__ == '__main__':
    main()

わかりにくい場合は図をかきながらやってみるといいかもしれないです.

おわり

解説のはwikipediaに丸投げですね.
文章でいい感じに説明できるようになりたいです ><.

変なところやくそっぽいところがあったら教えてくれるとうれしいです><

1年の振り返りと思ったこと【ICT Advent Calender 2016 4日目】

※この記事は ICT Advent Calendar 2016 の4日目の記事です.

はじめに...

foolish-oknct.hatenablog.com

昨日の記事は再帰マスターのれみゅー先輩の記事でした.僕もいつかはメンタルがやられる日が来る(?)かもしれないのでその時は活用しようと思います(๑´•.̫ • `๑)


僕は2016年の振り返りや思ったことを書いていこうと思います(´・ω・`)
某mito神再帰の話を書けと脅されましたが,説明がめっちゃ下手なのでまた今度(?)書きます.

1年の振り返り!

今年は特に大きなことはしてないですが,去年に比べて技術的な面で割と成長したのではないかなと思います.
去年のこの時期の自分は,プログラミングなどでfor文は全く書けず,if文も相当怪しいみたいなやばいレベルだったので結構成長したんじゃないかなと思います.(今できるわけではない)

一年を軽く振り返り
  • 1月 太る.
  • 2月 Pythonを始める.(運命の出会い)
  • 3月 cygwinなどが来る(たぶん)
  • 4月 競プロを始める
  • 5月 Pythonが良い
  • 6月 Pythonが良い
  • 7月 暑い
  • 8月 夏休み
  • 9月 夏休み
  • 10月 Bash on Ubuntu on Windows が来る(たぶん)
  • 11月 競プロ
  • 12月 だめ

いろいろとずれてるのがあると思いますがだいたいこんな感じです.
if文やfor文が書けるようになるのが2月後半(たぶん)なので結構進歩したなと思います.

Pythonが良いと書いていますが全くできないです.

今年やったこと

今年やったことを簡単にまとめると

  • 少しだけ競プロ

などを主にやってきました.

中途半端なものが多かったりするので来年は中途半端なものをなくしていきたいですね...(´・ω・`)

一年生をみて

たまにみるとすごいプロだなぁ~~と思います.

一年生のほうが僕よりいろいろできるので頑張ってほしいと思うばかりです.
僕も頑張らねば...


あと,競プロオタクみたいな人がいないのでゲームの代わりに競プロしてみてほしいです.楽しいですよ(・ω・)
この話は,kurokojiプロかLuzプロがしてくれると思います.(適当)

来年は...

  • 中途半端なものをなくしていく.
  • 興味のあることはたくさん勉強していろいろなものに挑戦していく.

などを目標に頑張っていきたいです.


開発などもやっていきたいなぁとか思ってます.

あとは,去年僕がダラダラしている間につけられた12thプロ各位との差をできるだけ埋めていきたいです...(´・ω・`)
あああ,頑張るぞい(´・ω・`)

最後に

今年は去年よりだいぶ成長できた年だなと思います.
でもまだまだなので,来年はもっと圧倒的成長!!できるように精進します.

割と短い(?)ですが,ネタが思いつかないのでこの辺で終わろうと思います.
記事が読みにくい & 日本語が変 なのは仕様なので気にしないでください(´・ω・`)


明日の記事は期待の一年生達です.きっと日本語力と文章力に富んだ素晴らしい記事を書くと思います!

AOJ-0611 Silk Road

シルクロード | Aizu Online Judge


再帰の練習のためにメモ化再帰で解きました.

問題概要

N+1の都市があり,M日以内に都市0から都市Nに移動する.
移動するときに 天候C[i] * 都市間の距離D[j] の疲労度が溜まっていきそれが最小になるように移動していく.

解法

メモ化再帰をする.

#include <bits/stdc++.h>
using namespace std;

#define rep(i, n) for(int i = 0; i < (n); i++)
 
#define int long long
 
int n, m;
int d[1010], c[1010];
int dp[1010][1010];
 
int rec(int x, int y)
{
  if (dp[x][y] != -1) return dp[x][y];
   
  int res = 0;
   
  if (x == n) res = 0;
  else if (y == m) res = 198298398;
  else res = min(rec(x + 1, y + 1) + d[x] * c[y], rec(x, y + 1));
 
  return dp[x][y] = res;
}
 
signed main(void)
{
  cin >> n >> m;
  rep(i, n) cin >> d[i];
  rep(i, m) cin >> c[i];
 
  memset(dp, -1, sizeof(dp));
 
  cout << rec(0, 0) << endl;
 
  return 0;
}

dpできない