2014-12-22 16 views
11

Czy ktoś może wyjaśnić, jak dać test rangi hakera w celu-C. Zwłaszcza część "Odczytaj dane wejściowe od STDIN, wypisz wyjście do STDOUT"Jak rozwiązywać problemy HackerRank w Objective-C

Jak odczytać wejście i wyjście w obiektyw-c?

Co mam tak daleko jest dostać wejście jak

NSFileHandle *fileHandler = [NSFileHandle fileHandleWithStandardInput]; 
NSData *inputData = [fileHandler availableData]; 
NSString *inputString = [[NSString alloc] initWithData:inputData encoding:NSUTF8StringEncoding]; 

Ale wydrukować wyjście, po nie drukuje niczego na konsoli HackerRank (ale działa bezbłędnie na konsoli Xcode)

NSFileHandle* fileHandler=[NSFileHandle fileHandleWithStandardOutput]; 
[fileHandler writeData: [formattedString dataUsingEncoding: NSNEXTSTEPStringEncoding]]; 

Odpowiedz

11

Najprostszym sposobem na "odczytanie wejścia z STDIN, wyjście wydruku do STDOUT" byłoby użycie scanf i printf.
Oto szablon próbka możesz zacząć:

#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; 
} 

Zanim zastosuje się szansę na tej drodze, kilka rzeczy:

  • Upewnij ARC jest wyłączony (poszukiwanie CLANG_ENABLE_OBJC_ARC w ustawieniach kompilacji i ustaw na NIE)
  • Unikaj używania self. To jest programowanie funkcjonalne.
  • funkcje korzystają C, a nie metody Cel-C, co oznacza, użyć

zamiast

- (NSInteger)sumOfNumbers : (NSInteger)a and:(NSInteger)b { 
    return a + b; 
} 

stosowania

int sumOfNumbers(int a, int b){ 

    return a + b; 
} 

okazji programowania.

+1

Jestem całkowicie zdezorientowany, jak rozwiązać prosty problem w hackerranku przy użyciu Celu C. Próbowałem testu próbki w hackerranku, który miał ten problem ze schodami. Jestem zaskoczony, jak uzyskać wartość n w SolutionClass, jak wydrukować wartość, aby sprawdzić, czy działa, jak wykonać i jak wydrukować wynik. Próbowałem przeszukać sieć i nie mogłem jej poprawnie zrozumieć. Jeśli ktoś może przekierować mnie we właściwym kierunku, bardzo pomocny będzie przykładowy samouczek, samouczek wideo dotyczący rozwiązania jakiegoś problemu. Dzięki! –

+0

Wygląda na to, że to się nie powiedzie, jeśli zmienię "printf" na "NSLog". Czemu? – allenlinli

+0

co z kilkoma łańcuchami w osobnych liniach? – Zangetsu

0

Twój pytanie jest zbyt ogólne dla SO, nie zdziw się, jeśli wkrótce zostanie zamknięte. Musisz generalnie zadawać konkretne pytania, pokazywać, co próbujesz, itp. Ale jeśli masz kilka wskazówek, które pomogą Ci zacząć ...

Nie mów, czy jesteś programistą lub wie Objective-C, w szczególności, zakładając zarówno:

  1. w Xcode spojrzenie typu projektu narzędzie wiersza polecenia

  2. Spójrz na NSFileHandle i jego metod, np fileHandleWithStandardInput

  3. Uwaga można również użyć funkcji C stdio, konwertując ciągi stylów C-styl na style Cel-C itp. W razie potrzeby.

+0

tak, zgadzam się. Być może myślałem, że ktoś z powodzeniem złożył rozwiązanie i udostępnił tylko mechanizm wejścia i wyjścia. Edytuję pytanie z większą ilością wyjaśnień. –

+0

[Przykładowy problem] (https://www.hackerrank.com/environment/sample-problem) w HackerRank używa funkcji C stdio, może powinieneś spróbować? – CRD

+0

Tak wygląda, to jedyny sposób. Będzie czekać kilka dni na jakąkolwiek alternatywę (jak tylko ciekawa jakiejkolwiek innej alternatywy), niż zamknie pytanie. –

2
#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; 
} 

To powinno wystarczyć.

3

Po otrzymaniu jednego z tych testów, zdecydowałem się wyjść z głównego.m od razu do celu C: tak:

#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]; 
    } 
} 

Teraz możesz robić, co chcesz, używając Celu-C.

Więc w tym przykładzie wejście próbka:

3 
11 2 4 

przyniosłoby to wyjście:

3 
[11,2,4] 

nieprzydatne w samo w sobie, ale ilustruje udanej lektury.

To dużo prostsze w Swift, ale tutaj jest kod aby osiągnąć to samo w każdym razie:

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) 

Funkcje powrotu ewentualne, bo nawet jeśli zamierzamy zmuszać-rozpakować wejście, lepiej katastrofa dla zero opcjonalne dzieje się w twoim kodzie niż szablon podstawowy.

+0

' NSArray' i 'NSMutableArray' były dostępne, nie ma problemu? Sprawiają, że praca z niektórymi pytaniami jest dużo łatwiejsza niż przy użyciu tylko surowych macierzy C. –

0

Utworzyłem repozytorium github z niektórymi rozwiązaniami problemów z hakerrankiem napisanymi w funkcji -c. To jest na początkowym etapie, zachęcamy do dodawania swoich rozwiązań.

HackerRank for Objective-C

Powiązane problemy