Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Quiz PHP
Forum PHP.pl > Inne > Hydepark
Stron: 1, 2
cojack
Mam pomysł by zacząć Quiz php, kto pierwszy odpowie poprawnie na zadane pytanie ma prawo do zadania kolejnego pytania, i tak dalej.

Trafiłem na fajne pytanie na forum goldenline, i zamierzam je Wam tu wkleić:

Cytat
to może ktoś się podejmie bardziej hardcorowego zadania:
program który wyprintuje własny kod i będzie się zawierać w 1 pliku
na ekranie po uruchomieniu skryptu ma się pojawić dokładnie to samo co jest w pliku
żeby nie było za łatwo - nie można w żaden sposób odczytywać pliku w którym jest zapisany kod tego programu
dodam że jest to wykonalne ;D

Krzysztof Korzeniewski edytował(a) ten post dnia 18.08.10 o godzinie 22:17


Link: http://www.goldenline.pl/forum/1647030/php-quiz/s/4

Ja nie mam pojęcia jak to zrobić w php, by w samym pliku, wypluć wszystko począwszy od <?php do miejsca w którym wypluwamy kod. Jak ktoś wie jak to zrobić to czekam ;]
Wicepsik
show_source winksmiley.jpg

//edit
Chyba nie doczytał?em pytania, bo nie można odczytywać pliku dry.gif
thek
Nie wiem, czy drążę w dobrą stronę, ale coś mi się widzi, że trzeba będzie użyć przekierowania strumienia. Aczkolwiek zgaduje teraz smile.gif
Blame
Jako, że ma to być program, to chyba takie rozwiązanie odpada, ale zawsze można wyłączyć interpretację plików php przez parser winksmiley.jpg
everth
@Blame, niekoniecznie. Na bezczela można by zrobić tak:
  1. <?
  2. $test ='czymkolwiek';
  3. $test2 = 'cokolwiek';
  4. passthru('php -w '.__FILE__,$return);
  5. echo $return;
  6. ?>

i bronić się że przecież nasz skrypt nie odczytuje bezpośrednio tylko zleca wykonanie parserowi PHP, ale to nie jest rozwiązanie smile.gif

Przeglądałem manual na wszystkie strony i o ile nie istnieje jakaś nieudokumentowana funkcja która pozwala dobrać się do cache Zend Engine to raczej nie widzę rozwiązania. Może @thek pije w dobrą stronę ale ja się poddałem.
Fifi209
Cytat(Blame @ 20.08.2010, 22:07:57 ) *
Jako, że ma to być program, to chyba takie rozwiązanie odpada, ale zawsze można wyłączyć interpretację plików php przez parser winksmiley.jpg


ale on ma wyprintować swój kod... nie serwer tylko on sam.

@topic
jestem bardzo ciekawy rozwiązania haha.gif
devnul
Quine
poniżej przykład
  1. <?
  2. $a='chr(60).chr(63).chr(10).chr(36).chr(97).chr(61).chr(39).$a.chr(39).chr(59).chr(10)."echo $a;".chr(10).chr(63).chr(62)';
  3. echo chr(60).chr(63).chr(10).chr(36).chr(97).chr(61).chr(39).$a.chr(39).chr(59).chr(10)."echo $a;".chr(10).chr(63).chr(62);
  4. ?>
  5.  
  6. <?
  7. $a='<?
  8. $a=2;
  9. echo str_replace(1+1,chr(39).$a.chr(39),$a);
  10. ?>';
  11. echo str_replace(1+1,chr(39).$a.chr(39),$a);
  12. ?>


lub tak:
  1. <?php $c='echo \'<?php $c=\\\'\'.addslashes($c).\'\\\';eval($c) ?>\';';eval($c) ?>


Ponieważ mogę ale nie muszę zadać kolejne pytanie to sobie daruję. Mimo to miłej zabawy - w razie czego znowu wam ją popsuję winksmiley.jpg
cojack
Hahaha, wiedziałem że to będzie coś z evalem. Ten drugi przykład to jeszcze rozumiem, ale tego pierwszego to niestety ;]


Ale nie jestem pewien, że autorowi pytania o takie rozwiązanie chodziło, gdyż w Twoim przykładzie devnull trzeba 2x ten sam kod napisać by go wyprintować i by wyglądał jakby się sam wyprintował.
Fifi209
Mi się zdaje bardziej, że jeżeli skrypt wygląda tak:
  1. <?php
  2.  
  3. $cos = 2;
  4.  
  5. ?>


