Kako vam idu zagoneke?

Možda ima koji ljubitelj zagonetki ovdje…ponekad mi se učini da se ima što programirati i unutar zagonetke xd, pa evo recimo jedna takva:

Imate 12 zlatnika, Svi su jednako teški…osim jednog zlatnika (uljeza) za kojeg neznate jel teži ili lakši.
Imate vagu onu starinsku koja uspoređuje dvije stvari.
Kako ćete pomoću samo tri vaganja naći zlatnik različite težine?

…eto, malo za odušak, postavljajte zagonetke…ako vam se da… :slight_smile:

Usporedis 6 sa 6, 3 sa 3 i 1 sa 2.

Al mislim da je pitanje krivo postavljeno.

Mislim da nije (štoviše, prilično sam siguran da nije)…ali mislim da ti nešto nisi shvatio ipak, hmmm

Nakon što usporediš 6 i 6, što si saznao? …ništa, zapravo. Vaga će se nagnuti na jednu stranu jer imamo različit zlatnik, ali pošto neznamo jel taj zlatnik lakši ili teži, mi i dalje nakon toga vaganja nemamo pojma jel uljez na lijevoj ili desnoj strani vage.

Ufuf, milijun rjesenja kroz glavu, uvik mi fali ili da mi kazes je li zlatnik laksi ili tezi, ili da mi das jos jedno vaganje. Al skonta san, ne mogu virovat da je ovako komplicirano…

Dakle prvo vaganje 4 i 4 random zlatnika.

  1. ako jedna strana pritegne, znaci da imamo 8 kandidata. preostala 4 su “normalne” tezine.
    uzmemo 3 random zlatnika sa teze strane, i prebacimo ih na laksu stranu. uzmemo 3 zlatnika sa lakse strane i maknemo ih sa strane. stavimo 3 neutralna na tezu stranu.
  • ako vaga ostane kako je bila (ista stana pritegne), 3. vaganje je između 2 kandidata - dakle jednostavno jednog usporedimo sa neutralnim.
  • ako se vaga okrene, znaci da je TEZI zlatnik na bivsoj laksoj strani, i imamo 3 kandidata za tezak zlatnik - usporedimo dva i to je to.
  • ako se vaga izravna - znaci da je LAKSI zlatnik od 3 koja smo makli sa bivse lakse strane. isto rjesenje ko gore - 3 kandidata za laksi zlatnik, usporedimo dva i voila.
  1. ako na prvom vaganju nista nije pritegnilo, znaci da su nam ostala 4 kandidata, ali ne znamo jel uljez laksi ili tezi. Vazemo 1 na 1.
  • ako jedna strana pritegne, jednog od tih usporedimo s neutralnim.
  • ako su u livelu, uljez je među preostala dva. jednog od preostala dva vazemo s neutralnim.

Valjda nisan priskocio koji use case.

Bravo! :slight_smile:

…bome je i meni ovako bilo, hehe. Baš pristojna kombinatorika unutar zagonetke :slight_smile:

Nego, vidiš…ja sam čak došao do lagano drugačijeg rješenja, umjesto tri kugle koje si prebacio, ja sam prebacio dvije sa teže strane na lakšu. (i popunio to sa samo jednom neutralnom)
A na lakšoj hrpi sam maknuo kraju tri kugle.

1.vaganje: Teža: AAAA , Lakša: BBBB , Sa strane stoje: CCCC

nakon prebacivanja:
2.vaganje: AAC - BAA , Sa strane stoje: BBB CCC

…a dalje vrijedi više-manje ista logika!

Sljedeće pitanje, više tricky pitanje…nego zagonetka.

Imate goste…pravite sendviče i režete salamu.
Nakon što ste narezali jednu salamu (rezali ste ploške pod okomito)…shvatite da su to jako malene ploškice…te da bi bilo bolje da sljedeću režete pod koso, kako bi ploškice bile ipak veće , no i dalje režete jednako tanke ploškice.

I tu vam se upali neki sumnjivi kliker u glavi i vaše misli postave sljedeće pretpostavke:
-ako režem jednako tanke ploške, dobit ću jednako ploški kao kad sam salamu narezao pod okomito.
-no ako imam jednako ploškica, a one su veće jer režem pod koso…onda sam stvorio više salame samim time što režem pod koso.

Očito je da vam je kliker u gornjim pretpostavkama negdje zakazao, no gdje je pogriješio??

P.S. ovo pitanje je nastalo izvorno tako što je meni zaista ovaj problem iskočio tamo u četvrtom srednjem dok sam rezao salamu :smiley: Trebalo mi je dosta da skontam odgovor… a pitanje se zaista pokazalo dosta teškim kad ga negdje postavim.

Pa nije bas da si rijesio, jer ti u ovom tvom slucaju fale jos najmanje dva vaganja, a s obzirom da si 2 vaganja vec odradio ostalo ti je samo jedno. Dakle sjedi i smisljaj ponovo.

Za PHPaše:

$broj = (int) ((0.1 + 0.7) * 10);

Koja je vrijednost varijable $broj?

Probajte u glavi izračunati pa napišite, nema varanja! :]

Nisi u pravu.

…kao što već rekoh, slijedi ista (tj. slična logika koju je već leffe raspisao)

  1. Ako vaga ne promjeni nagib na drugu stranu, uljez je u AA s lijeva, ili u B s desna (lako rješivo, samo se usporede A i A)

  2. Ako vaga promjeni nagib, uljez je u ova dva A koja smo prebacili na drugu stranu.

  3. Ako vaga dodje u ravnotežu, uljez je među BBB koje smo maknuli sa vage. Tu je opet dovoljno da usporedimo B i B.

Tako da, u sve tri kombinacije je dovoljno još samo jedno vaganje.

Hmmm…onako pod normalno bi rekao da je 8, ali očito nije… , možda nekim čudom 10710 xd ?

Prvo objasni zašto misliš da je tako. :]

Ne znam php, ali znam nesto visual basica. Dakle, ako ovo “int” znaci integer onda bi rijesenje moglo biti 10 jer automatski 0.8 zaokruzi na 1 i onda to mnozi sa 10?

haha, ovo mi smrdi da sam možda i pogodio.
Pa pretpostavio sam da cijeli izraz unutar zagrada promatra više kao string, tako da odbacuje sve što nema veze sa brojem ili float brojem. Pošto je INT u igri.
Ako tako grubo odrežemo izraz u zagradi dobijemo 010710 (odbacimo znači sve točke, operatore…ostale zagrade…)
Sad kad imamo 010710, ta brojka je predstavljena sa vrijednošću 10710

Griješiš. Mali hint obojici: Zagrade imaju prednost, znači castanje u integer s (int) će se dogoditi nakon svih operacija u zagradi? Dakle nema stringova, nego samo konačni tip podatka na kraju casta u integer i dobijemo… koji broj? :slight_smile:

7, a zasto je to tako treba pogledati na http://en.wikipedia.org/wiki/Floating_point i http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

Je, trebao si šutjeti još malo da se još netko ima priliku okušati.

Inace dobro pitanje za job interview. :slight_smile:

Pa i bilo mi je suludo to što rekoh… :slight_smile:

…a sad i kad znam da je 7 a ne očekivanih 8, teško je reći zašto. Valjda decimalni 8 nije 8.0 nego 7.999999 , a što je uzrok tomu…

P.S. Drago mi je da si se ti nama vratio na forum, a nadam se da se nakon one katastrofalne poplave i tvoja situacija vratila koliko toliko u normalu :wink:

Hvala, je bolje je. :]

Dakle, zadatak je sljedeći:

$broj = (int) ((0.7 + 0.1) * 10);

(int) je type-casting podatka u integer (cijeli broj). Dakle taj type-casting će pretvoriti podatak/vrijednost u integer, a u ovom slučaju vrijednost koju će pretvoriti je ((0.7 + 0.1) * 10). Da nemamo jednu otvorenu i zatvorenu zagradu, odnosno da je zadatak sljedeći:

$broj = (int) (0.7 + 0.1) * 10;

Onda bi se type-castanje vrijednosti odnosilo samo na (0.7 + 0.1), i onda se sve to pomnožilo s 10, što znači da bi se prvo vrijednost 0.8 type-castala u integer i dobili bismo 0, a zatim 0 puta 10 je… 0, i to bi bio konačni rezultat.

Vratimo se na prvotni zadatak… dakle gledamo sve u zagradi kao jednu vrijednost, i tu vrijednost ćemo type-castati u integer. Ako riješimo izraz ((0.7 + 0.1) * 10) dobijemo (0.79999999 * 10), a to je 7.9999999
Kada type-castamo 7.9999999 u integer s (int), dobit ćemo 7, očekivano, isto kao što bi iz vrijednost 6.7342 castanjem dobili 6, ili castanjem stringa “12 patuljaka” dobili integer 12. Ako ne castamo u integer prvotni zadatak, odnosno da je zadatak bio sljedeći:

$broj = ((0.7 + 0.1) * 10);

dobili bismo zaista 8.

Trik je što je to precision issue i zašto s 0.7 + 0.1 dobijemo 0.799999999 i zato ti preporučam da pročitaš ovaj drugi link koji je creatifcode poslao ako te već zanima. Jeste duži tekst, ali se odnosi zapravo na sve jezike a ne samo PHP pa će ti biti korisno štivo.

btw. ajde da vidimo tko će znati riješiti sljedeći zadatak, bez varanja naravno:

$broj = (int) ((0.6 + 0.1) * 10);