Domanda

Come trovi i numeri di telefono in 50.000 pagine HTML?

Jeff Attwood ha pubblicato 5 domande per i programmatori che fanno domanda per un lavoro:

Nel tentativo di rendere la vita più semplice per gli screening telefonici, ho messo insieme questo elenco di cinque domande essenziali che devi porre durante uno schermo SDE.Non garantiranno che il tuo candidato sarà fantastico, ma aiuteranno a eliminare un numero enorme di candidati che stanno scivolando attraverso il nostro processo oggi.

1) Codificazione Il candidato deve scrivere un codice semplice, con una sintassi corretta, in C, C ++ o Java.

2) Progettazione OO Il candidato deve definire concetti di base OO e trovare lezioni per modellare un semplice problema.

3) Scripting e espressioni regolari Il candidato deve descrivere come trovare i numeri di telefono in 50.000 pagine HTML.

4) Strutture dati Il candidato deve dimostrare la conoscenza di base delle strutture di dati più comuni.

5) Bit e byte Il candidato deve rispondere a semplici domande su bit, byte e numeri binari.

Per cortesia comprendi:Quello che sto cercando qui è un vuoto totale in una di queste aree.Va bene se lottano un po 'e poi lo capiscono.Va bene se hanno bisogno di alcuni suggerimenti o suggerimenti minori.Non mi dispiace se sono arrugginiti o lenti.Quello che stai cercando sono i candidati completamente all'oscuro o orribilmente confuso, sulla zona in questione.

>>> Tutto il post originale di Jeff <<<


Nota: Steve Yegge originariamente pose la domanda.

È stato utile?

Soluzione

egrep "(([0-9]{1,2}.)?[0-9]{3}.[0-9]{3}.[0-9]{4})" . -R --include='*.html'

Altri suggerimenti

Fatto questo in Java.La regex è stata presa in prestito da questo forum.

    final String regex = "[\\s](\\({0,1}\\d{3}\\){0,1}" +
            "[- \\.]\\d{3}[- \\.]\\d{4})|" +
            "(\\+\\d{2}-\\d{2,4}-\\d{3,4}-\\d{3,4})";
    final Pattern phonePattern = Pattern.compile(regex);

    /* The result set */
    Set<File> files = new HashSet<File>();

    File dir = new File("/initDirPath");
    if (!dir.isDirectory()) return;

    for (File file : dir.listFiles()) {
        if (file.isDirectory()) continue;

        BufferedReader reader = new BufferedReader(new FileReader(file));

        String line;
        boolean found = false;
        while ((line = reader.readLine()) != null 
                && !found) {

            if (found = phonePattern.matcher(line).find()) {
                files.add(file);
            }
        }
    }

    for (File file : files) {
        System.out.println(file.getAbsolutePath());
    }

Ho eseguito alcune prove ed è andato tutto bene!:) Ricorda che non sto cercando di usare il miglior design qui.Ho appena implementato l'algoritmo per quello.

Ecco un modello regex migliorato

\(?\d{3}\)?[-\s\.]?\d{3}[-\s\.]?\d{4}

È in grado di identificare diversi formati numerici

  1. xxx.xxx.xxxx
  2. xxx.xxxxxxx
  3. xxx-xxx-xxx
  4. xxxxxxxxxx
  5. (xxx)xxxxxxx
  6. (xxx)xxx-xxxx
  7. (xxx)xxx-xxxx

egrep '(?\d{3})?[-\s.]?\d{3}[-.]\d{4}' *.html

Prendendo in prestito 2 elementi dalla risposta in C# di sieben, ecco un piccolo snippet in F# che farà il lavoro.Tutto ciò che manca è un modo per chiamare processDirectory, che viene tralasciato intenzionalmente :)


open System
open System.IO
open System.Text.RegularExpressions

let rgx = Regex(@"(\({0,1}\d{3}\){0,1}[- \.]\d{3}[- \.]\d{4})|(\+\d{2}-\d{2,4}-\d{3,4}-\d{3,4})", RegexOptions.Compiled)

let processFile contents = contents |> rgx.Matches |> Seq.cast |> Seq.map(fun m -> m.Value)

let processDirectory path = Directory.GetFiles(path, "*.html", SearchOption.AllDirectories) |> Seq.map(File.ReadAllText >> processFile) |> Seq.concat

Adoro risolvere questi piccoli problemi, non posso trattenermi.

non sono sicuro che valesse la pena farlo poiché è molto simile alla risposta Java.

private readonly Regex phoneNumExp = new Regex(@"(\({0,1}\d{3}\){0,1}[- \.]\d{3}[- \.]\d{4})|(\+\d{2}-\d{2,4}-\d{3,4}-\d{3,4})");

public HashSet<string> Search(string dir)
{
    var numbers = new HashSet<string>();

    string[] files = Directory.GetFiles(dir, "*.html", SearchOption.AllDirectories);

    foreach (string file in files)
    {
        using (var sr = new StreamReader(file))
        {
            string line;

            while ((line = sr.ReadLine()) != null)
            {
                var match = phoneNumExp.Match(line);

                if (match.Success)
                {
                    numbers.Add(match.Value);
                }
            }
        }
    }

    return numbers;
}

Soluzione Perl

Di:"MH" tramite codinghorror,com il 5 settembre 2008 07:29

#!/usr/bin/perl
while (<*.html>) {
    my $filename = $_;
    my @data     = <$filename>;

    # Loop once through with simple search
    while (@data) {
        if (/\(?(\d\d\d)\)?[ -]?(\d\d\d)-?(\d\d\d\d)/) {
            push( @files, $filename );
            next;
        }
    }

    # None found, strip html
    $text = "";
    $text .= $_ while (@data);
    $text =~ s#<[^>]+>##gxs;

    # Strip line breaks
    $text =~ s#\n|\r##gxs;

    # Check for occurrence.
    if ( $text =~ /\(?(\d\d\d)\)?[ -]?(\d\d\d)-?(\d\d\d\d)/ ) {
        push( @files, $filename );
        next;
    }
}

# Print out result
print join( '\n', @files );

Ecco perché le domande di codifica delle interviste telefoniche non funzionano:

screening telefonico:come trovi i numeri di telefono in 50.000 pagine HTML?

candidato:aspetta un secondo (copre il telefono) ehi (coinquilino/amico/ecc. che è bravissimo a programmare), come trovi i numeri di telefono in 50.000 pagine HTML?

Salva le domande di codifica per l'inizio del colloquio di persona e rendi le domande del colloquio più personali, ad es."Vorrei dettagli sull'ultima volta che hai risolto un problema utilizzando il codice".Questa è una domanda che richiederà un follow-up sui loro dettagli ed è molto più difficile convincere qualcun altro a rispondere per te senza sembrare strano al telefono.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top