Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: PHP/kaikki paitsi yksi

Sivun loppuun

LCHawk [16.02.2014 18:54:04]

#

Eli olen tekemässä PHP-haasteen tehtävää 17.

Koodini on seuraava:

<?php
$n=$_REQUEST['n'];
$luvut=$_REQUEST['luvut'];
$luvut=explode($luvut);
$apu=array();
$puuttuva;
for($i=0;$i<$n;$i++){
    $apu[$i]=($i+1);
}
for($i=0;$i<count($luvut);$i++){
    for($j=0;$j<count($apu);$j++){
        if($apu[$j]==$luvut[$i]){
            $apu[$j]=-1;
        }
    }
}
$puuttuva=max($apu);
echo $puuttuva;

Voisiko joku antaa pikkuvinkin siitä, missä menee pieleen?

The Alchemist [16.02.2014 21:18:52]

#

Niin mikä menee pieleen?

P.S. Käytä välilyöntejä. Koodi on todella ahdistavaa luettavaa.

LCHawk [16.02.2014 21:24:14]

#

Tehtävänanto:

Lukujen 4, 1, 3 ja 5 joukossa ovat kaikki luvut väliltä 1–5 paitsi luku 2. Tehtävässä annetaan jossain järjestyksessä kaikki luvut väliltä 1–n yhtä lukuun ottamatta, ja tarkoitus on selvittää, mikä luku puuttuu. Voit olettaa, että n on korkeintaan 1000 ja jokainen luku annetaan vain kerran.

Tuloste, jonka saan aikaiseksi:

Syöte

n=3&luvut=1|3

Oma vastauksesi

3

Oikea vastaus

2

The Alchemist [16.02.2014 21:26:27]

#

Sinä et nyt kysy apua tuon tehtävän ratkaisemiseen vaan oman ratkaisuyritelmäsi korjaamiseen. Meitä ei siis kiinnosta, ettei sinun ratkaisusi anna oikeaa tulosta, vaan meitä kiinnostaa se, että missä kohti olet huomannut virheen tapahtuvan. Tämä on loistava esimerkki jo Metabolixin aiemmin päivällä toisessa ketjussa esiin tuomasta XY-ongelmasta.

LCHawk [16.02.2014 21:30:46]

#

Anteeksi, oletin, että kysyit tuota.

Minä en itse tajua, että missä virhe tapahtuu.

Haluaisin jonkin vinkin siihen, että saisin tuon tehtävän ratkaistua. Joko sitten tuohon koodiin tai jonkin muun. Veikkaan itse, että jonkinlainen viritys isset-komennonkin avulla voisi toimia, mutta minulla ei ole hajuakaan miten sellaisen saisi tehtyä.

The Alchemist [16.02.2014 21:39:50]

#

LCHawk kirjoitti:

Minä en itse tajua, että missä virhe tapahtuu.

No sitten sinun täytyy debugata koodiasi. Eli käytännössä selvittelet, mitä noissa taulukoissasi on milläkin hetkellä ja vertaat arvoja mielikuvaasi siitä, mitä niiden pitäisi oikeasti olla. Hyvä paikka aloittaa on ainakin verrata tuloksia ennen ja jälkeen jokaisen silmukan ja tarvittaessa myös vaikka jokaisen kierroksen jälkeen.

lainaus:

Haluaisin jonkin vinkin siihen, että saisin tuon tehtävän ratkaistua. Joko sitten tuohon koodiin tai jonkin muun. Veikkaan itse, että jonkinlainen viritys isset-komennonkin avulla voisi toimia, mutta minulla ei ole hajuakaan miten sellaisen saisi tehtyä.

Älä yritä miettiä ratkaisua siltä kantilta, että mitä funktiota ratkaisuun voisi käyttää. Sen sijaan mieti se, mitä sinun täytyy oikeasti tehdä, jotta voit ratkaista tehtävän. Selität siis itsellesi selkeällä tavalla, mikä on ongelman ydin.