to ma wyprintować od <?php do ?> sam siebie
cojack
Zgadzam się.
Blame
@cojack Wiesz w ogóle jakie ma być rozwiązanie? tongue.gif
devnul
@cojack: jestem pewien że dokładnie o to chodziło autorowi, "problem" jest stary jak samo programowanie i na tym polega cała "trudność" że w żaden sposób fizycznie się do kodu nie dobieramy. To co wkleiłem to tylko 2 z setek różnych możliwości - przy odrobinie wysiłku i zrozumieniu problemu można bez trudu napisać coś takiego samemu, a wersja z evalem to tylko czysty przykład, w pierwszej podanej przeze mnie możliwości eval nie występuje a wynik jest dokładnie taki sam (wyprintowanie własnego kodu).

@fifi209: źle Ci się zdaje. Podany przez Ciebie przykład nie ma racji bytu bo niby jak chcesz wydrukować kod programu nie dobierając się do jego źródła? Chodzi właśnie o takie napisanie programu żeby w jego kodzie zawrzeć go ponownie.

Rety ludzie to przecież są podstawy programowania. Nie chce mi się wierzyć że to dla was taka czarna magia. Zagadnienie wymaga trochę wiedzy i umiejętności myślenia na trochę wyższym poziomie abstrakcji niż surykatka ale przy odrobinie wysiłku jest do zrobienia przez każdego.

Pokrewne chociaż rzadziej spotykane reverse Quine - czyli wypisanie źródła programu ale od końca do początku. Ktoś spróbuje?
phpion
Cytat(devnul @ 21.08.2010, 13:30:11 ) *
Rety ludzie to przecież są podstawy programowania. Nie chce mi się wierzyć że to dla was taka czarna magia. Zagadnienie wymaga trochę wiedzy i umiejętności myślenia na trochę wyższym poziomie abstrakcji niż surykatka ale przy odrobinie wysiłku jest do zrobienia przez każdego.

Jakie podstawy? To, że kiedyś gdzieś zasłyszałeś o takiej metodzie nie powoduje zakwalifikowania jej do podstaw. Nie udawaj znowu takiego cwaniaka, dla którego to pestka. Sam wkleiłeś kody z Wikipedii; nie sądzę byś miał z nimi do czynienia na co dzień.
cojack
Cytat(Blame @ 21.08.2010, 12:45:15 ) *
@cojack Wiesz w ogóle jakie ma być rozwiązanie? tongue.gif


Nie znam rozwiązania winksmiley.jpg
devnul
@cojack: to już znasz, jeżeli wątpisz proponuję skontaktować się z autorem pytania na goldenline

@phpion: jej, jak mi wstyd - wybacz że nie chciało mi się pisać tego o wpół do drugiej w nocy i posłużyłem się przykładami z wikipedi (do której niemalże zalinkowałem), z czym wcale się nie kryję. Może trochę przesadziłem pisząc o podstawach ale nie zmienia to faktu że każdy kto trochę się zajmuje programowaniem się z tym zetknął. Problem w tym że dzisiaj większość rzeczy pisze się korzystając z frameworków a na boczny tor schodzi kompletnie umiejętność logicznego myślenia bo robią to za nas autorzy tych właśnie "magicznych" narzędzi. Mimo wszystko dla kogoś ze "starej szkoły" quine to moim zdaniem nic nowego. Przynajmniej ja się z tym zetknąłem w czasach gdy jeszcze internet się przenosiło na dyskietkach? Poniżej masz coś napisanego na szybko tak specjalnie dla Ciebie żebyś mi nie deptał po ego. Pozdrawiam i bez urazy winksmiley.jpg

  1. <?php
  2. $supertajne = 'PD9waHAKJHN1cGVydGFqbmUgPSAnUG96ZHJvd2llbmlhIGRsYSBQSFAucGwnOwplY2hvIHN0cl9yZXBs
    YWNlKGNocig4MCkuY2hyKDExMSkuY2hyKDEyMikuY2hyKDEwMCkuY2hyKDExNCkuY2hyKDExMSkuY2hyK
    DExOSkuY2hyKDEwNSkuY2hyKDEwMSkuY2hyKDExMCkuY2hyKDEwNSkuY2hyKDk3KS5jaHIoMzIpLmNoci
    gxMDApLmNocigxMDgpLmNocig5NykuY2hyKDMyKS5jaHIoODApLmNocig3MikuY2hyKDgwKS5jaHIoNDY
    pLmNocigxMTIpLmNocigxMDgpLCAkc3VwZXJ0YWpuZSwgYmFzZTY0X2RlY29kZSgkc3VwZXJ0YWpuZSkp
    OyAKPz4= '
    ;
  3. echo str_replace(chr(80).chr(111).chr(122).chr(100).chr(114).chr(111).chr(119).chr(105).chr(101).chr(110).chr(105).chr(97).chr(32).chr(100).chr(108).chr(97).chr(32).chr(80).chr(72).chr(80).chr(46).chr(112).chr(108), $supertajne, base64_decode($supertajne));
  4. ?>


