The aim of this puzzle is to match files with their MIME type by reading their extensions. It involves without naming it a peculiar data structure : dictionaries. Let us see a simple implementation in C, and how to use standards in Java and Python.
#include <stdlib.h> #include <stdio.h> #include <string.h> // Represents an association between an extension, and its mime type struct pair { char *ext; char *mime; }; // A dictionnary can be implented very simply as a pair array struct dict { int size; struct pair *elmts; }; /* Returns the MIME type of label 'ext' in dictionnary 'dict' or "UNKNOWN" if there is no matching extension */ char *assoc (struct dict *d, char *ext) { for (int i = 0; i < d->size; i++) if (strcmp(d->elmts[i].ext, ext) == 0) return d->elmts[i].mime; return "UNKNOWN"; } // Replaces all uppercase chars of 'str' by the corresponding lowercase chars void toLower (char *str) { for (; *str != '\0'; str++) *str = tolower(*str); } // Returns a pointer on the first char of the extension of 'str' if it has one // or NULL else char *getExt (char *str) { for (char *ext = str+strlen(str); ext != str; ext--) if (*(ext-1) == '.') return ext; return NULL; } int main(int argc, char** argv) { int dictSize, nbFiles; scanf("%d\n%d\n", &dictSize, &nbFiles); // Initializes the dictionary extension-MIME type struct dict d; struct pair *p; d.size = dictSize; d.elmts = malloc(d.size*sizeof(struct pair)); for (int i = 0; i < dictSize; i++) { p = d.elmts+i; p->ext = malloc(11*sizeof(char)); p->mime = malloc(51*sizeof(char)); // here using scanf is quite safe because maximal lengths are known scanf("%s %s\n", p->ext, p->mime); toLower(p->ext); } // processes file 1 by 1, by isolating ext and matching it with a MIME type char file[257]; char *ext; for (int i = 0; i < nbFiles; i++) { gets(file); toLower(file); ext = getExt(file); printf("%s\n", assoc(&d, ext?ext:"")); } for (int i = 0; i < dictSize; i++) { p = d.elmts+i; free(p->ext); free(p->mime); } free(d.elmts); return EXIT_SUCCESS; }
import java.util.*; class Solution { public static void main(String args[]) { Scanner in = new Scanner(System.in); int nbAssociations = in.nextInt(); int nbFiles = in.nextInt(); in.nextLine(); // assoc associates to each file extension the corresponding MIME type Map assoc = new HashMap(); for (int i = 0; i < nbAssociations; i++) { assoc.put(in.next().toLowerCase(), in.next()); in.nextLine(); } for (int i = 0; i < nbFiles; i++) { // isolates the extension, which is the part after the last . String fileName = in.nextLine().toLowerCase(); int pos = fileName.lastIndexOf('.'); String extension = (pos == -1) ? "" : fileName.substring(pos+1, fileName.length()); // prints the corresponding MIME type, or UNKNOWN System.out.println((String)(assoc.getOrDefault(extension, "UNKNOWN"))); } } }
import sys nbAssociations, nbFiles = int(input()), int(input()) # assoc associates to each file extension the corresponding MIME type assoc = {} for i in range(nbAssociations): ext, mime = input().split() assoc[ext.lower()] = mime for i in range(nbFiles): name = input().lower().split('.') ext = name[-1] if len(name) != 1 else None print(assoc[ext] if ext in assoc else "UNKNOWN")