はてなキーワード: cntとは
なるほど確かにその通りですね。
意固地になって謝罪を固辞し続けて大変申し訳ございませんでした。
僭越ながらわたくしめがフェミニストを代表して土下座で謝罪させていただきます。
その方法として古代中国より伝わる「三跪九叩頭の礼」で謝意を表させていただきます。
なお、冗長した記述を避けるためにプログラミング言語「COBOL」を用いることを予めご了承ください。
IDENTIFICATION DIVISION.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
DATA DIVISION.
WORKING-STORAGE SECTION.
PROCEDURE DIVISION.
MAIN.
PERFORM 3 TIMES
DISPLAY "GUI"
PERFORM 3 TIMES
DISPLAY DOGEZA-CNT "KOUTOU"
DISPLAY "CHI"
END PERFORM.
DISPLAY "CHIRAI"
END PERFORM.
STOP RUN.
END PROGRAM SANGUIKIUKOUTOU.
御清聴ありがとうございました。
このプログラムは、Pythonのようなインタプリタ型のプログラミング言語を使用しています。提供されたコードは関数と変数の組み合わせで、カウンターの機能を実現しています。以下にその説明を詳しく説明します。
let キーワードを使用して、内部のカウンターを定義しています。カウンターは cnt という名前の変数で初期化され、値は0に設定されています。このカウンターは、外部から直接アクセスできないように、ローカルスコープ内に存在します。
:reset というキーを持つ場合、カウンターの値を0にリセットします。
:incr というキーを持つ場合、カウンターの値を1増やします。
この無名関数が counter 変数に代入されて、カウンターオブジェクトが作成されます。
.reset メソッドが呼び出されると、カウンターの値は0にリセットされます。
このプログラムは、カウンターの値を増加させたりリセットしたりするシンプルなカウンターの実装例です。Pythonなどのプログラミング言語では、関数やクロージャを使用して、このような動作を実現することができます。
機種名 | 価格 | 売ってるとこ | 所見 |
---|---|---|---|
TANGZU Wan'er S.G | $16.00 | https://www.aliexpress.us/item/1005004901476563.html | 評価の高い中国偉人シリーズのエントリーモデル。 |
TinHiFi C2 | $26.00 | https://www.aliexpress.com/item/1005005009241101.html | LCP+PU振動板10mmDD。同構成でレジン筐体のC3もあり、低音はC3のほうが出る |
Kiwi Ears Cadenza | $34.99 | https://www.linsoul.com/products/kiwi-ears-cadenza | ベリリウム振動板10mmDD、見た目が良い。 |
TKZK Ouranos | $44.55 | https://www.aliexpress.us/item/1005005071790922.html | CNT振動板10mmDD、TinHiFiのサブブランド。 |
SIMGOT EA500 | 10,980円(予定) | 国内未発売、現在輸入不可 | DLC振動板10mmDD。交換式ノズル。この価格でKATOに匹敵? |
Letshuoer S12 PRO | $117.00 | https://www.aliexpress.com/item/1005003726690210.html | 最近増えてきた$100台の平面駆動イヤホンの筆頭S12の改善版。プロモコード12DEALSC9で-$9 |
TANGZU x HBB Wu Heyday Edition | $199.00 | https://www.linsoul.com/products/tangzu-x-hbb-wu-heyday | 平面駆動でS12と並び評判だった武則天のHBBコラボ版。 |
低価格1DD機の進歩が著しい。どの音域も十分な解像度がありながらハーマンターゲットに寄せたニュートラル傾向の機種が低価格帯にも増えてきた。
9.11、世界貿易センタービルなどの同時多発テロもアメリカの自作自演が陰謀論として根強く残っている。
マイケルムーアによる映画や、Zeitgeistなどの有名作品もある。
あれが本当に自作自演かはわからないけど、あれによってアメリカどころか世界の世論が「テロとの戦い」と「派兵」に大きく傾いた。
ウクライナの民間被害は、国際世論を「対ロシア」「対プーチン」へと導いた。
ロシアは、ウクライナの民間被害(建物の爆破など)はウクライナの自作自演だと言っている。
「外の情報が手に入らない」
「ウクライナ政府を信用するな」
「あなたの話を聞くことはできるが、私から話すことはできない」
と言っていた。その後メッセージは消された。
I cn listn 2 yu, but me cnt talkのように、傍受を恐れてか、不自然なスペースと、母音抜きの単語と間違った文法で送られてきた。
プレイしてみたけど正直言ってあんまりおもしろくはなかったです。
今はこのカードゲームの話題の八割くらいは中心になってる某店長の奇行になってますが、
それを抜きにしてカードゲームとしてどうなの?って所が大きかったかな。
ルーラーっていうものによって異種格闘技戦的なことができるのが
多分このゲームの一番のウリだと思うんだけど、
散々言われてるけど毎ターン2デッキトップ2枚をタダ出しできるデッキと
馬鹿正直にコスト払わないと出せないデッキが殴り合ったらそりゃさ。
とは言え、坊主めくり側は手札自体が無いから例えば手札回収カードとかは使えないわけで、
そういう所で今後バランスはとれていくかもしれないという希望はある。
そのせいで一見さんお断りの面倒くさい仕様になってるのはいかがなものか。
両方ともテキストの内容なんも違いがないんですよね。
何が違うのかっつったらわざわざカードに書かれたQRコード読み取って
で、実際この2種類何が違うのかっつったらデッキビルディング制限が違って、
所属軍は2種まで、同名カード4枚まで(レジェンドカードは同名1枚のみ)、
H-8ハイランダーはその名の通り、
っていうこんな程度の違いしかないんですよね。
所属軍ってのは遊戯王で言えば属性、デュエマで言えば文明みたいな
カードを組み分けするもんだと思ってくれればいいんだけど、
他のカードゲームだったらそういうのって自分で決めるじゃないですか。
ハイランダー構築も作ろうと思えば好きに作れるじゃないですか。
わざわざカードに指図されることじゃないし、こんなん異種バトルとは言わんでしょ。
精々ボクシングでマウスピースがゴム製かプラ製かくらいの違いしかないじゃないですか。
煩わしい上に自由度下げるだけにしかなってないかなと思いました。
ルーラーについての話終わり。
ルールの説明がわざとやってんのかってくらいわかりにくいのです。
なんで公式サイトにカードの並べ方、置き方すら書いてないのか。
一応無料体験デッキについてるQRコードの中の隅っこのほうには載ってたけど、
【ゲームの準備】【ターン開始時】【ルール】までしか載ってません。
それより先のデッキ構築ルールはさらに個別の詳細ページを見ないとわかりません。
せめて「ここに書かれてないルールがあるのでチェックしてね!」
変に誤解を生むこともなかったと思うんですよね。
どうやら坊主めくりルーラーがめくったカードを使うまで一時的に置いとく場所のことらしいけど、
公式ツイッターがなくて一番話をしてくれるのが某店長のアカウントってのもおかしい。
いや、普通ならそれでいいんだけども、
あの人に今質問したら晒し首にされるしご機嫌損ねたらブロックされるし、
売る気があるのか疑問に思うレベルですよ。
普通のコスト払ってプレイするほうでも基本的にめくりまくります。
デッキトップからダメージ値分めくってダメージゾーンに置くんですが、
そのめくった時にCNT(カウンター)能力を持ったカードが出れば
1枚につき1点分のダメージをキャンセルして効果撃つんですね。
で、今の所はCNT枚数割合上限が16/50のルーラーしかいないので大体1/3です。
ルーラー自身のSTRでも3ダメージ出るわけなので1体でも期待値1枚、
他のユニットと合わせて攻撃したら1度のバトルフェイズで2~3枚くらいめくれます。
このゲームでターン開始時にデッキから得られる枚数は2枚なので、
大体、自分のターンにプレイする枚数とデッキトップめくれて出てくるCNT枚数が
同じかそれ以上になるんですよね。
半数以上をめくって解決するんだから嫌が応でも運ゲー合戦なんですよ。
坊主めくりルーラー使ってなくても結局坊主めくりみたいなもんなんですよ。
戦略もクソもねぇわめくれるかめくれないかのほうが比重が大きいじゃないか。
確かに、デッキ構築を自分のやりたい内容に傾けることはできるものの、
セットしたカードをいつ使うとか誰を殴るかとかのお陰で
辛うじてTCGの体を成しているものの根本的に運運アンド運でした。
ここが本当にどうなのって思ったし面白くなった主要因です。
期待値通りにめくれてくれれば実質18はあるということですね。
びっくりするくらい抑揚がないですね。
それがターン経過で大きなコストが払えるようになっていき~って流れが、
遊戯王もエクストラデッキから出す為に素材集めてどうたらこうたらってあるけど、
序盤から終盤までやってること変わんないんですよ。
そりゃ坊主めくりルーラーは常時無限のコストがあるんだから当たり前だし、
普通に払ってプレイするルーラーもゲーム開始時からある3枚分のコストが
増減することは無いわけですからね。
ターン開始時に2枚めくって使い、殴り、相手のデッキトップをめくってCNT使われ、
今度は相手が同じことやって…。ずっとこれです。
いくつか対戦動画見てみたんですがやっぱり内容は同じなんですよ。
ひたすらお互いにめくりあって出たカード投げ合ってる感じ。
このゲームにおける強い弱いってのは
めくっていいもん引けることを強いっていうんだろうなと。
まだ発売されてないのに無料体験で何語ってんだって思う人もいるかもだけど、
無料体験ってそのゲームの楽しさを体験させるためにあるものなんで。
無料体験ではこのゲームの楽しさはわからないんだぜってそれ売る気あるの?
ルーラーどうこうに関わらず運が介入する要素が多すぎるので、
運ゲーじゃねえかつまらんって思う人はやってもつまらんと思います。
ダメージ判定でCNTがめくれないのが続いたらめちゃあっけなく負けるんで、
真面目に勝ち負け競いたいって人にも向いてないと思います。
めくった結果に一喜一憂してウッキャアアアア!神引きィィィィィ!!
少なくとも精神的に落ち着いた大人の方には合わないんじゃないでしょうか。
運に自信があって、魂のドロー!うおおおおおお!!!!!!!!!!!!!!
要はプロモーションビデオのノリだよ。あれが楽しいなら楽しいよきっと。
function pair(psns) { var i = -1; var cnt = 0; var flg = psns[0] &amp;&amp; psns[0].sex; // modified on 2018-12-31 by XXXX // var flg psns[0].sex; var j = -1; var tmp = null; // modified on 2020-12-31 by XXXX. // var k = -1; for(i = 0; i < psns.length; i++) { //console.log('■■■■■■■■■■■■■■■■■■■■ BEGIN ■■■■■■■■■■■■■■■■■■■■') //console.log(psns, 'i=' + i, 'cnt=' + cnt, 'flg=' + flg); if(psns[i].sex == flg) { //console.log('cnt: ' + cnt + '->' + (cnt+1)); cnt++; } else { j = i - cnt + 1; // j = i - cnt; // j = i - cnt - 1; //console.log('swap ' + i + '<-->' + j); tmp = psns[j]; psns[j] = psns[i]; psns[i] = tmp; i = j - 1; // <- 理由は分からないが、i = jだと上手くいかない(by XXXX)。 cnt = 0; // flg = !flg; // これはなぜか上手くいかない (by XXXX) flg = flg == MALE ? FEMALE : MALE; while(j > 1) { if(psns[j].height < psns[j-2].height) { //console.log('swap ' + j + '<-->' + (j-2)); tmp = psns[j-2]; psns[j-2] = psns[j]; psns[j] = tmp; } j -= 2; } // modified on 2018-12-31 by XXXX. // //for(k = 0; k + 2 < j;) { // if(psns[k].height > psns[k+2].height) { // tmp = psns[k+2]; // psns[k+2] = psns[k]; // psns[k] = tmp; // } // k += 2; //} } //console.log(psns, 'i=' + i, 'cnt=' + cnt, 'flg=' + flg); //console.log('■■■■■■■■■■■■■■■■■■■■ END ■■■■■■■■■■■■■■■■■■■■') //console.log('') } for(i = 0; i < psns.length; i++) { //console.log('■■■■■■■■■■■■■■■■■■■■ BEGIN ■■■■■■■■■■■■■■■■■■■■') //j = i / 2; j = Math.floor(i / 2); //console.log(psns, 'i=' + i, 'j=' + j); tmp = psns[i]; if(!(i % 2)) { psns[j] = [null, null]; } if(tmp.sex == MALE) { psns[j][0] = tmp; psns[j][1] = psns[i+1]; } else { psns[j][0] = psns[i+1]; psns[j][1] = tmp; } // modified on 2018-12-31 by XXXX. // //psns[j][0] = tmp; //psns[j][1] = psns[i+1]; i++; //console.log(psns, 'i=' + i, 'j=' + j); //console.log('■■■■■■■■■■■■■■■■■■■■ END ■■■■■■■■■■■■■■■■■■■■') } psns.splice(psns.length / 2, psns.length); // modified on 2020-12-31 by XXXX. // return psns.slice(0, psns.length / 2 + 1); // return psns.slice(0, psns.length / 2); }
プログラミングはセンスです。センスの無い人がプログラマになると、他のすべての人に迷惑がかかります。だから、センスの無い人は絶対にプログラマにならないで下さい。
プログラミングのセンスが無い人や、プログラミングをやったことの無い人は、知識を得たり経験を積んだりすれば、誰でも「良いプログラマ」になれると思っているようですが、無理です。
というのも、センスの無いプログラマの問題は、知識や経験の不足ではないからです。センスの無いプログラマの救いようの無い問題は「頭がおかしいこと」なのです。
題材は何でもいいのですが、具体的なコードを見た方がイメージがつきやすいと思いますので、とりあえず以下の問題を考えます。
住民のリストが与えられるので、背の低い順に男女ペアにしたリストを作って下さい。ただし、男女の数は同数であるとします。
const makePair = (persons) => { const males = persons.filter(person => person.sex === MALE) const females = persons.filter(person => person.sex === FEMALE) const compareHeight = (a, b) => a.height - b.height males.sort(compareHeight) females.sort(compareHeight) return males.map((male, idx) => [male, females[idx]]) // 男女の数は同数 }
この例はJavaScriptなので高階関数を使っていますが、仮にそういう機能が無かったとしても、
一方、センスの無いゴミプログラマは、以下のような名状しがたきコードを書いてきます。
function pair(psns) { var i = -1; var cnt = 0; var flg = psns[0] &amp;&amp; psns[0].sex; var j = -1; var tmp = null; for(i = 0; i < psns.length; i++) { //console.log('■■■■■■■■■■■■■■■■■■■■ BEGIN ■■■■■■■■■■■■■■■■■■■■') //console.log(psns, 'i=' + i, 'cnt=' + cnt, 'flg=' + flg); if(psns[i].sex == flg) { //console.log('cnt: ' + cnt + '->' + (cnt+1)); cnt++; } else { j = i - cnt + 1; //console.log('swap ' + i + '<-->' + j); tmp = psns[j]; psns[j] = psns[i]; psns[i] = tmp; i = j - 1; // <- 理由は分からないが、i = jだと上手くいかない(by XXXX)。 cnt = 0; flg = flg == MALE ? FEMALE : MALE; while(j > 1) { if(psns[j].height < psns[j-2].height) { //console.log('swap ' + j + '<-->' + (j-2)); tmp = psns[j-2]; psns[j-2] = psns[j]; psns[j] = tmp; } j -= 2; } } //console.log(psns, 'i=' + i, 'cnt=' + cnt, 'flg=' + flg); //console.log('■■■■■■■■■■■■■■■■■■■■ END ■■■■■■■■■■■■■■■■■■■■') //console.log('') } for(i = 0; i < psns.length; i++) { //console.log('■■■■■■■■■■■■■■■■■■■■ BEGIN ■■■■■■■■■■■■■■■■■■■■') j = Math.floor(i / 2); //console.log(psns, 'i=' + i, 'j=' + j); tmp = psns[i]; if(!(i % 2)) { psns[j] = [null, null]; } if(tmp.sex == MALE) { psns[j][0] = tmp; psns[j][1] = psns[i+1]; } else { psns[j][0] = psns[i+1]; psns[j][1] = tmp; } i++; //console.log(psns, 'i=' + i, 'j=' + j); //console.log('■■■■■■■■■■■■■■■■■■■■ END ■■■■■■■■■■■■■■■■■■■■') } psns.splice(psns.length / 2, psns.length); }
こんなコードのメンテナンスは御免被りたいです。一見して配列の要素を入れ替えていることが分かるだけで、実装を全て読まなければ(いや読んでも)処理の意図が全く分かりません。また、たとえば「i = j - 1」が間違って「i = j」などと書かれていてバグを起こしたとしても、原因を突き止めるのは困難を極めます。
さて、このコードは具体的に何がいけないのでしょうか。長すぎることがいけないのしょうか。変数名が分かりにくいのがいけないのでしょうか。引数を破壊的に変更しているのがいけないのでしょうか。不要なコメントが残っているのがいけないのでしょうか。よく見ると、ソート処理で車輪の再発明をしていたり、「j」や「tmp」などが場所によって意味が違うカメレオン変数になっていたりしますが、それがいけないのでしょうか。どれも正しいですが、それらを逐一直したところで、本質的な解決にはならないでしょう。
後者のコードはもはや「ここを直したら良くなる」とかいうレベルを超えています。たしかに、問題を具体的に挙げることはできます。このコードの致命的な問題が、凝集度の低さと、単一責任の原則(SRP)違反にあるのは間違いありません。しかし、後者のコードを書いてくる人に、
「住民リストを男女に分ける処理や、リストをソートをする処理、2つのリストをまとめる処理は、この問題とは独立して意味のある操作だから、別の関数として抽出しましょう。その方がコードの見通しがよくなるし、一部の処理を修正したときの影響も小さくなるし、単体テストも書きやすくなります」
なんて言ったって聞く耳を持たないでしょう。
そもそも、こういうコードを書く人は、この処理自体を「pair」なんて関数に抽出すらしません。まだこの問題では入出力のフォーマットが明確に定義されているので、他人が1から書き直せますが、実際のプロダクトでは、無数の副作用を起こす数千行のコードの迷路を彼の脳内フォーマットのデータが通るわけです。もちろん、テストコードなんてありません。
つまり、指摘をしても絶対に直らないのです。いくら言語の優れた機能やベストプラクティスを紹介しても、馬の耳に念仏。それらの利点を理解できるだけの脳みそが足りていないのです。
どうして、同じ処理を実装するのに、ここまでの違いが生じるのでしょうか。
これは、プログラミングの技術の問題ではありません。既に述べた通り、ふつうの人なら、特定の機能の有無とか知識の程度にかかわらず、ふつうのコードを書くのです。なぜなら、ふつうの人にはそちらの方が楽だからです。つまり、前者のコードは別に何か卓越した技術を身につけた結果書けるようになるものではなく、まともな感覚さえ持っていれば、プログラミング初心者にとっても前者のコードの方が書きやすいのです。
つまり、後者のようなコードを書いてくる奴というのは、現実世界の捉え方が常人とは著しくずれているのです。要するに、「頭がおかしい」のです。この病気はもう直りません。だから、センスの無い人は絶対にプログラマにはならないで下さい。
countをcntと省略するのも気になるな
じゃぁ、問1をやってみた。
unsigned int f(unsigned int x) { x = x - 1; x = x | (x >> 1); x = x | (x >> 2); x = x | (x >> 4); x = x | (x >> 8); x = x | (x >>16); return x + 1; } int main(int argc, const char * argv[]) { int check = 1; int cnt=0; if(0!=f(0)){ cnt++; } for(unsigned int i=1;i!=0;i++){ if(check < i){ check <<=1; } if(check != f(i)){ cnt++; } if(i%0x10000==0){ printf("%x\n",i); } } printf("cnt=%d\n",cnt); return 0; }
iよりも等しいか大きい最小の2の乗数
Cだとこんな感じか。
#include <stdio.h> int isLeap(int year) { return ((year%400 == 0) || (year%4 == 0) &amp;&amp; (year%100 != 0)) ? 1 : 0; } int todays(int year, int month, int day) { int MonthDays[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int days = 0; int i = 0; days += ((month > 2) &amp;&amp; isLeap(year)) ? 1 : 0; for (i = 0; i < month-1; i++) { days += MonthDays[i]; } days += day; /* printf("leap %d days %d\n", isLeap(year), days); */ return days; } int cntLeap(Syear, Eyear) { int i = 0; int cnt = 0; for (i = Syear; i < Eyear; i++) { cnt += isLeap(i); } return cnt; } int main() { int year = 2009; int month = 6; int day = 4; long days = 0; unsigned long long sec = 0; int DaysSec = 60 * 60 * 24; days += (year-1)*365 + cntLeap(0, year); days += todays(year, month, day); days -= 1; sec = days * DaysSec; printf("%d %d %d:days %d: sec %llu\n", year, month, day, days, sec); /* 2009 6 4:days 733566: sec 18446744072665144576 */ return 0; }
http://blogs.wankuma.com/episteme/archive/2007/11/08/106927.aspx
かなりテキトー。エラー処理とかしない。
package Animal; sub new { bless { cnt => 1 } , $_[0] } sub Sound { printf "%s\n", $_[0]->{voice} x $_[0]->{cnt} } sub SetCount { $_[0]->{cnt} = $_[1]; $_[0] } sub SetVoice { $_[0]->{voice} = $_[1]; $_[0] } package Dog; use base qw/Animal/; sub new { $_[0]->SUPER::new->SetVoice('Wan') } package Cat; use base qw/Animal/; sub new { $_[0]->SUPER::new->SetVoice('Nya-') } my $animal; $animal = Dog->new; $animal->Sound; $animal->SetCount(3); $animal->Sound; $animal = Cat->new; $animal->Sound;