Scelta della lingua per le competizioni di algoritmi [duplicato]

6

Ciao a tutti Ho appena iniziato a prendere parte alle competizioni online di codifica. Mi piacerebbe sapere quale lingua sarebbe migliore per quanto riguarda l'efficienza e la facilità di debugging. Io tendo ad evitare c ++ e generalmente vado con java. 1. Qualche altra lingua sarebbe adatta? Che ne dici di c sharp o python o di qualche altro ( Nessun problema con l'apprendimento di uno nuovo .) 2. La competenza in C ++ è necessaria per una programmazione efficiente? 3. E da java & c # che è meglio per le competizioni con algoritmi?

    
posta filokalk 24.07.2011 - 04:59
fonte

12 risposte

10

Penso che questo dovrebbe essere pubblicato su programmatori SE ma questo sono i miei due centesimi:

  1. Ti suggerisco di essere abile con C. La semplicità, gli esempi e la cosa che è la base di Java e C # ti serviranno come preparazione per i futures. Inoltre, molti esempi e demo sono basati su C. Vedi le statistiche su questo sito come esempio.

  2. Non credo che la conoscenza di c ++ sia necessaria. Ma credi che sia C uno.

  3. Tra Java e C # andrò con C # per flessibilità.

risposta data 24.07.2011 - 05:04
fonte
10

Usa python

In primo luogo, python è più breve che in uno scenario di concorrenza rappresenta un vantaggio significativo.

Si consideri:

std::map<string, int> foo;
std::stringstream str(input);
while(!str.eof())
{
      std::string x;
      str >> x;
      foo[x] += 1
}

vs

foo = Counter( text.split() )

Non è solo che Python elimina la digitazione inutile, ma fornisce costrutti più potenti che ti permettono di creare più rapidamente il tuo codice.

In secondo luogo, il debug funziona bene.

Gli oggetti vengono stampati in modo utile. Puoi "stampare" qualsiasi oggetto. I contenitori mostreranno il loro contenuto. Questo può essere utile quando si esegue il debug di stile di stampa. Se si utilizza un debugger grafico (io uso winpdb), le abilità introspettive e dinamiche di python danno la possibilità di visualizzare e manipolare facilmente tutti gli aspetti di un oggetto.

Tuttavia:

Il problema più grande è che contest deve supportare python. Cose come ACM richiedono in genere C, C ++, Java o simili. Tuttavia, molti dei concorsi online supportano python.

Il secondo problema è la velocità. Tuttavia, questo in genere non è un problema perché il tuo algoritmo non dovrebbe superare in base alla velocità di esecuzione, ma piuttosto all'intelligenza dell'algoritmo. Cioè Il C ++ potrebbe consentire di eseguire meglio l'algoritmo O (n ^ 5), ma il tutto è davvero quello di trovare l'algoritmo O (n). Se trovi l'algoritmo giusto, la lingua non ha importanza.

    
risposta data 24.07.2011 - 12:12
fonte
5

Parteciperò alle competizioni ACM negli Stati Uniti e anche a quelle online. Per la concorrenza, scelgo Java per semplificare il debugging e la codifica. Per i Judge online tendo a usare c ++ / C perché i computer Judge sono lenti e preferirei semplicemente codificare l'algoritmo piuttosto che impiegare i diversi metodi di input / output in Java per farlo funzionare (dato che alcuni limiti di tempo sono ridicoli e Java è un po 'più lento a gestire l'I / O a volte). Questa è solo la mia opinione, ma sei libero di usare quello che vuoi. I linguaggi più popolari sono C ++ e Java per le competizioni se si guardano le categorie linguistiche dei risultati finali, quindi probabilmente non si può sbagliare con nessuno di questi (ovviamente molti altri sono supportati solo non usati spesso).

    
risposta data 24.07.2011 - 05:03
fonte
5

Ci andrei con java o C # entrambi con cui è facile eseguire il debug. In Java devi trovare un buon IDE che supporti nel debug come

breakpoint pila di chiamate variabili guardate guardato i locali.

Ma in C # non devi preoccuparti di tutto questo già è stato creato nell'IDE di Visual C #

    
risposta data 24.07.2011 - 05:05
fonte
4

Linguaggi funzionali come F # e Haskell vale la pena dare un'occhiata se stai facendo algoritmi. Funzionalità come le unioni discriminate e la corrispondenza dei pattern rendono i compiti molto matematici / computazionali più facili da concettualizzare, prototipare e lucidare.

F # è probabilmente più accessibile dato che è multi-paradigmatico (è anche altrettanto veloce e spesso più veloce di C #), ma Haskell è una sfida divertente.

    
risposta data 24.07.2011 - 12:26
fonte
3

Se la competizione è a tempo e qualsiasi lingua è consentita, sceglierei Perl. Java è troppo prolisso e la libreria C standard è troppo limitata. Perl è molto meglio per la programmazione delle competizioni che è stato bandito per la competizione dell'UCLA Undergraduate Computer Science Association nel 1998.

    
risposta data 24.07.2011 - 06:21
fonte
2

Ho già messo a disposizione ...

Questo è qualcosa che dovrebbe essere nei commenti, ma ce n'è troppa ...

