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+94c2デフォルトの名無しさん
2016/10/17(月) 07:26:43.92ID:Cfbu+94c 例2
汎用的なエンディアン変換
protocol BoCInititializable {
associatedtype BaseType
init(littleEndian: BaseType)
init(bigEndian: BaseType)
}
extension UInt16: BoCInititializable{}
extension UInt32: BoCInititializable{}
extension UInt64: BoCInititializable{}
extension UInt: BoCInititializable{}
func bth<T:BoCInititializable>(_ v:T)->T {
return T(bigEndian: v as! T.BaseType)
}
func lth<T:BoCInititializable>(_ v:T)->T {
return T(littleEndian: v as! T.BaseType)
}
print( bth(UInt32(1)) )
もう少し簡潔に書きたいがunsignedintegerとかでは上手くかけなかった
汎用的なエンディアン変換
protocol BoCInititializable {
associatedtype BaseType
init(littleEndian: BaseType)
init(bigEndian: BaseType)
}
extension UInt16: BoCInititializable{}
extension UInt32: BoCInititializable{}
extension UInt64: BoCInititializable{}
extension UInt: BoCInititializable{}
func bth<T:BoCInititializable>(_ v:T)->T {
return T(bigEndian: v as! T.BaseType)
}
func lth<T:BoCInititializable>(_ v:T)->T {
return T(littleEndian: v as! T.BaseType)
}
print( bth(UInt32(1)) )
もう少し簡潔に書きたいがunsignedintegerとかでは上手くかけなかった
2016/10/17(月) 23:41:21.25ID:OlRB0UDA
2016/10/18(火) 01:45:25.16ID:j9lDw9lO
アイちゃんもSwift始めたの?
2016/10/18(火) 09:12:27.14ID:iz/6UNT/
>>3
わかりやすけど、ダセーよ
わかりやすけど、ダセーよ
2016/10/18(火) 12:34:25.63ID:XNeT8UDO
2016/10/19(水) 01:22:25.18ID:/23Ql8Gg
2016/10/19(水) 08:03:16.58ID:dprVW7hZ
うるせーだまれ
2016/10/19(水) 12:38:30.77ID:opBPzs7C
>>1
Arrayとfilterはstrideで、mapとreduceはreduce一発で書けるから
let a=stride(from:1, to:100, by:2).reduce(0){$0+$1*$1}
でいかが?
コンパイラに直値166650に置き換えられちゃうだろうけど
Arrayとfilterはstrideで、mapとreduceはreduce一発で書けるから
let a=stride(from:1, to:100, by:2).reduce(0){$0+$1*$1}
でいかが?
コンパイラに直値166650に置き換えられちゃうだろうけど
2016/10/19(水) 22:05:18.41ID:qqi+vVKd
可読性が高いSwiftねぇ…。
2016/10/19(水) 22:14:25.11ID:5poS2Bi0
$が目障りなのはきっとSwiftのせい
このモダン言語どこに向かってるんだ
このモダン言語どこに向かってるんだ
2016/10/20(木) 18:00:58.36ID:cE7OLI6Z
引数のビット長に応じた0詰を行う16進変換
import Foundation
func toHex<T:UnsignedInteger>(_ val:T)->String {
let hexLen=MemoryLayout<T>.size * 2
return String(format:"%0\(hexLen)x", val as! CVarArg)
}
print( toHex(UInt16(253)) )
コードから意図が読み取れる気がしない、、、
もう少しわかりやすい書き方ないかなぁ?
import Foundation
func toHex<T:UnsignedInteger>(_ val:T)->String {
let hexLen=MemoryLayout<T>.size * 2
return String(format:"%0\(hexLen)x", val as! CVarArg)
}
print( toHex(UInt16(253)) )
コードから意図が読み取れる気がしない、、、
もう少しわかりやすい書き方ないかなぁ?
2016/10/20(木) 18:06:16.70ID:+R+Vhl1P
関数名が悪いのと、ドキュメントコメントがないのが悪い
と見も蓋もないこと言ってみるテスト
可読性無視して如何に短くかけるか挑戦しようぜ
と見も蓋もないこと言ってみるテスト
可読性無視して如何に短くかけるか挑戦しようぜ
14デフォルトの名無しさん
2016/10/21(金) 00:07:12.34ID:l5tk1soN >>12
%xは32ビットの変換指定子なのでこのままだと64ビットの時上手く動かないよ
%llxを使おう←とりあえず動くと思う
厳密にやるなら%hhx、%hx、%lx、%llxを使い分けなきゃいけない
import Foundation
func toHex<T:UnsignedInteger>(_ val:T)->String {
let byteLen=MemoryLayout<T>.size
let fmtStr = [1:
%xは32ビットの変換指定子なのでこのままだと64ビットの時上手く動かないよ
%llxを使おう←とりあえず動くと思う
厳密にやるなら%hhx、%hx、%lx、%llxを使い分けなきゃいけない
import Foundation
func toHex<T:UnsignedInteger>(_ val:T)->String {
let byteLen=MemoryLayout<T>.size
let fmtStr = [1:
15デフォルトの名無しさん
2016/10/21(金) 00:09:13.94ID:l5tk1soN なんか上手くかけなかった
テスト
let fmtStr = [1:"%02hhx",2:"%04hx",4:"%08lx",8:"%016llx"]
テストここまで
テスト
let fmtStr = [1:"%02hhx",2:"%04hx",4:"%08lx",8:"%016llx"]
テストここまで
16デフォルトの名無しさん
2016/10/21(金) 00:10:44.13ID:l5tk1soN 再投稿
import Foundation
func toHex<T:UnsignedInteger>(_ val:T)->String {
let byteLen=MemoryLayout<T>.size
let fmtStr = [1:"%02hhx",2:"%04hx",4:"%08lx",8:"%016llx"]
return String(format:fmtStr[byteLen]!, val as! CVarArg)
}
print( toHex(UInt8(0x0f)) )
print( toHex(UInt16(0x01ff)) )
print( toHex(UInt32(0x010000ff)) )
print( toHex(UInt64(0x01000000000000ff)) )
import Foundation
func toHex<T:UnsignedInteger>(_ val:T)->String {
let byteLen=MemoryLayout<T>.size
let fmtStr = [1:"%02hhx",2:"%04hx",4:"%08lx",8:"%016llx"]
return String(format:fmtStr[byteLen]!, val as! CVarArg)
}
print( toHex(UInt8(0x0f)) )
print( toHex(UInt16(0x01ff)) )
print( toHex(UInt32(0x010000ff)) )
print( toHex(UInt64(0x01000000000000ff)) )
17デフォルトの名無しさん
2016/10/21(金) 00:16:57.99ID:l5tk1soN18デフォルトの名無しさん
2016/10/21(金) 00:46:56.25ID:l5tk1soN >>16
func toHex<T:UnsignedInteger>(_ intVal:T)->String{
let byteLen=MemoryLayout<T>.size
let hexStr=String(intVal, radix:16)
return String(repeating:"0",count:byteLen*2-hexStr.characters.count)+hexStr
}
こっちの方がミスらないと思う
Foundationのimportも要らないし
しかしString.padding()って頭詰には使えないのか?使えたらもう少し綺麗に書けるのだけど
func toHex<T:UnsignedInteger>(_ intVal:T)->String{
let byteLen=MemoryLayout<T>.size
let hexStr=String(intVal, radix:16)
return String(repeating:"0",count:byteLen*2-hexStr.characters.count)+hexStr
}
こっちの方がミスらないと思う
Foundationのimportも要らないし
しかしString.padding()って頭詰には使えないのか?使えたらもう少し綺麗に書けるのだけど
2016/10/21(金) 22:02:05.01ID:TQyRjkJz
>>18
func toHex<T:UnsignedInteger>(_ val:T)->String{
return String(("0000000000000000"+String(val,radix:16)).characters.suffix(2*MemoryLayout<T>.size))
}
func toHex<T:UnsignedInteger>(_ val:T)->String{
return String(("0000000000000000"+String(val,radix:16)).characters.suffix(2*MemoryLayout<T>.size))
}
2016/10/22(土) 10:03:25.21ID:KGTzT2v9
Swift読みにく...
2016/10/22(土) 11:44:17.58ID:2eM+QRLE
Swiftって他と違う感を無駄に追い求めすぎて読みにくいよな
べジータ親父ラットナーのセンスが無さすぎ
べジータ親父ラットナーのセンスが無さすぎ
22デフォルトの名無しさん
2016/10/24(月) 14:52:18.58ID:H58quMwb >>2
頑張ってジェネリクスにするよりも関数オーバーロードの方が見かけはシンプルに書けるよ
ただ、バイトオーダー変換が必要な処理は強烈にビット長を意識するべき処理な訳で
そこをビット長汎用化する意味があるのかという所の方が問題なきがする
ま「詰めSwift」と言うお遊びの中での解の一つとして
func bth(_ v:UInt16)->UInt16{return UInt16(bigEndian: v)}
func bth(_ v:UInt32)->UInt32{return UInt32(bigEndian: v)}
func bth(_ v:UInt64)->UInt64{return UInt64(bigEndian: v)}
func bth(_ v:UInt)->UInt{return UInt(bigEndian: v)}
func lth(_ v:UInt16)->UInt16{return UInt16(littleEndian: v)}
func lth(_ v:UInt32)->UInt32{return UInt32(littleEndian: v)}
func lth(_ v:UInt64)->UInt64{return UInt64(littleEndian: v)}
func lth(_ v:UInt)->UInt{return UInt(littleEndian: v)}
頑張ってジェネリクスにするよりも関数オーバーロードの方が見かけはシンプルに書けるよ
ただ、バイトオーダー変換が必要な処理は強烈にビット長を意識するべき処理な訳で
そこをビット長汎用化する意味があるのかという所の方が問題なきがする
ま「詰めSwift」と言うお遊びの中での解の一つとして
func bth(_ v:UInt16)->UInt16{return UInt16(bigEndian: v)}
func bth(_ v:UInt32)->UInt32{return UInt32(bigEndian: v)}
func bth(_ v:UInt64)->UInt64{return UInt64(bigEndian: v)}
func bth(_ v:UInt)->UInt{return UInt(bigEndian: v)}
func lth(_ v:UInt16)->UInt16{return UInt16(littleEndian: v)}
func lth(_ v:UInt32)->UInt32{return UInt32(littleEndian: v)}
func lth(_ v:UInt64)->UInt64{return UInt64(littleEndian: v)}
func lth(_ v:UInt)->UInt{return UInt(littleEndian: v)}
2016/10/25(火) 07:22:49.90ID:TTNTJAzx
Swiftのfuncの記法、ほんっときったねぇよな
読みにくすぎてセンスを全く感じない
読みにくすぎてセンスを全く感じない
2016/10/25(火) 11:46:02.76ID:TDuxU4Gc
別にこのような記法で書く必然性はないわけだが…
読みにくいって言ってる奴は、お前が思う普通に書けばいいわけで
バカの子なの?
読みにくいって言ってる奴は、お前が思う普通に書けばいいわけで
バカの子なの?
2016/10/26(水) 02:45:17.64ID:NtHQYyX3
2016/10/26(水) 20:49:07.50ID:Bins4IAo
>>25
例えばどんなとこが気持ち悪いのかがわからん
例えばどんなとこが気持ち悪いのかがわからん
2016/10/26(水) 22:07:07.78ID:xhdxFtWZ
例えばその例で言うとラベル付き引数funcの汚さとか
ただてさえ変数型が:後置でカオスなのにさらにアンダースコアで省略とか複合するとクソさが増す
ObjCはあくまでセレクタ名をラベルとして使ってるシンプルさとは可読性が雲泥の差
ラットナーのセンスがないとしか言いようがない
ただてさえ変数型が:後置でカオスなのにさらにアンダースコアで省略とか複合するとクソさが増す
ObjCはあくまでセレクタ名をラベルとして使ってるシンプルさとは可読性が雲泥の差
ラットナーのセンスがないとしか言いようがない
2016/10/26(水) 23:14:32.89ID:Bins4IAo
それはお前の好き嫌いとか慣れの問題だろ
別に見づらくねーし、省略はいやなら使わなければ良い
つーかスレチだからアンチスレで熱く語ってくれよ
別に見づらくねーし、省略はいやなら使わなければ良い
つーかスレチだからアンチスレで熱く語ってくれよ
29デフォルトの名無しさん
2016/10/27(木) 07:08:22.73ID:Ss0lD5+4 新しい言語を覚えたらまずハノイの塔をやってみるといいよ
ってじっちゃが言ってた
swiftの値付きenumが割と好き
enum pole:String{
case a =
ってじっちゃが言ってた
swiftの値付きenumが割と好き
enum pole:String{
case a =
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- サウナ夫婦死亡 非常ボタンの通報装置の電源入っておらず オーナー「今まで電源入れたことない」 [夜のけいちゃん★]
- 【野球】WBC、録画放送含め地上波中継なし (ネットフリックス) ★3 [阿弥陀ヶ峰★]
- 日中関係改善は「下手をすると10年かかる」 トランプを全面信頼できない高市官邸の苦悩★5 [ぐれ★]
- ファミマ「遊べるコンビニ」へ ゲーム機を5000店舗に設置方針 IP強化 [七波羅探題★]
- 牛丼チェーン店で5杯食べ終えて「支払えない」…詐欺容疑で逮捕の男「どうしても腹がすいて」 甲府 ★2 [蚤の市★]
- 一夜明けたら「その人は、ここにはいません」と牛久入管 パキスタン人男性を強制送還か 強圧的な対応の経緯:東京新聞 [少考さん★]
- 世界都市ランキング、2位東京、18位大阪、40位福岡!円安効果 [219241683]
- 【悲報】鈴木農水大臣JAと癒着してた模様😢 [993451824]
- 🏡要る?
- 煽り抜きで『進撃の巨人』って日本人の漫画史上でもトップレベルの傑作じゃねぇか? [339035499]
- 中部空港(名古屋)、頼みの中国便が大阪万博の影響で大苦戦、今年度旅客需要を120万人も下方修正、高市有事後、更に減便へ [943688309]
- 今後生きてても理解できないであろう特殊性癖ってあるよな
