Frage Wie man HackerRank-Probleme in Objective-C löst


Kann jemand erklären, wie man den Hacker-Rang-Test in Ziel-C gibt? Speziell der Teil "Input von STDIN lesen. Ausgabe an STDOUT ausgeben"

Wie liest man in object-c ein und aus?

Was ich bisher bekommen habe, ist Input wie

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

Aber um die Ausgabe zu drucken, druckt folgendes nichts auf der HackerRank-Konsole (funktioniert aber einwandfrei auf der Xcode-Konsole)

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

11
2017-12-22 17:54


Ursprung


Antworten:


Die einfachste Möglichkeit, "Eingabe von STDIN lesen. Ausgabe an STDOUT ausgeben" wäre scanf und printf.
  Hier ist ein Beispielvorlage um loszulegen:

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

Bevor Sie eine Reise auf diese Reise machen, ein paar Dinge:

  • Stellen Sie sicher, dass ARC deaktiviert ist (suchen Sie in den Erstellungseinstellungen nach CLANG_ENABLE_OBJC_ARC und legen Sie sie auf NO fest)
  • Vermeide das Benutzen selbst. Dies ist eine funktionale Programmierung.
  • Verwenden Sie C-Funktionen, nicht Objective-C-Methoden, also verwenden

Anstatt von

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

benutzen

int sumOfNumbers(int a, int b){

    return a + b;
}

Glückliche Programmierung.


11
2018-01-31 06:23



Nachdem ich gerade einen dieser Tests erhalten hatte, entschied ich mich sofort aus main.m herauszukommen und in Objective-C wie folgt:

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

Jetzt können Sie mit Objective-C machen, was Sie wollen.

Also in diesem Beispiel eine Beispieleingabe von:

3
11 2 4

Würde diese Ausgabe erzeugen:

3
[11,2,4]

Nicht nützlich für sich selbst, sondern veranschaulicht das erfolgreiche Lesen.

Es ist viel einfacher in Swift, aber hier ist Code, um das Gleiche zu erreichen:

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)

Die Funktionen geben Optionale zurück, da, obwohl Sie die Eingabe erzwingen wollen, der Absturz für eine Null optional in Ihrem Code auftritt.


3
2018-04-08 19:17



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

Das sollte es tun.


2
2018-05-07 09:15



Deine Frage ist wirklich zu allgemein für SO, sei nicht überrascht, wenn sie bald geschlossen wird. Sie müssen im Allgemeinen spezifische Fragen stellen, zeigen, was Sie versucht haben, etc. Aber wenn Sie nur nach ein paar Tipps sind, um Sie in Gang zu bringen ...

Sie sagen nicht, ob Sie bereits Programmierer sind oder ob Sie insbesondere Objective-C kennen.

  1. In Xcode sehen Sie sich den Projekttyp Command Line Tool an

  2. Einblick in NSFileHandle und ihre Verfahren, z.B. fileHandleWithStandardInput

  3. Beachten Sie, dass Sie auch die C stdio-Funktionen verwenden können, indem Sie C-Style- und Objective-C-Style-Strings usw. nach Bedarf konvertieren.


0
2017-12-22 19:45



Ich habe github repo mit einigen hackerrank-Problemlösungen erstellt, die in objective-c geschrieben sind. Es ist in der Anfangsphase, fühlen Sie sich frei, indem Sie Ihre Lösungen auch beitragen.

HackerRank für Objective-C


0
2018-01-17 20:25