Newsgroup: it.hobby.scacchi
Titolo: pgm x ribaltare un diagramma

scusate se riprendo da qui
pigrizia di cambiar pagina,
il discorso ha preso una strada diversa dalle mie intenzioni, molto piu'
innocenti
mi basta uno schifosissimo, puzzolente, insignificante, primitivo
tracciato record del FEN
cosi' posso convertirmi la posizione.
non mi frega niente della ricerca delle motivazioni tattiche valide che
giustificano una combinazione, che ovviamente esulano dai colori, o con
quale strategia di mediogioco si e' arrivati a quella posizione.
non e' questo il mio scopo
vorrei solo ribaltare una posizione, a costo di colorarla a matita
per questo chiedevo se un pgm lo fa gia', senza scrivermi io il codice.
se montaruli ce l'ha gia' mi risparmio di studiarmi il tracciato record
e farmelo. tutto qui.
il discorso tecnico esula dai contenuti di questo ng.
quindi per non rompere le scatole a nessuno, si potrebbe continuare per
email...
ciao 
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 e farmelo. tutto qui.
La struttura della stringa FEN è talmente semplice che la ribalti con il
pensiero. Prendo quella di un tuo post precedente:
"5k2/R7/8/5P2/6K1/8/8/1r6 b - - 0 3"
Ribaltata diviene:
"5K2/r7/8/5p2/6k1/8/8/1R6 w - - 0 3"
Controlla che sia esattamente ciò che vuoi ottenere. Poi controlla le
differenze fra una stringa e l'altra.
Alex

Mi sono dimenticato di ribaltarla :) Ecco:
Originale:
 "5k2/R7/8/5P2/6K1/8/8/1r6 b - - 0 3"
Ribaltata diviene:
"1R6/8/8/6k1/5p2/8/r7/5K2 w - - 0 3"
Alex

 wrote in message
news:Z7x8c.122453$
O31.5...@news4.tin.it

Allora: ho messo insieme una procedura in VBScript.
Non e' bellissima ma funziona
La riporto qui sotto.
Usabile liberamente da chiunque a proprio rischio e pericolo.
N.B. L'estensione di default e' VBS quindi creare un file FEN.VBS e
schiaffarcela dentro.
'---------------------------------------------------------------------
Dim FEN, FEN1, FENArray, n, s, r
FEN = Trim(InputBox("FEN:", "Posizione da invertire"))
'Toglie le eventuali virgolette 
if Left(FEN, 1) = """" then FEN = Mid(FEN, 2)
if Right(FEN, 1) = """" then FEN = Left(FEN, Len(FEN) - 1)
'Prende le singole parti separate da spazi
FEN1 = Split(FEN, " ", -1, 1)
'Opera la trasformazione sulla posizione
FENArray = Split(FEN1(0), "/", -1, 1)
for n = 0 to 7
	s = FENArray(n)
	s = Replace(s, "K", "L")
	s = Replace(s, "Q", "W")
	s = Replace(s, "R", "E")
	s = Replace(s, "B", "V")
	s = Replace(s, "N", "M")
	s = Replace(s, "P", "O")
	s = Ucase(s)
	s = Replace(s, "L", "k")
	s = Replace(s, "W", "w")
	s = Replace(s, "E", "r")
	s = Replace(s, "V", "b")
	s = Replace(s, "M", "n")
	s = Replace(s, "O", "p")
	if n = 0 then
		r = s
	else
		r = s + "/" + r
	end if
next
'Inverte il colore della mossa iniziale
if FEN1(1) <> "" then
	if FEN1(1) = "b" then
		FEN1(1) = "w"
	else
		FEN1(1) = "b"
	end if
