Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointiputka: PHP-haaste näyttää syötteen oudosti

akmiansu [26.06.2017 18:06:52]

#

(Mod. vaihtoi otsikon ongelmaa paremmin kuvaavaksi.)

Nyt tuli eteen taas tehtävä jossa en ymmärrä tehtävänantoa.

Tehtävä 52: Pinolaskin kirjoitti:

1970- ja 1980-luvuilla käytettiin yleisesti taskulaskimia, joiden käyttöliittymä oli varsin nurinkurinen: esimerkiksi lausekkeen "5 * (3 + 4) + 1" sijaan laskimeen kirjoitettiin lauseke "5 3 4 + * 1 +".

Pinolaskin lukee syötettä vasemmalta oikealle. Kun vastaan tulee luku, se työnnetään pinoon. Kun vastaan tulee laskutoimitus (esim. + tai *), pinosta nostetaan kaksi arvoa, suoritetaan laskutoimitus, ja työnnetään tulos takaisin pinoon. Lopulta pinossa on koko lausekkeen tulos.

Tuolla esimerkkilausekkeella "5 3 4 + * 1 +" tehtävän suorittaminen onnistuu, mutta tehtävänannossa ei kerrota mitä tälläisiin virheellisiin syötteisiin pitäisi tulostaa vastaukseksi. Olisko ketään tätä selvittänyttä?

Oman ymmärrykseni mukaan syötelausekkeessa pitäisi tulla ensin vähintään kaksi lukua ennenkuin voi tulla laskutoimitusoperaattoria. Ensimmäiset testilausekkeet ovat kuitenkin "637+443+%2B" ja "3+-5+7+%2A+-". Onko näistä näistä poistettu välilyönnit, joiden piti erotella arvot? Jos työnnän pinoon luvun 637 tai 3, ei minulla ole toista lukua pinossa minkä kanssa tekisin yhteenlaskun. Ensin kokeilin tehdä tälläisiä laskutoimituksia arvolla "null", mutta ei toimi sekään; lausekkeeseen "3+-5+7+%2A+-" on annettu arvoksi 38.

peran [27.06.2017 17:52:01]

#

+ - merkki tarkoittaa välilyöntiä eli uutta numeroa/toimintoa
%2B - merkkijono tarkoittaa +-merkkiä
%2A - merkkijono tarkoittaa *-merkkiä
%2F - merkkijono tarkoittaa /-merkkiä

Kyseessä siis hexa-asciit.

Edit - Ja siis en ole selvittänyt kyseistä tehtävää. :(

Grez [27.06.2017 19:31:36]

#

Peran viestiin voisi täydentää, että tuossa ei ole mistään taikanumeroista kyse, vaan pyynnön kyselymerkkijono on url-enkoodattu, kuten aina weppisivuja ladatessa.

Eli kun ajaa tuon 3+-5+7+%2A+- urldecode -funktion (tai vastaavan) läpi, niin tulokseksi tulee 3 -5 7 * -

Sinänsä jos sivupyyntö on http://jotain.com/sivu.php?n=3+-5+7+%2A+- niin ihan normaali $_REQUEST['n'] palauttaa normaalisti valmiiksi url-dekoodatun arvon. Eli outoa että olet edes törmännyt tuollaiseen.

akmiansu [28.06.2017 00:46:16]

#

Ohjelmointiputkan palvelin todellakin lähettää näin:

Syöte
lauseke=3+-5+7+%2A+-
Oma vastauksesi
-38
Oikea vastaus
38
Takaisin tehtävään

Mutta se hämäsi kun koodissani oli vikaa myös. $_REQUEST['lauseke'] tosiaan muuttaa sen ihan normaalilausekkeeksi.

peran [28.06.2017 17:40:13]

#

Kyllä 38 on oikea vastaus...

3 -5 7 * -

Elikkä purettuna sulkuina...

3-(-5 * 7) = 38

Jos kiinnostaa lisää, niin kannattaa hankkia vanha HP:n laskin esim. HP48.

Metabolix [29.06.2017 19:53:13]

#

Nyt PHP-haaste näyttää syötteen URL-muodon lisäksi myös PHP-muuttujana:

lainaus:

Syöte (URL-muoto)

lauseke=3+-5+7+%2A+-

Syöte (PHP-muoto)

$_REQUEST = array (
  'lauseke' => '3 -5 7 * -',
);

Sinänsä tämän parametriasian pitäisi olla ihan perusjuttu jokaiselle PHP-koodarille. Haasteen neuvoissakin kerrotaan, että koodia voi testata laittamalla parametrit osoitteriville (GET-parametreiksi), jolloin tuo annettu URL-muoto on hyödyllinen.

Vastaus

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

Tietoa sivustosta