Jump to content
em

30 secs, C challenge

Recommended Posts


#include <stdio.h>
int main()
{
if(/*AICI*/)
printf("Mata-i");
else
printf(" grasa!");
return 0;
}

Maxim 15 caractere acolo (inlocuiti /* AICI */). Vreau sa afiseze "Mata-i grasa!".

Rezolvari PM. Comentarii aici. Se inchide dupa primii 5.

Hint: Cei care se joaca cu linux pot rezolva foarte usor asta .. ce ne facem cu cei de pe Windows?

Solvers:

- sulea

- Elf (>10 chars)

- cifratorul - varianta fara furculite, nice.

- keller

- Vic

- R3al

Edited by em
Link to comment
Share on other sites

Am stat 4-5 ore la ea... tot nu am reusit sa imi dau seama cum poti sa "corupi" if-ul...

Nu asta era ideea. Nu e algoritmica aici...

Probabil dupa ce o sa vezi diverse solutii o sa ti se para o prostie ... de fapt asta si e .. just a trick. Nu te simti prost daca nu stii acum.

Link to comment
Share on other sites

eu am incercat si alte variante nu numai fork sau printf ce gasesti pe google. initial am incercat sa bag niste asm in conditia de if da nu mi-a inghitit compilatorul asa ceva. asa ca ce mi-a mers cat de cat a tinut cont de faptul ca toate aceste stringuri constante ce apar ca parametri sunt stocate de compilator in aceeasi zona de memorie.

Link to comment
Share on other sites

eu am incercat si alte variante nu numai fork sau printf ce gasesti pe google. initial am incercat sa bag niste asm in conditia de if da nu mi-a inghitit compilatorul asa ceva. asa ca ce mi-a mers cat de cat a tinut cont de faptul ca toate aceste stringuri constante ce apar ca parametri sunt stocate de compilator in aceeasi zona de memorie.

magaresti cumva nullul primului string?

Link to comment
Share on other sites

Rezolvari:

Prima e doar pe linux, a treia depinde de arhitectura, se poate gasi o rezolvare echivalenta pe orice arhitectura


#include <stdio.h>
int main()
{
if(fork())
printf("Mata-i");
else
printf(" grasa!");
return 0;
}


#include <stdio.h>
int main()
{
if(printf("Mata-i")==0)
printf("Mata-i");
else
printf(" grasa!");
return 0;
}


#include <stdio.h>
int main()
{
if(!puts(""+1))
printf("Mata-i");
else
printf(" grasa!");
return 0;
}


#include <stdio.h>
int main()
{
if(1
#define else
)
printf("Mata-i");
else
printf(" grasa!");
return 0;
}

  • Upvote 1
Link to comment
Share on other sites

Nice! La redefinirea else ma gandisem si eu, dar are mai mult de 10 char...

Puteti elabora putin asupra metodei 3? Ce face mai exact acel puts?

puts(""+1)

Eu am presupus ca se transforma in ceva asemanator

; ...
str0 db "$"
str1 db "Mata-i$"
str2 db " grasa!$"
; ...

;
; puts(""+1)
;

; get address of ""+1
mov dx, offset prompt ; dx = &str0
add dx, 1 ; dx = &str1
;puts
mov ah, 9h
int 21h

; ...

dar asta ar depinde foarte mult si de compilator, cum stocheaza el datele in imagine, etc.

Link to comment
Share on other sites

da. te uiti in fereastra de dissasembly, pui breakpoint undeva, vezi la ce adresa sunt stringurile, deschizi si o fereastra de memory ca sa te uiti la adresa aia, si de acolo vezi ce diferenta trebuie adunata ca sa ajunga la stringul urmator. din cateva incercari o sa reusesti.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...