Tarkoitus on siis löytää perättäisten numeroiden sarjasta puuttuva numero. No heti tulee mieleen, että koska numerot ovat perättäisiä, niin voidaan vain ajaa silmukka 1:stä n:ään ja katsoa, mitä numeroa ei löydy syötteestä. Sen toteuttamiseen on monia tapoja mutta mihinkään et tarvitse aputaulukkoa.

p99o [16.02.2014 21:40:49]

#

missä nuo luvut 1-n ovat?
taulukossa vai merkkijonossa/lukuna. En itse voi tarkastella tehtävän kuvausta, koska en ole niitä tehnyt.

$numbers = array("34","31","9","1");
//vai
$numbers = 1234567890111213;

The Alchemist [16.02.2014 21:41:29]

#

Tuossahan tuo tehtävänanto lukee jo vähän ylempänä.

Teuro [16.02.2014 22:30:45]

#

Ongelmasi ratkeaa aika helpolla, jos ensin hoidat taulukon hiukan toiseen muotoon. Tämän jälkeen käyt taulukkoa läpi kunnes löydät puuttuvan alkion.

The Alchemist [16.02.2014 23:30:20]

#

Taulukon voi lajitella tai olla lajittelematta, ei sillä ole mitään vaikutusta tehtävästä suoriutumiseen. Koodista toki tulee hiukkasen järkevämpi, jos haluaa kehittyä silläkin puolella. Toisaalta yhtä kehittävää olisi pohtia muita mahdollisia tapoja lukujen tarkistamiseen, koska jo php:n vakiokirjaston funkkareilla on mahdollista tehdä tusina erilaista hyvin lyhyttä ratkaisua.

Torgo [17.02.2014 12:51:00]

#

LCHawk kirjoitti:

Voisiko joku antaa pikkuvinkin siitä, missä menee pieleen?

Tässä:

$luvut=explode($luvut);

Tosin paljon tehokkaammin ja yksinkertaisemminkin tuon voi toteuttaa. Ratkaisuja on monia, mutta voisit esim. miettiä mikä on summa(1..n) ja miten se suhtautuu annettuihin lukuihin. Vastauksen saa suoraan yhdellä yksinkertaisella rivillä.

Chiman [17.02.2014 13:02:19]

#

The Alchemist kirjoitti:

LCHawk kirjoitti:

Minä en itse tajua, että missä virhe tapahtuu.

No sitten sinun täytyy debugata koodiasi. Eli käytännössä selvittelet, mitä noissa taulukoissasi on milläkin hetkellä ja vertaat arvoja mielikuvaasi siitä, mitä niiden pitäisi oikeasti olla.

Tässä oli tärkein vinkki tätä ja kaikkia tulevia ohjelmointeja varten. Älä oleta mitään. Tarkista.

Mieti mitä koodisi exploden pitäisi tehdä. Sitten tulosta se: http://codepad.org/Yo516ZsK

Lisäys: var_dump on tietysti yleisesti parempi funktio muuttujien sisällön tulostukseen, mutta tässä echokin jo paljasti totuuden.

LCHawk [17.02.2014 16:47:56]

#

Chiman kirjoitti:

The Alchemist kirjoitti:

LCHawk kirjoitti:

Minä en itse tajua, että missä virhe tapahtuu.

No sitten sinun täytyy debugata koodiasi. Eli käytännössä selvittelet, mitä noissa taulukoissasi on milläkin hetkellä ja vertaat arvoja mielikuvaasi siitä, mitä niiden pitäisi oikeasti olla.

Tässä oli tärkein vinkki tätä ja kaikkia tulevia ohjelmointeja varten. Älä oleta mitään. Tarkista.

Mieti mitä koodisi exploden pitäisi tehdä. Sitten tulosta se: http://codepad.org/Yo516ZsK

Lisäys: var_dump on tietysti yleisesti parempi funktio muuttujien sisällön tulostukseen, mutta tässä echokin jo paljasti totuuden.

Kiitos tästä vinkistä!

Sain homman nyt ratkaistua.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta