Spezzone offuscato per divertirvi :)


#1

questa è passata poco fa su #ruby-lang… i rubyisti
esperti forse la smontano al volo, ma è comunque
carina :slight_smile:

cosa stampa

p ?%./(!!???&/?^+0.0:!!?().class
?
Su questa invece c’è un warning altrimenti era molto
più bella :smiley:
p ?%./!!?
??&/?^+0.0:!!?(+?).class

non provate direttamente in irb che è disonesto :wink:


All New Yahoo! Mail – Tired of unwanted email come-ons? Let our
SpamGuard protect you. http://uk.docs.yahoo.com/nowyoucan.html


#2

gabriele renzi removed_email_address@domain.invalid writes:

questa è passata poco fa su #ruby-lang… i rubyisti
esperti forse la smontano al volo, ma è comunque
carina :slight_smile:

cosa stampa

p ?%./(!!?*??&/?^+0.0:!!?().class

?c é un carattere (numero intero)

! è la negazione ed é messo sempre doppio solo per far casino e
!!numero == true

ruby supporta le espressioni condizionali C-like test ? true-val :
false-val

l’espressione si semplifica con

(numero1 / ( true ? numero2/numero3 + 0.0 : true )).class

ovvero

(numero1 / (numero2/numero3 + 0.0)).class

il / di interi puo’ dare un intero o errore se il denominatore é 0.

Se non da errore (numero3 != 0) allora é un intero che + 0.0 fa un
Float. intero diviso float fa Float sempre. Quindi stampa Float

?
Su questa invece c’è un warning altrimenti era molto
più bella :smiley:
p ?%./!!?*??&/?^+0.0:!!?(+?).class

qui la cosa diversa é che mancano le parentesi quindi é

numero1 / ( true ? numero2/numero3 + 0.0 : true.class)

ovvero

numero1 / (numero4.to_f)

che da sempre un Float non capisco perché sia tanto diversa dalla
prima.

non provate direttamente in irb che è disonesto :wink:

Ora ho capito perché la seconda é diversa :slight_smile:


#3

— Luigi P. aka Matley removed_email_address@domain.invalid
wrote:

gabriele renzi removed_email_address@domain.invalid writes:

questa è passata poco fa su #ruby-lang… i
rubyisti
esperti forse la smontano al volo, ma è comunque
carina :slight_smile:

cosa stampa

p ?%./(!!?*??&/?^+0.0:!!?().class

(alessandro & luigi)++ bravi :slight_smile:

la seconda è più interessante non solo per il
risultato che è abbastanza inatteso… ma anche per la
porcata perlish che non si nota :slight_smile:

  ___________________________________________________________

Yahoo! Mail is the world’s favourite email. Don’t settle for less, sign
up for
your free account today
http://uk.rd.yahoo.com/evt=44106/*http://uk.docs.yahoo.com/mail/winter07.html


#4

On 6/5/07, gabriele renzi removed_email_address@domain.invalid wrote:

cosa stampa
p ?%./(!!?*??&/?^+0.0:!!?().class
?

Oddio, svegliarsi alla mattina e trovarsi in mail certe cose è un po’
traumatico. Io direi Float, ora però provo a dargli una spiegazione
che è la cosa più complicata…

Questa accozzaglia di roba usa parecchio la notazione ?carattere per
prelevare il valore ascii del carattere che segue il punto di domanda,
per cui ?%, ?, ?^ e ?( sono in realtà numeri e quindi ?%./( … )
dovrebbe essere una banale divisione tipo numero./(numero), con
l’operatore usato a mò di metodo anziché nella sua forma tradizionale
numero / numero. Dentro alla parentesi c’è l’operatore ternario (expr
? b : c) che genera la sua bella confusione e la condizione di expr è
nella realtà il valore numerico ?
con davanti !! che restituisce
quindi TRUE (possiamo pensare a !numero come la forma compatta di
!numero == TRUE # => FALSE, per cui il secondo ! nega il risultato
trasformandolo in TRUE). Pertanto diventa:

TRUE ? ?* / ?^ + 0.0 : !!?(

ovvero

TRUE ? numero / numero + 0.0 : !!numero

dal momento che TRUE è TRUE e non si scappa, viene ritornata la prima
condizione. A questo punto il tutto diventa:

numeroA / (numeroB / numeroC + 0.0)

Il risultato di numeroB / numeroC sommato a 0.0 restituisce un Float,
per forza di cose, allora il risultato di numeroA / numeroFloat è
comunque un Float.

Ma si sarà capito qualcosa?

non provate direttamente in irb che è disonesto :wink:

Non ho provato proprio, non per niente non ho idea dei valori dei vari
?%, ?*, ?^ e ? :smiley: Almeno è giusto?


#5

On 6/6/07, gabriele renzi removed_email_address@domain.invalid wrote:

(alessandro & luigi)++ bravi :slight_smile:

‘alessandro’.replace(‘daniele’)

(giuro che non era per farlo notare, ma solo per sparare 'sta ca**ata
:D)

la seconda è più interessante non solo per il
risultato che è abbastanza inatteso… ma anche per la
porcata perlish che non si nota :slight_smile:

Fortunatamente mi sono fermato alla prima parte della risposta di
Luigi, per cui sono ancora in tempo a giocarci (purtroppo questa
mattina sentivo l’ufficio che chiamava in lontananza)…