- 投稿日:2020-07-11T22:29:25+09:00
練習のためにSwiftをUdemyで勉強してみた(3日目)
3日目にやったこと
-APIを叩いてやってきたJSONが Dictionary だったので、ここから必要な要素を取り出す方法の検討
-色々ググってやりかたを検討した参考
https://qiita.com/t_punch/items/b5c3de88515f95f80195
https://qiita.com/tenten0213/items/707b1bf2cffb8d3a9700
https://qiita.com/ketancho/items/ad2eb36010fcac620425現時点での限界
構文なんかを学習せずにケースバイケースでやっていたので、当然ながら何もわからず。
一度しっかりと勉強してから戻ってきたい。ということで、今日はここまで。
以下は、色々模索する中で作ったViewController.siwftです。
当然動きません。
APIのキーは"hogehoge"にています。ViewController.siwftfunc CountCovid(){ let headers = [ "x-rapidapi-host": "covid-193.p.rapidapi.com", "x-rapidapi-key": "hogehoge" ] let request = NSMutableURLRequest(url: NSURL(string: "https://covid-193.p.rapidapi.com/statistics?country=japan")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error) } else { let httpResponse = response as? HTTPURLResponse //print(httpResponse) } do{ let jsonDataA = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.allowFragments)as! [String: Any] let responses = jsonDataA["response"] print(typeA) struct Test: Codable { let cases: String let continent: String let country: String let day: Date let deaths:String let population :Int let tests:String let time:Date } let decoder: JSONDecoder = JSONDecoder() do { let Testjson: Test = try decoder.decode(Test.self, from: jsonDataA) print(Testjson) } catch { print("error:", error.localizedDescription) } }catch { print(error) } }) dataTask.resume() } }明日やること
とりあえず、このJSON使うぜーってアプリ制作は一旦停止して、他のアプリ制作を優先します。
都度都度、構文についてもしっかりとドキュメント読みつつ学習していきます。
- 投稿日:2020-07-11T22:29:25+09:00
練習のためにSwiftをUdemyで勉強してみた(3日目)J
3日目にやったこと
-APIを叩いてやってきたJSONが Dictionary だったので、ここから必要な要素を取り出す方法の検討
-色々ググってやりかたを検討した参考
https://qiita.com/t_punch/items/b5c3de88515f95f80195
https://qiita.com/tenten0213/items/707b1bf2cffb8d3a9700
https://qiita.com/ketancho/items/ad2eb36010fcac620425現時点での限界
構文なんかを学習せずにケースバイケースでやっていたので、当然ながら何もわからず。
一度しっかりと勉強してから戻ってきたい。ということで、今日はここまで。
以下は、色々模索する中で作ったViewController.siwftです。
当然動きません。
APIのキーは"hogehoge"にています。ViewController.siwftfunc CountCovid(){ let headers = [ "x-rapidapi-host": "covid-193.p.rapidapi.com", "x-rapidapi-key": "hogehoge" ] let request = NSMutableURLRequest(url: NSURL(string: "https://covid-193.p.rapidapi.com/statistics?country=japan")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error) } else { let httpResponse = response as? HTTPURLResponse //print(httpResponse) } do{ let jsonDataA = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.allowFragments)as! [String: Any] let responses = jsonDataA["response"] print(typeA) struct Test: Codable { let cases: String let continent: String let country: String let day: Date let deaths:String let population :Int let tests:String let time:Date } let decoder: JSONDecoder = JSONDecoder() do { let Testjson: Test = try decoder.decode(Test.self, from: jsonDataA) print(Testjson) } catch { print("error:", error.localizedDescription) } }catch { print(error) } }) dataTask.resume() } }明日やること
とりあえず、このJSON使うぜーってアプリ制作は一旦停止して、他のアプリ制作を優先します。
都度都度、構文についてもしっかりとドキュメント読みつつ学習していきます。
- 投稿日:2020-07-11T20:43:28+09:00
メモ:Swift5で初回起動判定
n番煎じのネタだと思いますが、自分用のメモ。
func setup() { let visit = UserDefaults.standard.bool(forKey: "visit") if visit { //二回目以降 print("二回目以降") } else { //初回アクセス print("初回起動") } }
setup()
をAppDelegateとかSceneDelegateに追加するだけです。
- 投稿日:2020-07-11T19:51:56+09:00
AIZU ONLINE JUDGE の問題をSwiftでやってみた(プログラミング入門 文字列編)
トピック #9 文字列
AIZU ONLINE JUDGEの問題にSwiftで解答したものになります。競技プログラミングは普段やりませんので、こうしたほうが簡単!などがあればコメントで教えて下さい。
ブラウザでプログラミング・実行ができる「オンライン実行環境」paiza.IOでテスト出力が行えます8_A 単語の検索
問題
1つの単語 W と文章 T が与えられます。T の中にある W の数を出力するプログラムを作成して下さい。文章 T に含まれるスペースまたは改行で区切られた文字列を単語 Ti とします。すべての Ti において単語 W と同じになるものを数えて下さい。なお、大文字と小文字は区別しません。
解答let a = readLine() ?? "" var count = 0 while(true) { let b = readLine()! if b == "END_OF_TEXT" { break } let c = b.split(separator: " ") for i in c { if a == i { count += 1 } } } print(count)8_B シャッフル
問題
1つのアルファベットが描かれた n 枚のカードの山をシャッフルします。1回のシャッフルでは、下から h 枚のカードをまとめて取り出し、それを残ったカードの山の上に積み上げます。
カードの山は以下のように1つの文字列で与えられます。
abcdeefab
最初の文字が一番下にあるカード、最後の文字が一番上にあるカードを示しています。例えば、これを h が 4 でシャッフルすると、最初の4文字 abcd が、残りの文字 eefab の末尾へ連結されるので以下のようになります:
eefababcd
このシャッフルを何回か繰り返します。カードの山の最初の並び(文字列)と h の列を読み込み、最後の並び(文字列)を出力するプログラムを作成して下さい。
解答while(true) { var text = readLine()! if text == "-" { break } let number = Int(readLine()!)! for i in 0 ..< number { let j = Int(readLine()!)! let indexStart = text.startIndex let indexPoint = text.index(text.startIndex, offsetBy: j) let indexEnd = text.endIndex let shuffuleWordFront = text[indexStart ..< indexPoint] let shuffuleWordBack = text[indexPoint ..< indexEnd] text = String(shuffuleWordBack + shuffuleWordFront) } print(text) }8_C カードゲーム
問題
太郎と花子がカードゲームをする。二人はそれぞれn枚のカードを持っており、nターンの勝負を行う。各ターンではそれぞれ1枚ずつカードを出す。カードにはアルファベットからなる動物の名前が書かれており、辞書順で大きいものがそのターンの勝者となる。勝者には3ポイント、引き分けの場合にはそれぞれ1ポイントが加算される。太郎と花子の手持ちのカードの情報を読み込み、ゲーム終了後のそれぞれの得点を出力するプログラムを作成せよ。
Input
一行目にカードの数nが与えられる。続くn行に各ターンのカードの情報が与えられる。1つ目の文字列が太郎のカードに書かれている文字列、2つ目の文字列が花子のカードに書かれている文字列である。Output
1つ目の数字が太郎の得点、2つ目の数字が花子の得点として1行に出力せよ。2つの数字の間に1つの空白を出力せよ。
解答import Foundationfunc dictionary(_ word1: String, _ word2: String) -> String { let lowerWord1 = word1.lowercased().unicodeScalars.map({UInt32($0)}) let lowerWord2 = word2.lowercased().unicodeScalars.map({UInt32($0)}) let word1Size = lowerWord1.count let wordSize2 = lowerWord2.count var anserWord = String() var index = 0 while(true) { if index == word1Size { anserWord = word2 break } if index == wordSize2 { anserWord = word1 break } if lowerWord1[index] > lowerWord2[index] { anserWord = word2 break } else if lowerWord1[index] < lowerWord2[index] { anserWord = word1 break } else { index += 1 } } return anserWord } let a = Int(readLine()!)! var taroPoint = 0 var hanakoPoint = 0 for i in 0 ..< a { let words = readLine()!.split(separator: " ").map({String($0)}) let word1 = words[0] let word2 = words[1] let winWord = dictionary(word1, word2) if winWord == word1 && winWord != word2 { taroPoint += 3 } else if winWord == word2 && winWord != word1 { hanakoPoint += 3 } else { taroPoint += 1 hanakoPoint += 1 } } print(taroPoint, hanakoPoint)8_D 文字列変換
問題
長いので省略。詳しくはこちら
解答import Foundation func rev(_ str: String,_ s: Int, _ e: Int) -> String { let startIndex = str.index(str.startIndex, offsetBy: s) let endIndex = str.index(str.startIndex, offsetBy: e) let repStr = str[startIndex..<endIndex].reversed() let reStr = str[str.startIndex..<startIndex] + String(repStr) + str[endIndex..<str.endIndex] return String(reStr) } func rep(_ str: String,_ repStr: String,_ s: Int, _ e: Int) -> String { var str = str let start = str.index(str.startIndex, offsetBy: s) let end = str.index(str.startIndex, offsetBy: e) let replacedStr = str[start...end] str = str.replacingOccurrences(of: replacedStr, with: repStr) return str } func pri(_ str: String, _ s: Int, _ e: Int) -> Void { let start = str.index(str.startIndex, offsetBy: s) let end = str.index(str.startIndex, offsetBy: e) let priStr = str[start...end] print(priStr) } var text = readLine()! let n = Int(readLine()!)! for i in 0 ..< n { let a = readLine()!.split(separator: " ") switch a[0] { case "print": pri(text, Int(a[1])!, Int(a[2])!) case "replace": text = rep(text, String(a[3]), Int(a[1])!, Int(a[2])!) case "reverse": text = rev(text, Int(a[1])!, Int(a[2])!+1) default: break } }
- 投稿日:2020-07-11T14:53:25+09:00
辞書順でどちらが先に来るか判定する関数
追記: @kts_h さんより「文字列は単純に文字列を比較するだけで辞書順での比較になる」旨のコメントを頂きました。私の確認不足により混乱を招く記事を書いてしまい大変申し訳ありません。
文字列.
lowercased()
で文字列を全て小文字にすることができます。
文字列.unicordScalars.map({UInt32($0)})で文字列をUInt32型にして配列に格納することができます。func dictionary(_ word1: String, _ word2: String) -> String { let lowerWord1 = word1.lowercased().unicodeScalars.map({UInt32($0)}) let lowerWord2 = word2.lowercased().unicodeScalars.map({UInt32($0)}) var anserWord = String() var index = 0 while(true) { if lowerWord1[index] > lowerWord2[index] { anserWord = word2 break } else if lowerWord1[index] < lowerWord2[index] { anserWord = word1 break } else { index += 1 } } return anserWord }
- 投稿日:2020-07-11T14:50:24+09:00
Swift基礎用語まとめ
これまでなんとなくで理解していたSwiftの用語を備忘録としてまとめていきます。
この間、初めてレビューを受けて基本用語が理解できておらず、苦しかったため…
わからない単語は今後追記していく予定です。(多分)
間違っていることなどありましたら優しく教えてください
1.letとvarの違い
2.クロージャ
3.オプショナル
4.アンラップ
5.オプショナルバイディング
6.guard
7.didSet
8.lazy
9.lifecycle
10.[weak self]
11.参考文献1. letとvarの違い
let・・・一度初期化したら、後から書き換えられない変数に使う
var・・・後から書き換えることができる変数に使うまた、型を宣言しなくてもswift側で自動判別してくれる
var num = 10 num = 20 //書き換えられる let num2 = 3.14 num2 = 4.14 // エラーが発生する2. クロージャ
クロージャとは
クロージャとは実行可能なコードとそれが記述された箇所の環境を取り込んで、後から評価できるように保存したものです。
要するに再利用可能なひとまとまりな処理で、関数の一種です。{(仮引数:型)-> 戻り値の型 in クロージャ実行時の処理 }これが基本形です。サンプルを書くと
var c1 = { (x:Int) -> Int in x+1 } c1(3) //実行結果:4c1に代入されているものがクロージャのインスタンスで、代入の右辺はクロージャ式と呼ばれます。
クロージャ実行時の処理が複数行ある場合はブロックの中でreturn文を実行しなくてはいけません。
let c2 = { (a:Int, b:Int) -> Double in if b == 0 {return 0.0} //bが0の場合は0を返す return Double(a) / Double(b) //0以外の時は割り算した値を返す } print(c2(10,8)) // 実行結果 1.25クロージャと関数の違い
クロージャは関数と同じように実行できますが、関数と区別する必要はないそうです。基本的には、クロージャと関数は区別なく扱うことができますが、変数や定数に格納された関数の呼び出しには注意が必要です。
//TODO
3. オプショナル
オプショナル型は、通常の変数と異なり空の値(値が無い)状態を保持することができる変数です。
オプショナル型を宣言するときは、変数の型の後ろに?(クエスチョン)をつけます。
var a: Int = 0 var b: Int? = 10 b = nil //代入可能 a = nil //エラー発生また、初期値を設定しないとnilになります。
4. アンラップ
オプショナルInt型は整数かnilなのですが、Int型そのものではないため変数に代入や演算に使うことはできません。
var tax: Double? =1.10 var price = 1000 * tax //エラーになる上記のようにオプショナル型からデータを取り出すことをアンラップ(開示)と言います。アンラップのためにはオプショナル型に対して「!」という記号を使います。
var tax: Double? =1.10 var price = 1000 * tax!5. オプショナルバイディング
オプショナル型の式の値がnilではなかった場合、その値をif文のthenで使いたい時に用いるのがこのオプショナルバイディング(if-let文)です。オプショナル型に入っている値がnilかどうかわからない時に使います。
var tax: Double? =1.10 if let x = tax { var price = 1000 * tax } else { print("エラー発生") }オプショナル型がnilでないことをif文で確認後、taxを演算に使用しています。
そのため、オプショナルバイディングのあとはアンラップは不要です。6. guard
安全にデータを取り出す際にguard文を使います。
guard 条件 else { breakやreturn }条件が成立しなかった際にelse文が実行され、そのコードブロックから抜け出します。
チェックする値がオプショナル型である場合、nilチェックと同時にアンラップすることができ、そのアンラップされた変数をguard文の後も使うことができます。
func printMessage(message: String?) { guard let thisMessage = message else { //nilのチェックをし、同時にアンラップされた変数を使用可能にしている。 print("nilです") return } print(thisMessage) }7. didSet
Storyboardからボタンやテキストフィールドを生成した際に、部品をまとめて書くことができる。
@IBOutlet weak var emailTextField: UITextField! { didSet { emailTextField.placeholder = R.string.localizable.email() emailTextField.clearButtonMode = UITextField.ViewMode.always } }これによってviewDidLoad()をスリムに書くことができ、また、コードの可読性が上がる。
8. lazy
9. lifecycle
10. [weak self]
11. 参考文献
https://medium.com/@daikimochizuki/ios-swift-didsetでviewdidloadをスリム化しよう-867fe1e97ddc
https://www.sejuku.net/blog/32607
- 投稿日:2020-07-11T14:50:24+09:00
【初心者向け】Swift基礎用語まとめ
これまでなんとなくで理解していたSwiftの用語を備忘録としてまとめていきます。
この間、初めてレビューを受けて基本用語が理解できておらず、苦しかったため…
わからない単語は今後追記していく予定です。(多分)
間違っていることなどありましたら優しく教えてください
1.letとvarの違い
2.クロージャ
3.オプショナル
4.アンラップ
5.オプショナルバイディング
6.guard
7.didSet
8.lazy
9.lifecycle
10.[weak self]
11.参考文献1. letとvarの違い
let・・・一度初期化したら、後から書き換えられない変数に使う
var・・・後から書き換えることができる変数に使うまた、型を宣言しなくてもswift側で自動判別してくれる
var num = 10 num = 20 //書き換えられる let num2 = 3.14 num2 = 4.14 // エラーが発生する2. クロージャ
クロージャとは
クロージャとは実行可能なコードとそれが記述された箇所の環境を取り込んで、後から評価できるように保存したものです。
要するに再利用可能なひとまとまりな処理で、関数の一種です。{(仮引数:型)-> 戻り値の型 in クロージャ実行時の処理 }これが基本形です。サンプルを書くと
var c1 = { (x:Int) -> Int in x+1 } c1(3) //実行結果:4c1に代入されているものがクロージャのインスタンスで、代入の右辺はクロージャ式と呼ばれます。
クロージャ実行時の処理が複数行ある場合はブロックの中でreturn文を実行しなくてはいけません。
let c2 = { (a:Int, b:Int) -> Double in if b == 0 {return 0.0} //bが0の場合は0を返す return Double(a) / Double(b) //0以外の時は割り算した値を返す } print(c2(10,8)) // 実行結果 1.25クロージャと関数の違い
クロージャは関数と同じように実行できますが、関数と区別する必要はないそうです。基本的には、クロージャと関数は区別なく扱うことができますが、変数や定数に格納された関数の呼び出しには注意が必要です。
//TODO
3. オプショナル
オプショナル型は、通常の変数と異なり空の値(値が無い)状態を保持することができる変数です。
オプショナル型を宣言するときは、変数の型の後ろに?(クエスチョン)をつけます。
var a: Int = 0 var b: Int? = 10 b = nil //代入可能 a = nil //エラー発生また、初期値を設定しないとnilになります。
4. アンラップ
オプショナルInt型は整数かnilなのですが、Int型そのものではないため変数に代入や演算に使うことはできません。
var tax: Double? =1.10 var price = 1000 * tax //エラーになる上記のようにオプショナル型からデータを取り出すことをアンラップ(開示)と言います。アンラップのためにはオプショナル型に対して「!」という記号を使います。
var tax: Double? =1.10 var price = 1000 * tax!5. オプショナルバイディング
オプショナル型の式の値がnilではなかった場合、その値をif文のthenで使いたい時に用いるのがこのオプショナルバイディング(if-let文)です。オプショナル型に入っている値がnilかどうかわからない時に使います。
var tax: Double? =1.10 if let x = tax { var price = 1000 * tax } else { print("エラー発生") }オプショナル型がnilでないことをif文で確認後、taxを演算に使用しています。
そのため、オプショナルバイディングのあとはアンラップは不要です。6. guard
安全にデータを取り出す際にguard文を使います。
guard 条件 else { breakやreturn }条件が成立しなかった際にelse文が実行され、そのコードブロックから抜け出します。
チェックする値がオプショナル型である場合、nilチェックと同時にアンラップすることができ、そのアンラップされた変数をguard文の後も使うことができます。
func printMessage(message: String?) { guard let thisMessage = message else { //nilのチェックをし、同時にアンラップされた変数を使用可能にしている。 print("nilです") return } print(thisMessage) }7. didSet
Storyboardからボタンやテキストフィールドを生成した際に、部品をまとめて書くことができる。
@IBOutlet weak var emailTextField: UITextField! { didSet { emailTextField.placeholder = R.string.localizable.email() emailTextField.clearButtonMode = UITextField.ViewMode.always } }これによってviewDidLoad()をスリムに書くことができ、また、コードの可読性が上がる。
8. lazy
9. lifecycle
10. [weak self]
11. 参考文献
https://medium.com/@daikimochizuki/ios-swift-didsetでviewdidloadをスリム化しよう-867fe1e97ddc
https://www.sejuku.net/blog/32607
- 投稿日:2020-07-11T13:22:25+09:00
ViewController を閉じる dismiss
- 投稿日:2020-07-11T12:08:37+09:00
AIZU ONLINE JUDGE の問題をSwiftでやってみた(プログラミング入門 文字編)
トピック #8 文字
AIZU ONLINE JUDGEの問題にSwiftで解答したものになります。競技プログラミングは普段やりませんので、こうしたほうが簡単!などがあればコメントで教えて下さい。
ブラウザでプログラミング・実行ができる「オンライン実行環境」paiza.IOでテスト出力が行えます8_A 大文字と小文字の入れ替え
問題
大文字を小文字に、小文字を大文字にして下さい
解答let a = readLine()! func convert(_ text: String) -> String { var returnText = "" for i in text { if i.isUppercase { returnText.append(i.lowercased()) } else { returnText.append(i.uppercased()) } } return returnText } print(convert(a))8_B 数字の和
問題
複数のデータセットが入力として与えられます。各データセットは1つの整数 x を含む1行で与えられます。x は 1000 桁以下の整数です。
x が 0 のとき入力の終わりとします。このデータセットに対する出力を行ってはいけません。
解答
while(true) { let a = readLine()! if Int(a) == 0{ break } var sum = 0 let b = Array(a).compactMap({Int(String($0))}) for i in b { sum += i } print(sum) }8_C 文字のカウント
問題
与えられた英文に含まれる、各アルファベットの数を数えるプログラムを作成して下さい。 なお、小文字と大文字は区別しません。
解答let lowChaArr = (97...122).map{String(Character(UnicodeScalar($0)!))} var countArr = [Int](repeating: 0, count: 26) var arrLowNum = 0 let a = readLine()!.lowercased() for i in a { var arrUpNum = 0 for j in lowChaArr { if String(i) == j { countArr[arrUpNum] += 1 } arrUpNum += 1 } } for i in 0 ..< 26{ print("\(lowChaArr[i]) : \(countArr[i])") }8_D リング
問題
リング状の文字列$s$の任意の位置から、時計回りに連続した文字をいくつか選んで文字列$p$が作れるかを判定するプログラムを作成しなさい。
解答
import Foundation let ringWords = readLine()! let searchWord = readLine()! let ringsWordCount = ringWords.count let ringsWordIndexStart = ringWords.index(ringWords.startIndex, offsetBy: 0) let ringsWordIndexHalf = ringWords.index(ringWords.startIndex, offsetBy: ringsWordCount/2) let ringsWordIndexEnd = ringWords.index(ringWords.startIndex, offsetBy: ringsWordCount) let frontWords = ringWords[ringsWordIndexStart..<ringsWordIndexHalf] let backWords = ringWords[ringsWordIndexHalf..<ringsWordIndexEnd] let convertedRingWords = backWords+frontWords if ringWords.contains(searchWord) || convertedRingWords.contains(searchWord) { print("Yes") } else { print("No") }
- 投稿日:2020-07-11T11:35:51+09:00
AIZU ONLINE JUDGE の問題をSwiftでやってみた(プログラミング入門 構造化プログラムⅡ編)
トピック #7 構造化プログラミングⅡ
AIZU ONLINE JUDGEの問題にSwiftで解答したものになります。競技プログラミングは普段やりませんので、こうしたほうが簡単!などがあればコメントで教えて下さい。
ブラウザでプログラミング・実行ができる「オンライン実行環境」paiza.IOでテスト出力が行えます。7_A 成績
問題
あなたの課題は、あるクラスの数学の成績を付けるプログラムを作成することです。プログラムは複数の学生のテストの点数を読み込みます。テストの点数は、中間試験の点数 m、期末試験の点数 f、再試験の点数 r で構成されています。
中間試験と期末試験は 50 点満点(m, f ≤ 50)、再試験は 100 点満点 (r ≤ 100)です。試験を受けていない場合は点数を -1 とします以下の手順で成績が付けられます:中間試験、期末試験のいずれかを欠席した場合成績は F。
中間試験と期末試験の合計点数が 80 以上ならば成績は A 。
中間試験と期末試験の合計点数が 65 以上 80 未満ならば成績は B。
中間試験と期末試験の合計点数が 50 以上 65 未満ならば成績は C。
中間試験と期末試験の合計点数が 30 以上 50 未満ならば成績は D。 ただし、再試験の点数が 50 以上ならば成績は C。
中間試験と期末試験の合計点数が 30 未満ならば成績は F。
解答while(true) { let a = readLine()!.split(separator: " ").map({Int($0)!}) if a[0] == -1 && a[1] == -1 && a[2] == -1 { break } if a[0] == -1 || a[1] == -1 { print("F") } else { var sum = a[0] + a[1] switch sum { case 80 ... 100: print("A") case 65 ..< 80: print("B") case 50 ..< 65: print("C") case 30 ..< 50: if a[2] >= 50 { print("C") } else { print("D") } default: print("F") } } }7_B 組み合わせの数
問題
1 から n までの数の中から、重複無しで3つの数を選びそれらの合計が x となる組み合わせの数を求めるプログラムを作成して下さい。例えば、1 から 5 までの数から3つを選んでそれらの合計が 9 となる組み合わせは、
1 + 3 + 5 = 9
2 + 3 + 4 = 9
の2通りがあります。
解答let a = readLine()!.split(separator: " ").map({Int($0)!}) for i in 1 ... a[0] { for j in i ... a[0]{ for k in i ... a[0]{ if i + j + k == a[1] && (i != j) && (j != k) && (i != k) && (i < j) && (j < k) { print(i,j,k) } } } }7_C 表計算
問題
表計算を行う簡単なプログラムを作成します。表の行数rと列数c、r × c の要素を持つ表を読み込んで、各行と列の合計を挿入した新しい表を出力するプログラムを作成して下さい。
入力
4 5
1 1 3 4 5
2 2 2 4 5
3 3 0 1 1
2 3 4 4 6出力
1 1 3 4 5 14
2 2 2 4 5 15
3 3 0 1 1 8
2 3 4 4 6 19
8 9 9 13 17 56
解答let a = readLine()!.split(separator: " ").map({Int($0)!}) var arr = [[Int]]() var q = [Int](repeating: 0, count: a[1] + 1) for i in 0 ..< a[0] { arr.append(readLine()!.split(separator: " ").map({Int($0)!})) } var b = { (arr: [Int]) -> Int in var sum = 0 for i in 0 ..< arr.count { sum += arr[i] } return sum } for i in 0 ..< a[0] { arr[i].append(b(arr[i])) } for i in 0 ..< arr.count { for j in 0 ..< arr[i].count { q[j] += arr[i][j] } } arr.append(q) for i in arr { for j in i { print(j, terminator: " ") } print("\n") }7_D 行列の積
問題
$n\times m$の行列$A$と$m\times l$の行列$B$を入力し、それらの積である$n\times l$の行列$C$を出力するプログラムを作成して下さい。
解答
let a = readLine()!.split(separator: " ").map({Int($0)!}) var matrix1 = [[Int]](repeatElement([Int](repeatElement(0, count: a[1])), count: a[0])) var matrix2 = [[Int]](repeatElement([Int](repeatElement(0, count: a[2])), count: a[1])) for i in 0 ..< a[0] { let b = readLine()!.split(separator: " ").map({Int($0)!}) for j in 0 ..< a[1] { matrix1[i][j] = b[j] } } for i in 0 ..< a[1] { let c = readLine()!.split(separator: " ").map({Int($0)!}) for j in 0 ..< a[2] { matrix2[i][j] = c[j] } } func matrixtime(_ matrix1: [[Int]], _ matrix2: [[Int]]) -> [[Int]] { var solutionMatrix = [[Int]](repeating: [Int](repeating: 0, count: matrix2[0].count), count: matrix1.count) for i in 0 ..< matrix1.count { for j in 0 ..< matrix2[0].count { for k in 0 ..< matrix1[0].count { solutionMatrix[i][j] += matrix1[i][k] * matrix2[k][j] } } } return solutionMatrix } print(matrixtime(matrix1, matrix2))