end if
'Genera la posizione invertita
r = r + " " + FEN1(1) + " " + FEN1(3) + " " + FEN1(2) + " " + FEN1(4) +
" " + FEN1(5)
'Restituisce la posizione invertita
InputBox "FEN:", "Posizione invertita", r 
'---------------------------------------------------------------------
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 Non e' bellissima ma funziona
Mi sono permesso di compattarla un pelino:
F=Trim(InputBox("FEN:","Posizione da invertire"))
if Left(F,1)=""""then F=Mid(F,2)
if Right(F,1)=""""then F=Left(F,Len(F)-1)
I=instr(F," "):if I>0 then L=mid(F,I):F=left(F,I-1):if mid(L,2,1)="w" then
L=" b"+mid(L,3) else L=" w"+mid(L,3)
E=Split(F,"/",-1,1):for I=1 to 7:G=E(I)+"/"+G:next:G=G+E(0)
for I=1 to
len(G):J=mid(G,I):H=H+chr(asc(lcase(J))+asc(ucase(J))-asc(J)):next
InputBox "FEN:","Posizione invertita",H+L
Nota la brillante soluzione per la conversione del case :)
Alex

 Alex


 wrote in message
news:YrA8c.99679$
z23.4...@news3.tin.it

chr( asc(lcase(J)) + asc(ucase(J)) - asc(J))
Dunque... 
vuoi dire che questa formula scambia maiuscolo con minuscolo e
viceversa?
Fantastico! l'Asc(J) finale si elide con uno dei due che stanno al di
qua del segno meno e resta solo l'altro con il case invertito.
Bellissima!
Mi ricorda i bei tempi in cui questi artifici contribuivano non solo ad
ottimizzare i programmi ma anche a migliorarne l'estetica dei sorgenti.
Io ormai sono invecchiato e assuefatto alle banalita'...
Comunque me ne ricordero' di questo artificio, perche' e' davvero molto
bello.
Compliments!


Adesso pero' devi implementarla sul FENomeno: un bel pulsante per
ribaltare anche online!


 ha scritto nel messaggio
news:e1778e1dd789f977aea...@mygate.mailgate.org...

Una soluzione brillante, però l'approccio banale di Montaruli mi sembra più
manutenibile...
Luigi Caselli

 Compliments!
Grazie grazie :) Modestamente sono un professionista, nel senso che non so
scrivere i programmi ma se mi danno un programma lo incasino al punto
giusto, cioč resta funzionante ma non ci si capisce piů nulla :)
Alex

 manutenibile...
E' lì il bello, quando deve metterci mano il tuo successore e non ci capisce
niente. Pensa al Perl per esempio che ti permette le peggio cose :)
Alex

 Grazie grazie :) Modestamente sono un professionista
Non è che per caso lavori pure con COM e Asp su piattaforma 2003 server?
Saluti,Alfio Casella.


 Non è che per caso lavori pure con COM e Asp su piattaforma 2003 server?
No, che cosa ti serviva?
Alex

 No, che cosa ti serviva?
Purtroppo questo post è OT quindi mi scuso con gli altri. Ho problemi con
dei componenti COM che girano perfettamente con VB6 mentre mi danno rogne
con ASP sotto 2003 server.


 con ASP sotto 2003 server.
Purtroppo conosco bene VB6 ma non l'altro ambiente. Sorry.
Alex

 Purtroppo conosco bene VB6 ma non l'altro ambiente. Sorry.
Grazie comunque. Ciao.
Alfio Casella


 con ASP sotto 2003 server.
Non sono un sistemista, ma credo che sia un problema di policy.
Non registrare l'oggetto COM con regsvr32, ma mettilo sotto COM+ e dai
all'utente i diritti di esecuzione.
Inoltre controlla su IIS la sicurezza (l'utente anonimo con che utenza
gira ? Ha i permessi che ti servono ?)
Ciao
Fabio


 gira ? Ha i permessi che ti servono ?)
Proverò, grazie anche a te. Mi dispiace aggiungere a questo thread degli
argomenti OT, con questo post la finisco. Saluti,Alfio Casella.


 " " + FEN1(5)
