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")