沖の雑記帳

基本的には趣味に絡んで雑多な内容を色々と

スターリンソートっていうのが流行っていたらしい

スターリンソートっていうのが流行っていたらしいんだけども流行に乗り遅れた。

とりあえず、Qiitaで最近ちょいちょい見るようになった大元はこれなのかな? qiita.com

なお、本家(?)は下記 github.com

というわけで、自分も粛清ソートしてみたいなって思ったんだけどほとんど別の人が書いちゃってるし公式にも大量に上がってるのでそれよりもいいものは書ける気がしない。
あと、vim scriptはまだお勉強中につきQiitaに投稿するのははばかられる…気がする

" Script Name: stalinsort.vim
" Version:     0.1.0
" Last Change: August 06, 2019
" Author:      Hironao Oki <hironao.oki@gmail.com>
scriptencoding utf-8

" Anti reinclusion guards
if exists("g:loaded_stalinsort")
    finish
endif
let g:loaded_stalinsort = 1

" Support for |line-continuation|
let s:save_cpo = &cpo
set cpo&vim

" Functions
function! s:stalinsort(...)
    let res = []
    let args = s:argsfilter(a:000)
    for arg in args
        if  len(res) == 0 || len(res) > 0 && res[-1] <= arg
            call add(res, arg)
"     else
"         echo "exclude:".arg.",res[-1]:".res[-1].",".(res[-1] <= arg)
        endif
    endfor
    echo join(res)
endfunction

function! s:argsfilter(args)
    let res = []
    if len(a:args) > 0
        for arg in a:args
            try
                call eval(arg)
                call add(res, eval(arg))
            catch
            endtry
        endfor
    endif
    return res
endfunction

command! -nargs=* StalinSort call s:stalinsort(<f-args>)

" Restore previous 'cpo' value
let &cpo = s:save_cpo
unlet s:save_cpo
" vim: ts=2 sw=2 sts=2 noet

変数の扱いがカオスすぎて、未定義の文字列が0扱いになったりそれを除外しようとしたら00.0も除外されちゃったりで困ったので、強引に文字列を除く処理を頭に追加…
ぶっちゃけO(n)じゃないんじゃ…ってなってるし、そもそもこれソートじゃないじゃん!ってなってるけどルールに従わなかったら消されても仕方ないってことらしいので良いんじゃないかな?

あと一応、プラグインとして読み込めるようにコマンドに登録したりはしてるけど需要はなさそうなのでgithubには上げてない。
vimスクリプトのヘッダ部分って何書けばいいの?

さて、問題ははてなに書いたところでツッコミがいただけないということだ…わたしのブログはただのらくがき帳なので見に来る人があまりいないのが問題だ

ついでにバッチファイル版作ったけど事前処理が重すぎてO(n)でないのは確かだ

バッチファイル版修正しました。以前のものはバグが有って遅延展開の参照ミスってました。

@setlocal enabledelayedexpansion
@echo off
REM stalinsort.bat

set idx=0
set prev=0
for %%i in (%*) do (
  call :numchk %%i
  if errorlevel 1 (
    if !idx! gtr 0 (
      if %%i geq !prev! (
        set /a res[!idx!]=%%i
        set /a prev=%%i
        set /a idx=!idx!+1
      )
    ) else (
      set /a res[!idx!]=%%i
      set /a prev=%%i
      set /a idx=!idx!+1
    )
  )
)
for /l %%i in (0,1,%idx%) do (
  echo|set /p=!res[%%i]! 
)
goto :EOF

:numchk
set chknum=%1
if defined chknum set chknum=%chknum:0=%
if defined chknum set chknum=%chknum:1=%
if defined chknum set chknum=%chknum:2=%
if defined chknum set chknum=%chknum:3=%
if defined chknum set chknum=%chknum:4=%
if defined chknum set chknum=%chknum:5=%
if defined chknum set chknum=%chknum:6=%
if defined chknum set chknum=%chknum:7=%
if defined chknum set chknum=%chknum:8=%
if defined chknum set chknum=%chknum:9=%
if defined chknum set chknum=%chknum:-=%
if defined chknum (
  set /a tmpnum=%1
  if not !tmpnum!==0 (
    exit /b 1
  )
  exit /b 0
) else (
  exit /b 1
)

ゲームマーケット2019春に行ってきました【5/25~5/26】

大変遅くなりましたがゲームマーケット参加記録です。
今回、2日目は短時間しか参加できなかったので両日まとめて書いちゃいます

f:id:h_oki:20190528133329j:plain

続きを読む

ゲームマーケット2018秋に行ってきました【2日目】

さて本日はゲームマーケット2018秋の2日目記事です。
前置きはすっ飛ばして、さっそく2日目の試遊や戦利品について書いてみましょう。

1日目はこちら ゲームマーケット2018秋に行ってきました【1日目】 - 沖の雑記帳

続きを読む

ゲームマーケット2018秋に行ってきました【1日目】

毎度恒例と言いますか最近の記事がすべてゲームマーケット参加記録と化している沖の雑記帳です。

それはさておき、ゲームマーケット2018秋に行ってきました。
今年から個人参加のレギュレーション(?)が変わったらしく1日しか参加できなくなったっぽいですね。

まぁ、年々出展される方が増えているので仕方ないのだろうとは思いつつ一般での両日参加もなかなかに厳しく感じてきた今日このごろです。

まずは1日目の試遊や戦利品について書いてみましょう。

続きを読む