Как решить проблемы 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