From 3452a02f55e1f7d8b86c0d4d73cd9eeef264caf8 Mon Sep 17 00:00:00 2001 From: Anthony Shoumikhin Date: Mon, 29 Jun 2015 22:04:50 -0700 Subject: [PATCH 1/2] Added Swift sample Swift is still pretty tricky on console input, so here's a less or more standard way to read and parse some basic data types. --- ACC.swift | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 ACC.swift diff --git a/ACC.swift b/ACC.swift new file mode 100644 index 0000000..f3fc34d --- /dev/null +++ b/ACC.swift @@ -0,0 +1,32 @@ +import Foundation + +protocol __{};extension String:__{};extension Int:__{};extension Int64:__{};extension Double:__{} +class InputScanner { //based on https://github.com/shoumikhin/StreamScanner + let source = NSFileHandle.fileHandleWithStandardInput() + let delimiters = NSCharacterSet.whitespaceAndNewlineCharacterSet() + var buffer: NSScanner? + func read() -> T? { + if buffer == nil || buffer!.atEnd { + if let nextInput = NSString(data: source.availableData, encoding: NSUTF8StringEncoding) { + buffer = NSScanner(string: nextInput as String)}} + if buffer == nil { return nil } + var token: NSString? + if !buffer!.scanUpToCharactersFromSet(delimiters, intoString: &token) || token == nil { return nil } + buffer!.scanCharactersFromSet(delimiters, intoString: nil) + var ret: T? = nil + if ret is String? { return token as? T } + let scanner = NSScanner(string: token as! String) + switch ret { + case is Int? : var value: Int = 0; if scanner.scanInteger(&value) { ret = value as? T } + case is Int64? : var value: Int64 = 0; if scanner.scanLongLong(&value) { ret = value as? T } + case is Double? : var value: Double = 0; if scanner.scanDouble(&value) { ret = value as? T } + default : ret = nil} + return ret}} +let io = InputScanner() + +if + let a: Int = io.read(), + let b: Int = io.read() +{ + print("\(a + b)\n\(a * b)") +} From 73af35e3ee11c77378603038d54b1ad0b94fa53d Mon Sep 17 00:00:00 2001 From: Anthony Shoumikhin Date: Sun, 5 Feb 2017 16:55:58 -0800 Subject: [PATCH 2/2] Update ACC.swift --- ACC.swift | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/ACC.swift b/ACC.swift index f3fc34d..df115be 100644 --- a/ACC.swift +++ b/ACC.swift @@ -2,26 +2,26 @@ import Foundation protocol __{};extension String:__{};extension Int:__{};extension Int64:__{};extension Double:__{} class InputScanner { //based on https://github.com/shoumikhin/StreamScanner - let source = NSFileHandle.fileHandleWithStandardInput() - let delimiters = NSCharacterSet.whitespaceAndNewlineCharacterSet() - var buffer: NSScanner? - func read() -> T? { - if buffer == nil || buffer!.atEnd { - if let nextInput = NSString(data: source.availableData, encoding: NSUTF8StringEncoding) { - buffer = NSScanner(string: nextInput as String)}} - if buffer == nil { return nil } - var token: NSString? - if !buffer!.scanUpToCharactersFromSet(delimiters, intoString: &token) || token == nil { return nil } - buffer!.scanCharactersFromSet(delimiters, intoString: nil) - var ret: T? = nil - if ret is String? { return token as? T } - let scanner = NSScanner(string: token as! String) - switch ret { - case is Int? : var value: Int = 0; if scanner.scanInteger(&value) { ret = value as? T } - case is Int64? : var value: Int64 = 0; if scanner.scanLongLong(&value) { ret = value as? T } - case is Double? : var value: Double = 0; if scanner.scanDouble(&value) { ret = value as? T } - default : ret = nil} - return ret}} + let source = FileHandle.standardInput + let delimiters = CharacterSet.whitespacesAndNewlines + var buffer: Scanner? + func read() -> T? { + if buffer?.isAtEnd ?? true { + if let nextInput = String(data: source.availableData, encoding: .utf8) { + buffer = Scanner(string: nextInput) }} + if buffer == nil { return nil } + var token: NSString? + guard buffer?.scanUpToCharacters(from: delimiters, into: &token) ?? false, + let string = token as? String else { return nil } + buffer?.scanCharacters(from: delimiters, into: nil) + let scanner = Scanner(string: string) + switch T.self { + case is String.Type: return token as? T + case is Int.Type : var value: Int = 0; if scanner.scanInt(&value) { return value as? T } + case is Int64.Type : var value: Int64 = 0; if scanner.scanInt64(&value) { return value as? T } + case is Double.Type : var value: Double = 0; if scanner.scanDouble(&value) { return value as? T } + default : break } + return nil }} let io = InputScanner() if