//edit: @phpion: no i oczywiście masz rację nie mam z tym do czynienia na co dzień bo jest to problem typowo akademicki w życiu codziennym (niemal) zupełnie do niczego Ci się nie przyda, niemniej jednak dalej uważam że każdy kto ma do czynienia z programowaniem powinien przynajmniej spróbować napisać quina w dowolnym języku ot choćby po to żeby się sprawdzić lub nauczyć czegoś nowego. Nie uważasz?
#luq
Cytat(devnul @ 21.08.2010, 14:53:40 ) *
Może trochę przesadziłem pisząc o podstawach ale nie zmienia to faktu że każdy kto trochę się zajmuje programowaniem się z tym zetknął.


To raczej jest ciekawostka/zagadka dla zapaleńców a nie coś co każdy powinien znać. No nie przesadzajmy.
Tak samo rozwiązywałem kiedyś pewne zadania, wszystko miało działać a kodu miało być jak najmniej tylko umiesz. Czysta zabawa nic więcej. Zresztą spróbuj sam http://nullcode.pl/zadanie-2-ilo-t80.html?...4cb2fc4bea28d97 bo ja się wkręciłem nad udoskonalaniem swojego kodu winksmiley.jpg Pobij przynajmniej mnie, (oczywiście mówimy o PHP) zresztą nie sądzę żebyś miał z tym problem smile.gif
Wicepsik
  1. function table($w, $h){
  2. $b=1;
  3. printf("%'x".($w*6+1)."s", '');
  4. for($i=0;$i<$h;$i++){
  5. echo "\nx";
  6. for($j=0;$j<$w;$j++){
  7. printf("%' 4d x", $b);
  8. $b++;
  9. }
  10. }
  11. printf("\n%'x".($w*6+1)."s\n", '');
  12. }

199 biggrin.gif
erix
Ale to nie zmienia faktu, że to głównie sztuka dla sztuki. Wiedza dla odczytania tylko własnego kodu jest... w jakiś sposób użyteczna?

~Wicepsik, kiedyś pomagałem kumplowi pisać program do przeliczania pewnego wzoru. No i miał być wykres. No to zrobiliśmy. Tylko że dopiero potem prowadzący powiedział, że to w excelu. biggrin.gif

A my zrobiliśmy taki a'la w lame przy kodowaniu. biggrin.gif
#luq
@Wicepsik kody były sprawdzane w konsoli i należy korzystać z tablicy $argv.
Poza tym po co Ci funkcja! To są zbędne znaki winksmiley.jpg Ale też musisz dodać jakiś znacznik rozpoczęcia kodu PHP. Ja miałem 151 znaków i jestem z tego dumny winksmiley.jpg
devnul
  1. <?list(,$a,$b)=$argv;echo$c=str_repeat(x,$a*6+7)."\nx";for(;$i<$b*$a;$i++)echo str_pad($i%$a*$b+1+floor($i/$a),5,' ').($i%$a==$a-1?"x x\n".$c:x);
zakładam że Twój wynik to 151 u mnie 149 i da się jeszcze trochę uprościć

@Wicepsik: Twoje rozwiązanie działa niezbyt dokładnie (bramowanie jest krzywe) no i dodatkowo brakuje Ci ostatniej pustej kolumny

@erix: niby sztuka dla sztuki ale jednak jakaś tam gimnastyka dla głowy jest
Wicepsik
Cytat(devnul @ 21.08.2010, 17:40:03 ) *
@Wicepsik: Twoje rozwiązanie działa niezbyt dokładnie (bramowanie jest krzywe) no i dodatkowo brakuje Ci ostatniej pustej kolumny

