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?
Niin mikä menee pieleen?
P.S. Käytä välilyöntejä. Koodi on todella ahdistavaa luettavaa.
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
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.
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ä.
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.
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;
Tuossahan tuo tehtävänanto lukee jo vähän ylempänä.
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.
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.
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ä.
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.
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.