Il punto e' che questa routine "scambia i trattini" ( FEN1(3) + FEN1(2) ) 
come se si riferissero ad informazioni una relativa al bianco e l'altra 
relativa al nero. Invece il primo campo si riferisce alle possibilita' di 
arrocco (punto 16.1.3.3 dello standard PGN), il secondo a quelle di presa 
ep (ibidem, punto 16.1.3.4).
Prendiamo questa stringa FEN:
r1bq1rk1/pp2n1pp/2n1p3/2ppPp1Q/3P4/P1PB4/2P2PPP/R1B1K1NR w KQ f6 0 10
la posizione ribaltata e' non e' certo: 
r1b1k1nr/2p2ppp/p1pb4/3p4/2PPpP1q/2N1P3/PP2N1PP/R1BQ1RK1 b f6 KQ 0 10
bensi' (a meno dell'ultimo campo):
r1b1k1nr/2p2ppp/p1pb4/3p4/2PPpP1q/2N1P3/PP2N1PP/R1BQ1RK1 b kq f3 0 10
Come accennato sopra l'ultimo campo (il numero di mossa, 16.) non e' 
facilmente "ribaltabile" (o meglio non e' assolutamente importante in questo 
contesto) giacche' c'e' il problema di far iniziare le partite al nero 
ecc. ecc.
Il penultimo campo invece (il numero di semimosse dall'ultima cattura o 
spinta di pedone) rimane invariato sotto "ribaltamento".
Che palle, direte voi!
Com'e' pignolo questo qui!
In realta' nella mia scarsissima modestia volevo essere il primo a postare 
una routine funzionante :-)), stimolato soprattutto dalle osservazioni 
circa la scarsa leggibilita' di alcuni programmi.
Ecco la mia creazione, buon divertimento:
------------------------------------------------------------------------
#!/bin/sh
sed '
s%\([^/]*\)\(/[^/]*\)\(/[^/]*\)\(/[^/]*\)\(/[^/]*\)\(/[^/]*\)\(/[^/]*\)\(/[^ 
]*\)%\8\7\6\5\4\3\2/\1%
s%^/%%
y/pnbrqkPNBRQK/PNBRQKpnbrqk/
s/ w / b /; s/ B / w /
s/ \([kq]\)\([KQ]\) / \2\1 /
s/ B\([36]\) / b\1 /
s/ \([a-h]\)3 / \16 /
s/ \([a-h]\)6 / \13 /'
------------------------------------------------------------------------
Oooops! Mi ero dimenticato di dirvi che e' scritta sotto Linux :-)), anche 
se penso che, procurandosi sed (il programma che uso), e con qualche 
adattamento (la chiamata da shell), la si possa tranquillamente adattare 
sotto windows.
Il programmino legge dalla standard input e scrive sullo standard output, 
per cui se volete usarlo su dei file dovete usare < e >.
Ciao a tutti e scusate la vanagloria :-)))),
Paolo Violini

 sed '
Ah bè, se si può scegliere l'utility diventa facile :)
Alex

 Paolo Violini
-- 


 (e anche Montaruli) abbiamo semplicemente ignorato i campi dell'arrocco
Vista la risposta di Roberto, ritiro la parentesi :)
Alex

 Ah bè, se si può scegliere l'utility diventa facile :)
Naturalmente si. Io ci avevo anche pensato al sed (al vi a dire il vero)
ma mi era sembrata piuttosto complessa la cosa (ed effettivamente guarda
che cosa ne e' uscito).
Ti sconsiglio di provare a compattare anche questa...


 
In realta', come avevo gia' accennato, volevo solo scrivere una routine 
illeggibile, per divertirmi, nulla di piu' (penso tuttavia che sed sia tra 
gli strumenti piu' idonei per affrontare il problema in questione).
Siccome pero' la routine era stata gia' postata ieri ho utilizzato la sua 
"incompletezza" come pretesto scherzoso per giustificare il mio post, 
tutto qui.
Ciao,
Paolo