http://nullcode.pl/zadanie-2-ilo-t80.html?...c4bea28d97#p347
Cytat
Nie, ostatnia kolumna tez musi byc ponumerowana
przypadek sprawił że źle to wyszło na screenie i ktoś wywnioskował że skrajna prawa ma być pusta - nie , ma być zapełniona liczbami jak każda inna smile.gif
devnul
@Wicepsik: nie doczytałem tam - uznałem że treść zadania jest poprawna, w takim razie zwracam honor co do tej pustej kolumny jednak i tak masz 1x za dużo w pierwszym wierszu obramowania oraz drobny błąd logiczny powodujący że całość rozsypie się przy 5 cyfrowych liczbach no i nigdzie nie pobierasz parametrów wejścia tak jak i zupełnie zbędna jest ta funkcja
poprawiony kod w takim razie 144 znaki i nadal da się uprościć winksmiley.jpg
  1. <?list(,$a,$b)=$argv;echo$c=str_repeat(x,$a*6+1)."\n";for(;$i<$b*$a;$i++)echo x.str_pad($i%$a*$b+1+floor($i/$a),5,' ').($i%$a==$a-1?"x\n$c":'');


//edit: za szybko wkleiłem i wkradł się błąd
#luq
Błąd tongue.gif



No właśnie, a ja u siebie list() nie mam sciana.gif i operuje jak idiota na $argv[1], $argv[2] bo przypisanie tego do jednoliterowych zmiennych daje więcej kodu...
A trick, że nie trzeba zamykać kodu php:
Kod
?>

widziałem w rozwiązaniach innych osób, wcześniej o tym nie pomyślałem nawet i to też mi dało +2 znaki dry.gif

@edit po poprawieniu kodu:
jeszcze masz w ostatnim wierszu "goły" X który widać zresztą no powyższym screenie
devnul
SOA - nie wiem na czym to dopalasz ale ewidentnie mój kod działa poprawnie http://codepad.org/HYUIPftw - dodałem tylko na początku zdefiniowanie argumentów bo nie ma tam opcji zdefiniowania przekazywanych argumentów
#luq
Tak, teraz działa, edytowałeś swój post 2 razy? Zresztą nie ważne...
144 znaki. You are Rkingsmiley.png
erix

Ustaw czasem raportowanie błędów na E_STRICT. winksmiley.jpg
devnul
@erix: ja o tym wiem - jednak domyślnie jest ono wyłączone, poza tym założeniem jest stworzenie działającego kodu a ten działa, poza tym program odpalamy w konsoli a tam błędy domyślnie nie są wypluwane więc... winksmiley.jpg

//edit:

  1. <?list(,$a,$b)=$argv;echo$c=str_repeat(x,$a*6)."x\n";for(;$i<$b*$a;$i++)echo x.str_pad($i%$a*$b+1+floor($i/$a),5,' ').($i%$a<$a-1?'':"x\n$c");
po drobnych modyfikacjach 142
Fifi209
To może ja zadam coś:
Napisz kod, który zamieni liczbę 123 na odpowiednik w systemie binarnym i wyrzuci wynik na ekran.

Mój rekord: 82 znaki.

@edit
nie wolno używać gotowych funkcji do zmiany na system binarny
devnul
@fifi209: no proszę Cię, zaraz ktoś to przeniesie do działu humor
  1. echo decbin(123);
jak to można nazwać programem, to jest 1 (słownie: JEDNA) instrukcja. cmon...
Fifi209
Cytat(devnul @ 22.08.2010, 00:34:35 ) *
@fifi209: no proszę Cię, zaraz ktoś to przeniesie do działu humor
  1. echo decbin(123);
jak to można nazwać programem, to jest 1 (słownie: JEDNA) instrukcja. cmon...

chyba logiczne że musisz napisać swój kod nie używając wbudowanych funkcji do zamiany na system binarny

dodałem wzmiankę w pytaniu ;]
Wicepsik
63

  1. <?$l=123;while($l>0){$p=(($l%2)?1:0).$p;$l=floor($l/2);}echo$p;
Fifi209
Może i mniej, ale zły wynik daje winksmiley.jpg
devnul
moje 62 nieco inną metodą i dobry wynik ale da się usprawnić
  1. <?$n=123;for ($l=1;$l<=$n;$l*=2)$b=(($l&$n)==$l?1:0).$b;echo$b;


//edit:
również 62 korzystając ze zmienionej wersji kolegi Wicepsika
  1. <?for($n=$l=123;$l>0;$l=floor($l/2))$b=(($l%2)?1:0).$b;echo$b;
a u siebie w kodzie to się zapędził i 1 z 0 miejscami wystarczy zamienić przy podstawianiu
Fifi209
devnull Twój wynik jest dobry. Póki co jesteś na prowadzeniu winksmiley.jpg
wicepsik - po edycji postu Twój kod daje dobry wynik
devnul
wow fifi dzięki za uświadomienie - no jakbyś za mnie nie sprawdził to bym nie zauważył że mój wynik jest dobry winksmiley.jpg
i jedna uwaga techniczna gdzie wy tam widzicie drugie L? jest devnul <------JEDNO L, nie pierwszy raz w tym wątku zresztą

  1. <?for($l=123;$l>0;$l=floor($l/2))$b=(($l%2)?1:0).$b;echo$b;

