任何人都可以解释如何在Objective-C中进行黑客等级测试。特别是“从STDIN读取输入。打印输出到STDOUT”部分
如何在objective-c中读取输入和输出?
到目前为止,我得到的是输入
NSFileHandle *fileHandler = [NSFileHandle fileHandleWithStandardInput];
NSData *inputData = [fileHandler availableData];
NSString *inputString = [[NSString alloc] initWithData:inputData encoding:NSUTF8StringEncoding];
但要打印输出,以下内容不会在HackerRank控制台上打印任何内容(但在Xcode控制台上完美运行)
NSFileHandle* fileHandler=[NSFileHandle fileHandleWithStandardOutput];
[fileHandler writeData: [formattedString dataUsingEncoding: NSNEXTSTEPStringEncoding]];
“从STDIN读取输入。将输出打印到STDOUT”的最简单方法是使用scanf和printf。
这是一个 样本模板 让你入门:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
int count;
scanf("%d", &count);
NSMutableArray *inputIntegers = [NSMutableArray new];
for (int i=0; i<count; i++) {
int inputElement;
scanf("%d", &inputElement);
[inputIntegers addObject:[NSNumber numberWithInt:inputElement]];
}
//to print a specific element:
printf("printing element 0: %d", (int)[inputIntegers[0] integerValue]);
[pool drain];
return 0;
}
在你开始这个旅程之前,先做一些事情:
- 确保禁用ARC(在构建设置中搜索CLANG_ENABLE_OBJC_ARC,并将其设置为NO)
- 避免使用 自。这是函数式编程。
- 使用C函数,而不是Objective-C方法,意思,使用
代替
- (NSInteger)sumOfNumbers : (NSInteger)a and:(NSInteger)b {
return a + b;
}
使用
int sumOfNumbers(int a, int b){
return a + b;
}
快乐的编程。
“从STDIN读取输入。将输出打印到STDOUT”的最简单方法是使用scanf和printf。
这是一个 样本模板 让你入门:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
int count;
scanf("%d", &count);
NSMutableArray *inputIntegers = [NSMutableArray new];
for (int i=0; i<count; i++) {
int inputElement;
scanf("%d", &inputElement);
[inputIntegers addObject:[NSNumber numberWithInt:inputElement]];
}
//to print a specific element:
printf("printing element 0: %d", (int)[inputIntegers[0] integerValue]);
[pool drain];
return 0;
}
在你开始这个旅程之前,先做一些事情:
- 确保禁用ARC(在构建设置中搜索CLANG_ENABLE_OBJC_ARC,并将其设置为NO)
- 避免使用 自。这是函数式编程。
- 使用C函数,而不是Objective-C方法,意思,使用
代替
- (NSInteger)sumOfNumbers : (NSInteger)a and:(NSInteger)b {
return a + b;
}
使用
int sumOfNumbers(int a, int b){
return a + b;
}
快乐的编程。
刚刚接受了其中一个测试,我选择立即退出main.m并进入Objective-C,如下所示:
#import <Foundation/Foundation.h>
//Objective-C helper class to take over from main.m
//.h
@interface MainClass : NSObject
+ (BOOL)startMain;
@end
//.m
@implementation MainClass
+ (BOOL)startMain {
//Read the STDIN here using the Objective-C wrapper methods
NSInteger n = [self readInt];
[self printInt:n];
NSArray *numbers = [self readIntArrayOfLength:n];
[self printIntNumberArray:numbers];
return YES;
}
+ (NSInteger)readInt {
int n;
scanf("%i",&n);
return n;
}
+ (NSArray *)readIntArrayOfLength:(NSInteger)len {
NSMutableArray *result = [NSMutableArray array];
for (int i =0; i < len; i++) {
[result addObject:[NSNumber numberWithInt:[self readInt]]];
}
return [result copy];
}
//Helpers to print an int and array of ints to STDOUT
+ (void)printInt:(NSInteger)i {
printf("%li\n",(long)i);
}
+ (void)printIntNumberArray:(NSArray *)array {
printf("[");
[array enumerateObjectsUsingBlock:^(NSNumber *n, NSUInteger idx, BOOL * _Nonnull stop) {
printf("%li",(long)[n integerValue]);
if (idx < array.count-1) {
printf(",");
}
}];
printf("]\n");
}
@end
//This is what will actually run when you hit "Run Code"
int main(int argc, char * argv[]) {
@autoreleasepool {
return [MainClass startMain];
}
}
现在,您可以使用Objective-C从这里做任何您喜欢的事情。
因此,在此示例中,示例输入为:
3
11 2 4
会产生这样的输出:
3
[11,2,4]
本身没有用,但说明了成功的阅读。
在Swift中它更简单,但是这里的代码完成同样的事情:
func readInt() -> Int? {
if let ln = readLine() {
return Int(ln)
}
return nil
}
func readIntArray() -> [Int]? {
if let ln = readLine() {
return ln.characters.split(" ").filter({ Int(String($0)) != nil }).map({ Int(String($0))! })
}
return nil
}
let n = readInt()!
let array = readIntArray()!
print(n)
print(array)
函数返回选项,因为即使您要强制解包输入,最好在代码中发生nil可选的崩溃,而不是样板。
#import <Foundation/Foundation.h>
int sum(int a, int b) {
return a + b;
}
int main() {
@autoreleasepool {
int T;
int A;
int B;
printf("Enter number of test cases: ");
scanf("%d", &T);
for (int i=0; i < T; i++) {
scanf("%d", &A);
scanf("%d", &B);
printf("%d\n", sum(A,B));
}
}
return 0;
}
应该这样做。
你的问题对于SO来说真的太笼统了,如果它很快关闭,也不要感到惊讶。一般来说,您需要询问具体问题,展示您尝试过的内容等等。但是,如果您只是提出一些提示让您前进......
您没有说明您是否已经是程序员或者特别是了解Objective-C,假设两者都是:
在Xcode中查看命令行工具项目类型
调查 NSFileHandle
及其方法,例如, fileHandleWithStandardInput
注意,您还可以使用C stdio函数,根据需要将C样式转换为Objective-C样式字符串等。
我创建了github repo,其中包含一些用objective-c编写的hackerrank问题解决方案。它处于起步阶段,也可以通过添加您的解决方案做出贡献。
HackerRank for Objective-C