C si libera di molti elementi non necessari di grandi sistemi supportati da C ++, C # ecc. Non hai bisogno di OOP, di template ecc. per scrivere piccoli sistemi centrati sugli algoritmi.

Detto questo, il C ++ ha i suoi punti in più - se lo conosci e sai come / quando evitare l'occultamento dei dati e altri problemi di astrazione-intrusione, usalo.

C'era una volta, avrei suggerito Modula 2 (o un Pascal non standard, forse anche Ada) come alternativa a C. Ci sono alcuni vantaggi per una digitazione più rigida, alcuni svantaggi per il meno ricco insieme di operatori , yada yada. Al giorno d'oggi, il mondo ha lasciato per lo più queste lingue, quindi probabilmente non sono più opzioni reali.

Probabilmente Python ti darà una velocità di sviluppo molto più veloce, a seconda di cosa stai facendo. Ovviamente ha OOP, ma è più facile evitarlo quando non ne hai bisogno di C # o Java. I problemi sono (1) che le prestazioni in fase di esecuzione potrebbero non essere presenti se stai facendo tutte le cose di basso livello (piuttosto che usare le librerie che sono state scritte in C) e (2) ci sono momenti in cui puoi vuoi gestire la memoria tu stesso nel codice di basso livello - tenere le cose in pila piuttosto che ingombrare l'heap, non fare affidamento sulla garbage collection, ecc.

I generatori / iteratori Python sono anche uno strumento molto utile che non vedi in molte altre lingue.

Scrivere componenti critici in moduli C per l'uso in Python è un'opzione, ma sarei molto preoccupato di entrare nello sviluppo multi-lingua con i limiti di tempo di un concorso - c'è almeno il doppio dello scopo per le cose da fare sbagliato in modo disastroso.

Obiettivo CAML è un linguaggio funzionale impuro. Può fare tutto ciò che una normale lingua imperativa può fare, e ha anche alcuni trucchi molto utili dal mondo funzionale. Non ne ho molta esperienza, ma credo certamente che affermi che elimina un sacco di confusione, permettendoti di concentrarti su quello che stai facendo - supporti per la corrispondenza dei modelli che pretendono di iniziare. Ed è un linguaggio nativo che esegue fast - anche se "potrebbe volere gestire la memoria per te stesso" probabilmente si applica anche agli obiettivi CAML (e F #).

Haskell - assolutamente lo apprendi, ma non con l'obiettivo di usarlo per i concorsi con un focus sugli algoritmi forti, ma se raggiungi il punto in cui pensi che sarà una buona scelta, e hai compreso le mie critiche e le hai respinte (o le hai trovate valide ma non importanti) - non combatterle neanche.

    
risposta data 24.07.2011 - 18:01
fonte
1

Penso che sia più facile eseguire il debug e che il linguaggio sia C # (VS ha molte cose da fare è meglio.)

  1. La competenza in C ++ è necessaria per una programmazione efficiente?

Non così! Dovresti anche conoscere il meccanismo della macchina.

  1. E su java e amp; c # che è meglio per le competizioni con algoritmi?

C # ma java non è poi così male. Se hai lavorato di più con java in NetBeans, scegli java. Perché dopo NetBeans è difficile da usare VS.

    
risposta data 24.07.2011 - 08:53
fonte
1

Alcune competizioni hanno un set specifico di lingue consentite, non hai il lusso di usare quello che vuoi.

Per le competizioni preferisco un linguaggio di scripting e dinamico, devi codificare velocemente e vedere il risultato più velocemente. Più importante è necessario modificare rapidamente il codice.
Python, Ruby o JavaScript sono candidati forti.

Ho partecipato a Google Jam in passato e Java non era la scelta migliore.

Se ti senti veramente a tuo agio con la programmazione funzionale (e intendo davvero comoda), allora ti consiglio questa via.
Lisp, Haskell o Erlang sono le mie scelte personali.

    
risposta data 24.07.2011 - 19:47
fonte
1

Ho partecipato a IOI un paio di volte e sono stato codificato in C. Al momento non conoscevo OO e nemmeno come allocare memoria sullo heap (ho allocato tutta la memoria necessaria nello stack). Tutta l'attenzione era sull'algoritmo.

Tuttavia, al giorno d'oggi, mi attenersi a Java, a causa della vasta libreria di algoritmi e strutture dati disponibili. Ma, naturalmente, prendi in considerazione che in IOI, non ti è permesso portare alcun codice preparato, quindi un'enorme libreria di algoritmi e strutture è un grande vantaggio. Le competizioni online sono probabilmente un'altra questione ...

    
risposta data 29.08.2011 - 14:14
fonte
0

Il problema è che diversi sviluppatori preferiscono linguaggi diversi e non sempre si tratta di argomenti tecnici validi, piuttosto di quali sono gli stili di sviluppo in cui si sentono più a proprio agio.

Personalmente terrei una competizione che ha una categoria per ogni lingua. La competizione per ogni lingua dovrebbe essere impostata da qualcuno che è un fan di quella lingua (quindi il compito sarà qualcosa che attira gli altri fan di quella lingua)

    
risposta data 24.07.2011 - 09:05
fonte
-1

Userei Common Lisp, perché è molto pragmatico ed espressivo.

    
risposta data 29.08.2011 - 20:17
fonte

Leggi altre domande sui tag