lekko podrasowana wersja tego co wyżej 59 znaków

//edit:
  1. <?for($l=123;$l>0;$l=$l>>1)$b=(($l%2)?1:0).$b;echo$b;

53 i coś mi mówi że więcej z tego nie wycisnę


//edit2:
a jednak tongue.gif 43 znaki
  1. <?for($l=123;$l;$l>>=1)$b=($l%2).$b;echo$b;

teraz to już naprawdę się uprościć nie da
cojack
To miałbyć Quiz PHP a nie ścigać się kto napisze krótszy program, głupi jesteście i tyle, nawet mi się czytać tych durnych postół devnulla i fifiego którzy rywalizują pomiędzy sobą, kto jest lepszy, kto napisze krótszy kod.
kwiateusz
ja to zawsze myślałem że faceci się przechwalają który ma dłuższego, a tu wrecz odwrotnie... Kto ma krótszego ten jest maczo

p.s. krótszego koda oczywiście winksmiley.jpg
devnul
@cojack: nie przesadzaj, zacząłeś quiz pytaniem na które nie znałeś odpowiedzi

@kwiateusz: ja zawsze powtarzam że nie liczy się długość a jakość tongue.gif
flashdev
Cytat(devnul @ 22.08.2010, 01:00:30 ) *
[...]
  1. <?for($l=123;$l;$l>>=1)$b=($l%2).$b;echo$b;

teraz to już naprawdę się uprościć nie da


  1. <?for($l=123;$l;$l>>=1)echo$l&1;
  2. // 32
devnul
@flashdev: genialne, szkoda że wynik daje od tyłu, no ale działa, kto by się tam kolejnością bitów przejmował winksmiley.jpg
flashdev
Cytat(devnul @ 22.08.2010, 13:30:06 ) *
[...]


Ty się nigdy nie mylisz? Nie musisz być taki złośliwy.
devnul
jej, przepraszam, następnym razem zapytam czy mogę zwrócić uwagę na fakt że się mylisz, wyluzuj, będzie dobrze
SHiP
To ja mam dwie zagadki - ciekawostki smile.gif
1. Jak najszybciej sprawdzić, czy liczba jest (nie)parzysta. Bez używania dzielenia modulo czy nawet zwykłego
2. Mając zmienne $a oraz $b wymień w nich wartości nie używając innych zmiennych np. dla $a=3, $b=5 należy otrzymać $a=5, $b=3
Wicepsik
Cytat(SHiP @ 31.08.2010, 22:01:04 ) *
1. Jak najszybciej sprawdzić, czy liczba jest (nie)parzysta. Bez używania dzielenia modulo czy nawet zwykłego


  1. if($liczba & 1) echo 'nieparzysta'; else echo 'parzysta';
devnul
do pierwszego się zgadzam z Wicepsikiem co do drugiego to:
  1. list($a,$b)=array($b,$a);
SHiP
No to podbijam. Da się bez użycia list(). smile.gif
EDIT:
Swoją drogą to tworzysz tutaj tablicę więc nie spełnia to warunków.
devnul
miało być najprostsze i bez tworzenia zmiennych, nie utworzyłem zmiennej, więc IMO ok no ale niech Ci będzie
  1. $a=3;
  2. $b=5;
  3. $a=$a*$b;
  4. $b=$a/$b;
  5. $a=$a/$b;
  6. echo $a." ".$b;
thek
Co drugiego da się to zrobić operacjami matematycznymi, sumy i odejmowania obu pomiędzy sobą smile.gif

$a=$a+$b;
$b=$a-$b;
$a=$a-$b;

$a = 3 + 5;
$b = 8 - 5
$a = 8 - 3

I mamy swapnięte. Z mnożeniem i dzieleniem nie jestem pewien czy zawsze działa, Musiałbym sprawdzić smile.gif
devnul
@thek: dzielenie i mnożenie również zawsze działa, podobnie jak Twój przykład także dla zmiennoprzecinkowych
inny przykład z użyciem tylko jednego operatora (tutaj jednak już bez zmiennoprzecinkowych, jednak założenia podane przez SHiPa również spełnia)
  1. $a=3;
  2. $b=5;
  3. $a=$a^$b;
  4. $b=$a^$b;
  5. $a=$a^$b;
  6. echo $a." ".$b;
NuLL
Zamiana zmiennych
  1. $a ^= $b ^= $a ^= $b
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.