Как решить проблемы HackerRank в Objective-C
Может кто-нибудь объяснить, как дать оценку ранга хакера в 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]];
Ответы
Ответ 1
Самый простой способ "Прочитать ввод 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)
- Избегайте использования self. Это функциональное программирование.
- Используйте функции C, а не методы Objective-C, значение, используйте
вместо
- (NSInteger)sumOfNumbers : (NSInteger)a and:(NSInteger)b {
return a + b;
}
использовать
int sumOfNumbers(int a, int b){
return a + b;
}
Счастливое программирование.
Ответ 2
Только что получил один из этих тестов, я решил немедленно выйти из 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)
Функции возвращают параметры, потому что, даже если вы собираетесь принудительно развернуть вход, лучше крах для нулевого опциона происходит в вашем коде, чем шаблон.
Ответ 3
#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;
}
Это должно быть сделано.
Ответ 4
Ваш вопрос действительно слишком общий для SO, не удивляйтесь, если он скоро будет закрыт. Вам нужно вообще задавать конкретные вопросы, показывать, что вы пробовали, и т.д. Но если вы сразу после нескольких советов, чтобы заставить вас идти...
Вы не говорите, являетесь ли вы уже программистом или знаете Objective-C в частности, предполагая, что оба:
-
В Xcode посмотрите тип проекта командной строки
-
Посмотрите NSFileHandle
и его методы, например. fileHandleWithStandardInput
-
Обратите внимание, что вы также можете использовать функции C stdio, преобразовывая C-стиль в строки Objective-C стилей и т.д. по мере необходимости.
Ответ 5
Я создал github repo с некоторыми решениями проблемы хакерранка, написанными в objective-c. Он находится на начальном этапе, не стесняйтесь внести свой вклад, добавив ваши решения.
HackerRank для Objective-C