![]() |
#1
|
||||
|
||||
![]() Är det någon som kan klura ut vad denna lilla kodsnutt, som jag sprang på ute på det stora internet, gör. UTAN att provkompilera den eller googla fram den...
Kod:
#include <stdio.h> main(t,_,a) char *a; {return!0<t?t<3?main(-79,-13,a+main(-87,1-_, main(-86, 0, a+1 )+a)):1,t<_?main(t+1, _, a ):3,main ( -94, -27+t, a )&&t == 2 ?_<13 ?main ( 2, _+1, "%s %d %d\n" ):9:16:t<0?t<-72?main(_, t,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l,+,/n{n+\ ,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/\ +k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){n\ l]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#\ n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \ ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;\ #'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/") :t<-50?_==*a ?putchar(a[31]):main(-65,_,a+1):main((*a == '/')+t,_,a\ +1 ):0<t?main ( 2, 2 , "%s"):*a=='/'||main(0,main(-61,*a, "!ek;dc \ i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"),a+1);}
__________________
"The next time I have to come in here, I'm crackin' skulls!" - Mr Vernon, The Breakfast Club, 1985 |
#2
|
||||
|
||||
![]() Startar kaffekokaren när man kommer innanför dörren senare än kl 2 på dagen men innan kl8 samtidigt som den startar tvn och zappar fram något utav förvalda "favorit program" ur en lista och om inget sådant går just nu så ropar den
HELLO WORLD! Eller?
__________________
Linux är bara gratis om din tid är värdelös.. |
#3
|
||||
|
||||
![]() Jag har sett den där kodsnutten förut faktiskt men kommer banne mig inte ihåg vad den gör... Tror den skriver ut något iaf, rätt så säker.
__________________
Jag är från Norrland, jag. Ska ni ha ett barr ? ----- Sexmästerist ~ Västsex 07/10 Ledamot ~ Styrelsen, Västsex 08/10 Webbmästare ~ Västsex 09/10 |
#4
|
||||
|
||||
![]() Det är någon jobbig rekursion där så den skriver ut något där man håller på att upprepa sig hela tiden och lägger till något för varje iteration och det enda jag kommer på som följer de kriterierna är "Twelve Days of Christmas" men jag är inte säker då jag inte kan klura ut vad det är för text som skrivs ut.
__________________
+++ Melon melon melon +++ +++ Divide By Cucumber Error. Please Reinstall Universe And Reboot +++ |
#5
|
||||
|
||||
![]() Den returnar en hel hög med tecken iaf som skrivs ut till konsol på det "gamla hederliga" sättet...
Är inte "Twelve Days of Christmas" en sång?
__________________
I will rule you ALL with an iron fist! YOU! Obey the fist! Senast redigerad av zmurf den 2009-03-02 klockan 09:09. |
#6
|
|||
|
|||
![]() OK. Jag fuskade, och kompilerade programmet. Det kompilerar dessutom helt utan några varningar med gcc, något som man inte kan säga om alla "fulkodade" program
![]() Frågan som följer nu är istället, går det att "bena ut" koden, så att man kan förstå att den gör det den gör? /Jonas |
#7
|
||||
|
||||
![]() Den blir lite med begriplig när man benar ut villkorssatserna:
Kod:
main(first,second,a) char *a; { return !0 < first ? first < 3 ? main(-79,-13,a + main(-87,1-second, main(-86, 0, a+1 ) +a) ) : 1,first < second ? main(first+1, second, a ) : 3, main ( -94, -27+first, a) && first == 2 ? second < 13 ? main ( 2, second+1, "%s %d %d\n" ) : 9 : 16 : first < 0 ? first < -72 ? main(second,first,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l,+,/n{n+,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/") : first < -50 ? second == *a ? putchar(a[31]) : main(-65,second,a+1) : main((*a == '/')+first,second,a+1) : 0 < first ? main ( 2, 2 , "%s") : *a == '/' || main(0, main(-61,*a, "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry") ,a+1); }
__________________
"The next time I have to come in here, I'm crackin' skulls!" - Mr Vernon, The Breakfast Club, 1985 Senast redigerad av SuperFly den 2009-03-02 klockan 10:46. |
#8
|
||||
|
||||
![]() Jag har inte fuskat (inte än iaf.. Tänker kompilera och köra det ganska snart för att testa en teori). Men vad jag kommit fram till är att koden rekurserar in nya värden i en char pekare för att skriva ut text i konsolen... Jag vet inte riktigt vad Digitalmannen syftade på med "Twelve Days of Christmas", men med tankte på att han nämner det så kan jag ju göra ett antagande att texten som skrivs ut är texten till den sången. Något jag aldrig skulle kunna komma fram till bara genom att titta på koden.
... Nu ska jag iaf testa programet för att se om jag har rätt...
__________________
I will rule you ALL with an iron fist! YOU! Obey the fist! Senast redigerad av zmurf den 2009-03-02 klockan 10:47. |
#9
|
||||
|
||||
![]() Kan noll C-programmering så jag fuska och kompilera.
Men kanske coolt att den kodsnutten kan generera den outputen. ![]()
__________________
Suppleant SIST 09/10 Sekreterare WYSIWYG 09/10 Vice ordförande WYSIWYG 08/09 Dream as if you'll live forever. Live as if you'll die today. James Dean En sån froktansvärd människa du har blivit Gundela. Hur kunde detta hända? Jag som blev så bra! om nom nom nom.... |
#10
|
|||
|
|||
![]() Här kommer en alternativ utbrytning. Gjorde samma variabelsubsitution som SuperFly, men bröt även ut strängarna och indenterade mer...
Kod:
#include <stdio.h> char str1[] = "@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l,+,/n{n+\ ,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/\ +k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){n\ l]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#\ n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \ ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;\ #'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/"; char str2[] = "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"; main(first,second,a) char *a; { return !0<first ? first<3 ? main(-79,-13,a+main(-87,1-second, main(-86, 0, a+1 )+a)) : 1,first<second ? main(first+1, second, a) : 3,main ( -94, -27+first, a)&&first == 2 ? second<13 ? main ( 2, second+1, "%s %d %d\n" ) : 9 : 16 : first<0 ? first<-72 ? main(second, first, str1) : first<-50? second==*a ? putchar(a[31]) : main(-65,second,a+1) : main((*a == '/')+first,second,a+1 ) : 0<first ? main ( 2, 2 , "%s") : *a=='/'||main(0,main(-61,*a, str2),a+1) ; } Kod:
int pr(char *s, int i) { printf("[%s (%d)]", s, i); return i; } |
#11
|
||||
|
||||
![]() Jag är glad att jag inte läste programmeringsspåret
![]()
__________________
"If a hooker comes to your room by mistake, you dont have to pay her" |
#12
|
||||
|
||||
![]() Ahaa... Då är jag med på spåret. Tyckte dom raderna såg lite mysko ut...
__________________
"The next time I have to come in here, I'm crackin' skulls!" - Mr Vernon, The Breakfast Club, 1985 |
#13
|
||||
|
||||
![]() @Superfly:
Hade inte du strukturerad programering med C i ettan? där fick iaf vi lära oss det där... ![]()
__________________
I will rule you ALL with an iron fist! YOU! Obey the fist! |
#14
|
||||
|
||||
![]() Har helt glömt av den grejjen. Har aldrig använt den sedan dess, ändå har jag skrivit MÅNGA rader C-kod efter det.
__________________
"The next time I have to come in here, I'm crackin' skulls!" - Mr Vernon, The Breakfast Club, 1985 |
#15
|
|||
|
|||
![]() Citat:
![]() Både min och SuperFly's indentering missade att komma-operatorn är den operator som har lägst prioritet av alla operatorer. Den rankas t.ex. lägre än tilldelningsoperatorerna, vilka i sin tur är lägre än frågetecken-kolon (? : ). Jag har arbetat om koden, tagit bort alla ? : och faktoriserat den lite. Har däremot inte analyserat den vidare, och kunde därför inte ge funktionerna så vettiga namn... Men det kanske hjälper oss vidare i den fulla förståelsen av det gåtfulla programmet? Verkar som att tabbar blir konverterade till mellanslag... Tja, koden hittar därför också på: http://cumulus.ei.hv.se/~imjam/pub/code6.c Kod:
#include <stdio.h> char str1[] = "@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l,+,/n{n+\ ,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l q#'+d'K#!/\ +k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# ){n\ l]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#\ n'wk nw' iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \ ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;\ #'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/"; char str2[] = "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:\nuwloca-O;m .vpbks,fxntdCeghiry"; first_lt_3(second,a) char *a; { return main(-79,-13,a + main(-87,1-second, main(-86, 0, a+1)+a)); } knegasus(second) { if(second < 13) return main(2, second+1, "%s %d %d\n"); else return 9; } balder(first,second, a) char *a; { return main(-94, first-27, a) && first == 2; } poom(first,second, a) char *a; { if(first < second) main(first+1, second, a); if(balder(first, second, a)) knegasus(second); } first_gt_1(first, second, a) char *a; { int x; if(first < 3) x = first_lt_3(second, a); else x = 1; poom(first,second, a); return x; } drutt(first, second, a) char *a; { int x; if(first < -50) if(second == *a) x = putchar(a[31]); else x = main(-65, second, a+1); else x = main((*a == '/') + first, second, a+1); return x; } first_lt_0(first, second, a) char *a; { if(first < -72) return main(second, first, str1); else return drutt(first,second,a); } finale(char *a) { return *a=='/' || main(0,main(-61,*a, str2),a+1); } main(first,second,a) char *a; { if(first > 1) return first_gt_1(first, second, a); else if(first < 0) return first_lt_0(first, second, a); else if(first > 0) return main(2, 2, "%s"); else return finale(a); } |
#16
|
||||
|
||||
![]() Citat:
![]() angående "a=b,c;" så förstod jag det lite som att man kan använda det tillsammans med dubbla arv i C++ (med hjälp av dubbla arv kan man då få två methoder i olika klasser att execuveras med påverkan av varandra... ). En typ av överlagring helt enkelt. Kan vara användbart i mycket få fall... Men ska förslagsvis inte användas. Killen har använt sig av mycket saker man inte betraktar som "good coding practice". Att ens använda sig av "? :" istället för if-satser brukar ju testare se med ganska onda ögon på. (Det är tydligen svårt att testa sådana uttryck). Att då nestla dem blir de nog inte gladare av...
__________________
I will rule you ALL with an iron fist! YOU! Obey the fist! Senast redigerad av zmurf den 2009-03-03 klockan 08:31. |
#17
|
||||
|
||||
![]() Det heter inte "Obfuscated" för inte...
![]() BTW, författaren till kodsnutten heter Jim Coplien. (hint hint)
__________________
"The next time I have to come in here, I'm crackin' skulls!" - Mr Vernon, The Breakfast Club, 1985 |
#18
|
|||
|
|||
![]() Hej igen!
Känner att något mer bör sägas om komma-operatorn, för att framtida förvirring skall kunna undvikas (eller kanske medvetet skapas...). Som jag tidigare skrev, så gör uttrycket c = a, b; att variabeln c tilldelas värdet i variabeln a, detta eftersom kommaoperatorn evaluerar strikt från vänster till höger. Det sker en tilldelning och sedan evalueras b, men ingen tar hand om det värdet (i vårt exempel). För att krångla till det ytterligare, så evaluerar uttrycket a,b,c till... c! Detta för att hela den kommaseparerade listan evalueras som det sista uttrycket i listan!. Det betyder att variabeln d i uttrycket: d = (a, b, c); tilldelas värdet av c! Eftersom tilldelningen (lika-med) har högre prioritet, så måste uttrycket sättas inom parantes. Bieffekter träder dock i kraft i tur och ordning, så vad ger C-satsen: a=2, b=8, c=(a+=2, b--); för värden på a, b och c? Den vanligaste användningen (om man bortser från att skriva kod som ingen begriper) är att initiera eller räkna upp flera variabler i en for()-slinga: for(i=0, j=10; j >0 ; i++, i--) { ... }. Man kan lätt blanda ihop komma-operatorn med kommatecknet som används för att separera argument till funktioner och dyligt, men det är inte samma operator. För att använda kommaoperatorn i funktionsargument måste den sättas inom paranteser: f(a, (b, c), d) ger samma resultat som f(a, c, d) Om kommaoperatorn på Wikipedia. Någon menade, i sin blogg, på att operatorn är väldigt Lisp-lik. En sida som handlar om konstiga operatorer tar upp både kolon-frågetecken och kommaoperatorn, och anser samtidigt att kommaoperatorn ...wins the prize for ‘most obscure operator’. Så det är ju inte konstigt att vår vän C-kodaren använt denna i syftet att förvilla läsaren... Senast redigerad av Jonas A den 2009-03-03 klockan 23:46. |
#19
|
||||
|
||||
![]() @Jonas A:
Ahaa... trevlig läsning. Det jag fick förklarat för mig handlade om att skriva självmodiferande kod. som du säkert känner till så kan man ha dubbla arv i en class i C++. Det som jag blev visad hadlade om att skriva något i still med. a = arv::ärvdmethod1(a,b,c), arv::ärvdmethod2(a,b,c); på så vis kunde det returnerade värdet från den första ärvda methoden påverkas av den andra ärvda methoden så att värdet i variabel a var beroende på tillståden i respektive method. Jag är inte helt säker på om detta är helt rätt sätt att skriva utrycket på, men något i den stilen var det iaf.... Det var 3-4 år sedan jag blev visad detta... men lite kul är det. ![]()
__________________
I will rule you ALL with an iron fist! YOU! Obey the fist! |
#20
|
||||
|
||||
![]() Jag stämmer in med smufen, intressant läsning, så nu känner man sig lite klarare över komma-operatorn. Men bara lite...
![]()
__________________
"The next time I have to come in here, I'm crackin' skulls!" - Mr Vernon, The Breakfast Club, 1985 |
![]() |
Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster) | |
Ämnesverktyg | |
Visningsalternativ | |
|
|