Le domande di programmazione per la soluzione dei problemi sono utili per migliorare la capacità generale di programmazione?

1

Ad esempio, come:

L'inaugurale Olimpiade internazionale di Frogleaping si terrà in Australia nel 2013 e tu sei determinato a vincere. Mentre non vuoi avere niente a che fare con creature viscide e nervose, hai intenzione di entrare in un robot simile a una rana che sai essere più veloce di tutti gli altri partecipanti organici.

L'IOF si svolge in un grande stagno in cui è presente una sequenza di ninfee disposte in una lunga fila. Le regole della gara sono semplici: la tua rana sarà posizionata sulla prima ninfea, quindi dovrà saltare alla seconda ninfea, quindi la terza e così via fino a raggiungere l'ultimo ninfea in rotta. Si noti che non è possibile "saltare" i ninfeali - ogni ninfea deve essere saltata su esattamente una volta. La prima rana che raggiungerà l'ultimo ninfea vincerà la gara. Dal momento che la tua rana robotizzata ha una velocità super-rana, sei sicuro della tua vittoria.

Tuttavia, la tua rana ha un difetto irreversibile minore: è in grado di saltare solo una distanza fissa. Nello specifico, può solo saltare esattamente K metri in avanti dalla sua posizione corrente, anche se questo fa atterrare la rana nell'acqua (dove verrà immediatamente cortocircuitato).

Dato che le posizioni iniziali del giglio potrebbero rendere impossibile per la tua rana raggiungere l'ultimo pad di ninfea, hai intenzione di creare una distrazione e spostare le ninfee in modo che siano distanziate esattamente di K metri, consentendo alla tua rana di saltare da il primo all'ultimo senza cadere nell'acqua. Spostando un giglio di un metro in un secondo, e più a lungo trascorrerai le ninfee spostando di soppiatto, tanto più è probabile che i giudici dell'IOF si accorgano e squalifichino dalla competizione.

Date le distanze iniziali tra le ninfee nel corso, devi scrivere un programma per calcolare il tempo minimo che dovrai trascorrere spostando le ninfee in modo che tutte le coppie di ninfee consecutive si trovino esattamente a K metri di distanza. Si può supporre che lo stagno sia sufficientemente lungo in modo che il primo pannello di ninfea possa essere spostato a qualsiasi distanza indietro, e l'ultimo pannello di ninfea può essere spostato a qualsiasi distanza in avanti.

ingresso

Il tuo programma dovrebbe leggere dal file frogin.txt. La prima riga di questo file sarà composta da due interi N separati da spazi e K. Le seguenti linee N-1 conterranno le distanze iniziali tra coppie consecutive di ninfee. Nello specifico, la linea ith conterrà un intero che rappresenta la distanza tra l'ith e (i + 1) il ninfea.

uscita

Il tuo programma dovrebbe scrivere sul file frogout.txt. Il tuo file di output dovrebbe essere costituito da una riga contenente un intero: il tempo totale minimo trascorso spostando le ninfee in modo da assicurarti la vittoria.

Questo è un problema di esempio delle Olimpiadi australiane dell'informatica, che mi è capitato di imbattermi in una ricerca su Internet.

Ma non credo che eventuali problemi legati alla programmazione che non si colleghino direttamente con situazioni di vita reale avranno effetti utili sulla capacità di programmazione del mondo reale. Lo faranno?

    
posta think123 27.01.2014 - 09:19
fonte

3 risposte

9

Pensa a questo:

  • prima di tutto, per risolvere il problema dato, c'è un programma non banale da scrivere. Non è necessario disporre di un'interfaccia utente Web o desktop o di un "livello database" o, ma implica una sorta di "logica aziendale" che deve essere testata e debellata.
  • per risolvere il problema, hai bisogno di alcuni interi matematici / combinatori. Ci sono molti problemi del mondo reale per cui è utile conoscere interi matematici / combinatori (ovviamente c'è anche un enorme numero di problemi in cui non è necessario).

Quindi, IMHO sì, risolvere questi problemi ti insegna certi aspetti di essere un programmatore migliore. Naturalmente, non ti insegnano tutto sulla programmazione del mondo reale, in particolare nulla che implichi una tecnologia speciale. Ma "Australian Informatics Olympiad" (o Olimpiade dell'Informatica in altri paesi) riguarda l'informatica, non la programmazione del mondo reale, quindi ha un obiettivo diverso.

    
risposta data 27.01.2014 - 09:54
fonte
3

Di solito quando le persone si lamentano della pertinenza di un problema, significa che lo trovano troppo difficile. È risolvendo problemi difficili che cresci. Il meglio che ottieni risolvendo ripetutamente i problemi più facili è che ottieni più velocemente problemi facili.

Questi tipi di problemi sono pensati per essere divertenti, ma ciò non significa che non siano rilevanti per il lavoro quotidiano di un programmatore. Alcuni esempi di problemi simili in termini di algoritmi e processi di pensiero, ma più "gravi" sono:

  • Creazione di un'animazione per distribuire uniformemente gli elementi posizionati approssimativamente su un display.
  • Calcolo della latenza per gestire eventi che arrivano in momenti irregolari, ma che desideri gestire in modo uniforme.
  • Compensazione per jitter in streaming audio o video.
risposta data 27.01.2014 - 16:02
fonte
1

Sì, lo sono. I sono d'accordo con Doc Brown , e voglio aggiungere che alcuni problemi (ad esempio l'ICPC di ACM) oltre alle abilità matematiche stanno anche esercitando la tua capacità di modellare un problema, scrivere un algoritmo, ecc.

Sebbene la maggior parte delle soluzioni ufficiali presentate siano probabilmente piene di hack sporchi a causa dei limiti di tempo, puoi prendere il tuo tempo e risolvere i problemi in modo ottimale ed elegante.

    
risposta data 27.01.2014 - 14:03
fonte

Leggi altre domande sui tag