swiftらしい簡潔な書き方を追求するスレ
昔「詰めvi」というスレが好きだったので立ててみました。
[出題者]
・問題を定義。実現したい機能、データ構造、制約条件等を簡潔に記載
・自分の解答例のコードを記載。この時点ではへぼいコードでも問題ないです
・自分の解答例への感想、改善要望等の記載推奨。工夫した点、不満な点(もう少しこうしたい)、こう書けるはずなのにエラーになったなど
[挑戦者]
・出題に対して「俺ならこう書く」というのをコードで回答
お約束
・コードで語ろう
投稿は実際に動作するコードを付けることを原則とします。
「この書き方は好き」とか複数の投稿済みコードに対して「こちらの方がSwiftらしい」みたいなことはコード無しでもOK。
他の人を批判する場合は必ずそれに相応する動作可能コードを付けること。
・コード無しでディスるだけの人は徹底無視
・投稿するコードはXCode8のプレイグラウンドまたは”IBM Swift Sandbox”にペーストしてそのまま動作すること
・環境は当面Swift3ベース、Swift Standard Library、Foundation Libraryの範囲とします。
異なる場合は動作環境を明記のこと。
評価基準
・swiftらしい書き方かどうか
簡潔性、直交性等
・意図が明確か
・短いは正義
例1
1から100までの奇数の2乗の合計を求める
let a = Array(1...100).filter{$0%2==1}.map{$0*$0}
let b = a.reduce(0){$0+$1}
1行で書きたかったがplaygroundがエラーになった
探検
詰めswift [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2016/10/17(月) 07:26:01.96ID:Cfbu+94c36デフォルトの名無しさん
2016/11/05(土) 17:15:15.00ID:i8zaQxL9 >>35
誤記が多いっす。まさかコピペじゃなくて手打ち?
import Foundation
func toHex<T:UnsignedInteger>(_ val:T)->String{
return String((
誤記が多いっす。まさかコピペじゃなくて手打ち?
import Foundation
func toHex<T:UnsignedInteger>(_ val:T)->String{
return String((
37デフォルトの名無しさん
2016/11/05(土) 17:18:16.62ID:i8zaQxL9 import Foundation
func toHex<T:UnsignedInteger>(_ val:T)->String{
return String(("0000000000000000"+String(val,radix:16)).characters.suffix(2*MemoryLayout<T>.size))
}
var d = Data(bytes: Array<UInt8>(0...250)) // making dummy data
for i in stride(from:0, to:d.count, by:16) {
print(toHex(UInt(i))+d[i...min(i+16,d.count)-1].reduce(":"){$0+" "+toHex($1)})
}
表示1行分ずつアクセスした方がif文とか不要で簡単
これでfor文内1行
あと、この方がキャラクター表示とかの拡張もやりやすいと思う
データはファイルアクセスが面倒臭かったので、コード内で連番で生成
func toHex<T:UnsignedInteger>(_ val:T)->String{
return String(("0000000000000000"+String(val,radix:16)).characters.suffix(2*MemoryLayout<T>.size))
}
var d = Data(bytes: Array<UInt8>(0...250)) // making dummy data
for i in stride(from:0, to:d.count, by:16) {
print(toHex(UInt(i))+d[i...min(i+16,d.count)-1].reduce(":"){$0+" "+toHex($1)})
}
表示1行分ずつアクセスした方がif文とか不要で簡単
これでfor文内1行
あと、この方がキャラクター表示とかの拡張もやりやすいと思う
データはファイルアクセスが面倒臭かったので、コード内で連番で生成
38デフォルトの名無しさん
2016/11/06(日) 10:21:57.41ID:fH2uMvYe2016/11/06(日) 13:03:30.79ID:UB8ayWaX
2016/11/07(月) 21:43:08.46ID:YiAcxNVS
なるほど
時々playgroundにペーストしても動かないコードがあると思った
時々playgroundにペーストしても動かないコードがあると思った
2016/11/08(火) 08:53:41.63ID:X5dOVA43
2016/11/09(水) 08:16:54.26ID:lBjkYqNx
なんだこと汚い字面は
2016/11/09(水) 13:32:04.04ID:WltZpkeV
>>1
例1は誰も具体的な型を指定していないので型推論に失敗する
全ての可能性を確認した後で配列の初期化子のRangeがカウンタブルなのを見て、整数型と推論したんじゃ無いかな?
だから、推論の段数が深くなるとコンパイラが根を上げる
Array<Int>または[Int]で要素の型を明示して配列を初期化してやれば、普通にコンパイルできる
let a = [Int](1...100).lazy.filter{$0%2==1}.map{$0*$0}.reduce(0){$0+$1}
最近見かけたlazyを入れて見た
いいものらしいが、実はまだ使い方がよくわかってない
例1は誰も具体的な型を指定していないので型推論に失敗する
全ての可能性を確認した後で配列の初期化子のRangeがカウンタブルなのを見て、整数型と推論したんじゃ無いかな?
だから、推論の段数が深くなるとコンパイラが根を上げる
Array<Int>または[Int]で要素の型を明示して配列を初期化してやれば、普通にコンパイルできる
let a = [Int](1...100).lazy.filter{$0%2==1}.map{$0*$0}.reduce(0){$0+$1}
最近見かけたlazyを入れて見た
いいものらしいが、実はまだ使い方がよくわかってない
2016/11/17(木) 23:03:23.42ID:nPsJ1cdA
>>22
バイトオーダー変換
func bth<T:UnsignedInteger>(_ v:T)->T{
switch v {
case let u as UInt16: return type(of:u).init(bigEndian:u) as! T
case let u as UInt32: return type(of:u).init(bigEndian:u) as! T
case let u as UInt64: return type(of:u).init(bigEndian:u) as! T
case let u as UInt : return type(of:u).init(bigEndian:u) as! T
default: return v
}
}
func lth<T:UnsignedInteger>(_ v:T)->T{
switch v {
case let u as UInt16: return type(of:u).init(littleEndian:u) as! T
case let u as UInt32: return type(of:u).init(littleEndian:u) as! T
case let u as UInt64: return type(of:u).init(littleEndian:u) as! T
case let u as UInt : return type(of:u).init(littleEndian:u) as! T
default: return v
}
}
ジェネリクスのめんどくさいところと、関数オーバーロードのメンテ性の悪さ
両方を兼ね備えてみました
無駄なプロトコル定義しなくて済むけどイマイチかっこいくないな
バイトオーダー変換
func bth<T:UnsignedInteger>(_ v:T)->T{
switch v {
case let u as UInt16: return type(of:u).init(bigEndian:u) as! T
case let u as UInt32: return type(of:u).init(bigEndian:u) as! T
case let u as UInt64: return type(of:u).init(bigEndian:u) as! T
case let u as UInt : return type(of:u).init(bigEndian:u) as! T
default: return v
}
}
func lth<T:UnsignedInteger>(_ v:T)->T{
switch v {
case let u as UInt16: return type(of:u).init(littleEndian:u) as! T
case let u as UInt32: return type(of:u).init(littleEndian:u) as! T
case let u as UInt64: return type(of:u).init(littleEndian:u) as! T
case let u as UInt : return type(of:u).init(littleEndian:u) as! T
default: return v
}
}
ジェネリクスのめんどくさいところと、関数オーバーロードのメンテ性の悪さ
両方を兼ね備えてみました
無駄なプロトコル定義しなくて済むけどイマイチかっこいくないな
2016/11/18(金) 12:36:36.52ID:slfuYiby
>>44
自己レス
これ、caseとdefaultを逆にして
UInt8だけを除け者にしようとしたら
defaultの中でエンディアン指定の初期化なんて知らないもんね
って言われた
そりゃそうなんだけどさ
エンディアン指定初期化をくくるプロトコルを標準で入れてくれ!!
IntegerTypeに入れてもいいぞ、8bitの時はそのままの値で
あとは、リフレクションで出来るかどうかだな
動的になっちゃうけど
Swiftのリフレクションて何ができるのかな?
自己レス
これ、caseとdefaultを逆にして
UInt8だけを除け者にしようとしたら
defaultの中でエンディアン指定の初期化なんて知らないもんね
って言われた
そりゃそうなんだけどさ
エンディアン指定初期化をくくるプロトコルを標準で入れてくれ!!
IntegerTypeに入れてもいいぞ、8bitの時はそのままの値で
あとは、リフレクションで出来るかどうかだな
動的になっちゃうけど
Swiftのリフレクションて何ができるのかな?
2016/12/12(月) 06:38:11.91ID:y+Doho0R
ズンドコしてみますた
import Foundation
func ズンドコ()->String{return arc4random_uniform(2)==0 ?
import Foundation
func ズンドコ()->String{return arc4random_uniform(2)==0 ?
2016/12/12(月) 06:39:28.62ID:y+Doho0R
ズンドコしてみますた
import Foundation
func ズンドコ()->String{return arc4random_uniform(2)==0 ? "ズン" : "ドコ"}
let 期待値="ズンズンズンズンドコ"
var 履歴=String()
while(true){
let 今回=ズンドコ()
print(今回)
履歴.append(今回)
if 履歴.hasSuffix(期待値){
print("キ・ヨ・シ・!")
break
}
}
http://swiftlang.ng.bluemix.net/#/repl/584dc645c1c4e155aaee6ac6
IBM Sandboxはarc4random系が無いみたいなのでrand()%2で代用
無限ループを乱数で抜ける&履歴切り捨てが無いので条件によっては運が悪いとクラッシュするかも
import Foundation
func ズンドコ()->String{return arc4random_uniform(2)==0 ? "ズン" : "ドコ"}
let 期待値="ズンズンズンズンドコ"
var 履歴=String()
while(true){
let 今回=ズンドコ()
print(今回)
履歴.append(今回)
if 履歴.hasSuffix(期待値){
print("キ・ヨ・シ・!")
break
}
}
http://swiftlang.ng.bluemix.net/#/repl/584dc645c1c4e155aaee6ac6
IBM Sandboxはarc4random系が無いみたいなのでrand()%2で代用
無限ループを乱数で抜ける&履歴切り捨てが無いので条件によっては運が悪いとクラッシュするかも
48デフォルトの名無しさん
2018/05/23(水) 22:41:40.90ID:Au5e7VGg 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
7YIPP
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
7YIPP
49デフォルトの名無しさん
2018/07/04(水) 23:25:26.40ID:gFgZc5FG MV8
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- サウナ夫婦死亡 非常ボタンの通報装置の電源入っておらず オーナー「今まで電源入れたことない」 [夜のけいちゃん★]
- 【野球】WBC、録画放送含め地上波中継なし (ネットフリックス) ★3 [阿弥陀ヶ峰★]
- ファミマ「遊べるコンビニ」へ ゲーム機を5000店舗に設置方針 IP強化 [七波羅探題★]
- 日中関係改善は「下手をすると10年かかる」 トランプを全面信頼できない高市官邸の苦悩★5 [ぐれ★]
- 牛丼チェーン店で5杯食べ終えて「支払えない」…詐欺容疑で逮捕の男「どうしても腹がすいて」 甲府 ★2 [蚤の市★]
- 一夜明けたら「その人は、ここにはいません」と牛久入管 パキスタン人男性を強制送還か 強圧的な対応の経緯:東京新聞 [少考さん★]
- 高市「何でみんな海外に行かないの…😭」パスポート現行より7000円引き下げて約9000円に [993451824]
- 【悲報】小林よしのり、辻元清美に電話『高市総理は危ない』 [834922174]
- 【動画】米卸「助けてー!倉庫が米で溢れてるの!もう無理…」→ガチのマジでとんでもない量がwwwwwwwwwwwwwwwwwwww [802034645]
- 煽り抜きで『進撃の巨人』って日本人の漫画史上でもトップレベルの傑作じゃねぇか? [339035499]
- 🏡要る?
- 茶ぁしばこうやぁ··· ( ¨̮ )︎︎𖠚ᐝ9
