20200711のSwiftに関する記事は10件です。

練習のために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.siwft
   func 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使うぜーってアプリ制作は一旦停止して、他のアプリ制作を優先します。
都度都度、構文についてもしっかりとドキュメント読みつつ学習していきます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

練習のために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.siwft
   func 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使うぜーってアプリ制作は一旦停止して、他のアプリ制作を優先します。
都度都度、構文についてもしっかりとドキュメント読みつつ学習していきます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

メモ:Swift5で初回起動判定

n番煎じのネタだと思いますが、自分用のメモ。

func setup() {
    let visit = UserDefaults.standard.bool(forKey: "visit")
    if visit {
        //二回目以降
        print("二回目以降")
    } else {
        //初回アクセス
        print("初回起動")
    }
}

setup()をAppDelegateとかSceneDelegateに追加するだけです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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
    }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

辞書順でどちらが先に来るか判定する関数

追記: @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
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Swift基礎用語まとめ

これまでなんとなくで理解していたSwiftの用語を備忘録としてまとめていきます。

この間、初めてレビューを受けて基本用語が理解できておらず、苦しかったため…:bow:

わからない単語は今後追記していく予定です。(多分)

間違っていることなどありましたら優しく教えてください:bow:

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)   //実行結果:4

c1に代入されているものがクロージャのインスタンスで、代入の右辺はクロージャ式と呼ばれます。

クロージャ実行時の処理が複数行ある場合はブロックの中で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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【初心者向け】Swift基礎用語まとめ

これまでなんとなくで理解していたSwiftの用語を備忘録としてまとめていきます。

この間、初めてレビューを受けて基本用語が理解できておらず、苦しかったため…:bow:

わからない単語は今後追記していく予定です。(多分)

間違っていることなどありましたら優しく教えてください:bow:

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)   //実行結果:4

c1に代入されているものがクロージャのインスタンスで、代入の右辺はクロージャ式と呼ばれます。

クロージャ実行時の処理が複数行ある場合はブロックの中で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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ViewController を閉じる dismiss

ViewController を dismiss 処理

qiita.rb
    @IBAction func backButton(_ sender: Any) {
        self.dismiss(animated: true, completion: nil)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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")
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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))
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む