<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="it">
	<id>https://bridgepedia.it/index.php?action=history&amp;feed=atom&amp;title=Progetto%3ABridgeShape_API</id>
	<title>Progetto:BridgeShape API - Cronologia</title>
	<link rel="self" type="application/atom+xml" href="https://bridgepedia.it/index.php?action=history&amp;feed=atom&amp;title=Progetto%3ABridgeShape_API"/>
	<link rel="alternate" type="text/html" href="https://bridgepedia.it/index.php?title=Progetto:BridgeShape_API&amp;action=history"/>
	<updated>2026-04-12T07:59:02Z</updated>
	<subtitle>Cronologia della pagina su questo sito</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://bridgepedia.it/index.php?title=Progetto:BridgeShape_API&amp;diff=1444&amp;oldid=prev</id>
		<title>Lpala: Documentazione API BridgeShape per generatori di smazzate</title>
		<link rel="alternate" type="text/html" href="https://bridgepedia.it/index.php?title=Progetto:BridgeShape_API&amp;diff=1444&amp;oldid=prev"/>
		<updated>2026-03-16T13:50:24Z</updated>

		<summary type="html">&lt;p&gt;Documentazione API BridgeShape per generatori di smazzate&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nuova pagina&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Questa pagina documenta l&amp;#039;API dell&amp;#039;estensione &amp;#039;&amp;#039;&amp;#039;BridgeShape&amp;#039;&amp;#039;&amp;#039; per sviluppatori di tool esterni che generano smazzate di test a partire dai vincoli di distribuzione definiti nelle pagine di convenzione.&lt;br /&gt;
&lt;br /&gt;
= BridgeShape — API per Generatori di Smazzate =&lt;br /&gt;
&lt;br /&gt;
Documentazione tecnica per chi sviluppa un generatore di smazzate di test&lt;br /&gt;
che legge i vincoli di distribuzione (shape constraints) dalle convenzioni&lt;br /&gt;
di BridgePedia.&lt;br /&gt;
&lt;br /&gt;
== Panoramica ==&lt;br /&gt;
&lt;br /&gt;
Ogni pagina wiki di convenzione su BridgePedia può definire nel template&lt;br /&gt;
&amp;lt;code&amp;gt;{{Convenzione}}&amp;lt;/code&amp;gt; un campo &amp;lt;code&amp;gt;shape_constraints&amp;lt;/code&amp;gt; che descrive, in un formato&lt;br /&gt;
DSL compatto, i vincoli di distribuzione delle mani dei 4 giocatori al tavolo.&lt;br /&gt;
&lt;br /&gt;
L&amp;#039;estensione &amp;#039;&amp;#039;&amp;#039;BridgeShape&amp;#039;&amp;#039;&amp;#039; espone un&amp;#039;API REST/JSON per leggere questi&lt;br /&gt;
vincoli in modo strutturato.&lt;br /&gt;
&lt;br /&gt;
== API Endpoint ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
GET /api.php?action=bridgeshape&amp;amp;shapeaction=ACTION&amp;amp;format=json&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Azioni disponibili ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Azione !! Descrizione !! Parametri&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; || Vincoli per una singola convenzione || &amp;lt;code&amp;gt;pageid&amp;lt;/code&amp;gt; oppure &amp;lt;code&amp;gt;title&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;list&amp;lt;/code&amp;gt; || Elenco convenzioni con vincoli definiti || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;listall&amp;lt;/code&amp;gt; || Elenco tutte le convenzioni (con/senza vincoli) || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;validate&amp;lt;/code&amp;gt; || Valida una stringa DSL senza bisogno di una pagina wiki || &amp;lt;code&amp;gt;dsl&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Esempi di chiamata ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Per titolo pagina&lt;br /&gt;
curl &amp;quot;https://bridgepedia.it/api.php?action=bridgeshape&amp;amp;shapeaction=get&amp;amp;title=Splinter&amp;amp;format=json&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Per page ID&lt;br /&gt;
curl &amp;quot;https://bridgepedia.it/api.php?action=bridgeshape&amp;amp;shapeaction=get&amp;amp;pageid=42&amp;amp;format=json&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Elenco pagine con vincoli&lt;br /&gt;
curl &amp;quot;https://bridgepedia.it/api.php?action=bridgeshape&amp;amp;shapeaction=list&amp;amp;format=json&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Validare una stringa DSL&lt;br /&gt;
curl &amp;quot;https://bridgepedia.it/api.php?action=bridgeshape&amp;amp;shapeaction=validate&amp;amp;dsl=opener+H:5%2B+hcp:12-21&amp;amp;format=json&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Formato risposta JSON ==&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;shapeaction=get&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;shapeconstraints&amp;quot;: {&lt;br /&gt;
    &amp;quot;pageId&amp;quot;: 42,&lt;br /&gt;
    &amp;quot;raw&amp;quot;: &amp;quot;1H-4C: opener H:5+ hcp:12-21; responder H:4+ C:0-1 Chcp:0 hcp:10-15 // ...&amp;quot;,&lt;br /&gt;
    &amp;quot;scenarios&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;label&amp;quot;: &amp;quot;1H-4C&amp;quot;,&lt;br /&gt;
        &amp;quot;positions&amp;quot;: {&lt;br /&gt;
          &amp;quot;opener&amp;quot;: {&lt;br /&gt;
            &amp;quot;suits&amp;quot;: {&lt;br /&gt;
              &amp;quot;H&amp;quot;: { &amp;quot;min&amp;quot;: 5, &amp;quot;max&amp;quot;: null }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;hcp&amp;quot;: { &amp;quot;min&amp;quot;: 12, &amp;quot;max&amp;quot;: 21 }&lt;br /&gt;
          },&lt;br /&gt;
          &amp;quot;responder&amp;quot;: {&lt;br /&gt;
            &amp;quot;suits&amp;quot;: {&lt;br /&gt;
              &amp;quot;H&amp;quot;: { &amp;quot;min&amp;quot;: 4, &amp;quot;max&amp;quot;: null },&lt;br /&gt;
              &amp;quot;C&amp;quot;: { &amp;quot;min&amp;quot;: 0, &amp;quot;max&amp;quot;: 1 }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;suit_hcp&amp;quot;: {&lt;br /&gt;
              &amp;quot;C&amp;quot;: { &amp;quot;min&amp;quot;: 0, &amp;quot;max&amp;quot;: 0 }&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;hcp&amp;quot;: { &amp;quot;min&amp;quot;: 10, &amp;quot;max&amp;quot;: 15 }&lt;br /&gt;
          }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;fit&amp;quot;: []&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== &amp;lt;code&amp;gt;shapeaction=list&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;pages&amp;quot;: [&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pageId&amp;quot;: 42,&lt;br /&gt;
      &amp;quot;title&amp;quot;: &amp;quot;Splinter&amp;quot;,&lt;br /&gt;
      &amp;quot;scenarioCount&amp;quot;: 6,&lt;br /&gt;
      &amp;quot;labels&amp;quot;: [&amp;quot;1H-4C&amp;quot;, &amp;quot;1H-4D&amp;quot;, &amp;quot;1H-4S&amp;quot;, &amp;quot;1S-4C&amp;quot;, &amp;quot;1S-4D&amp;quot;, &amp;quot;1S-4H&amp;quot;]&lt;br /&gt;
    },&lt;br /&gt;
    {&lt;br /&gt;
      &amp;quot;pageId&amp;quot;: 15,&lt;br /&gt;
      &amp;quot;title&amp;quot;: &amp;quot;Stayman&amp;quot;,&lt;br /&gt;
      &amp;quot;scenarioCount&amp;quot;: 2,&lt;br /&gt;
      &amp;quot;labels&amp;quot;: [&amp;quot;fit a cuori&amp;quot;, &amp;quot;fit a picche&amp;quot;]&lt;br /&gt;
    }&lt;br /&gt;
  ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Formato DSL ==&lt;br /&gt;
&lt;br /&gt;
Il DSL (Domain Specific Language) è la stringa scritta nel campo&lt;br /&gt;
&amp;lt;code&amp;gt;shape_constraints&amp;lt;/code&amp;gt; del template wiki.&lt;br /&gt;
&lt;br /&gt;
=== Struttura ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
etichetta: vincoli posizione; vincoli posizione // etichetta: vincoli // ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;//&amp;lt;/code&amp;gt; separa gli scenari (il generatore ne sceglie uno random o li presenta all&amp;#039;utente)&lt;br /&gt;
* &amp;lt;code&amp;gt;;&amp;lt;/code&amp;gt; separa le posizioni dentro uno scenario&lt;br /&gt;
* Ogni scenario ha un&amp;#039;&amp;#039;&amp;#039;&amp;#039;etichetta&amp;#039;&amp;#039;&amp;#039; opzionale seguita da &amp;lt;code&amp;gt;:&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ogni posizione inizia col nome del ruolo, seguito da vincoli separati da spazi&lt;br /&gt;
&lt;br /&gt;
=== Posizioni ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Nome !! Ruolo&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;opener&amp;lt;/code&amp;gt; || Chi apre o fa la prima licita convenzionale&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;responder&amp;lt;/code&amp;gt; || Il compagno dell&amp;#039;opener&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;opp1&amp;lt;/code&amp;gt; || Avversario a sinistra dell&amp;#039;opener&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;opp2&amp;lt;/code&amp;gt; || Avversario a destra dell&amp;#039;opener (compagno di opp1)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Vincoli ===&lt;br /&gt;
&lt;br /&gt;
==== Lunghezza seme (specifico) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
S:5+       — almeno 5 picche&lt;br /&gt;
H:0-1      — 0 o 1 cuori&lt;br /&gt;
D:3        — esattamente 3 quadri&lt;br /&gt;
C:2-5      — da 2 a 5 fiori&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Semi: &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; = Spades/Picche, &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; = Hearts/Cuori, &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; = Diamonds/Quadri, &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; = Clubs/Fiori&lt;br /&gt;
&lt;br /&gt;
==== Lunghezza seme (wildcard) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
x:0-1      — un seme qualsiasi (tra quelli non specificati) con 0-1 carte&lt;br /&gt;
x:6+       — un seme non specificato con almeno 6 carte&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il generatore sceglie casualmente quale seme assegnare a &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; tra quelli&lt;br /&gt;
non già vincolati esplicitamente (S/H/D/C).&lt;br /&gt;
&lt;br /&gt;
==== HCP totali ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
hcp:15-17  — da 15 a 17 punti onore&lt;br /&gt;
hcp:12+    — almeno 12 punti&lt;br /&gt;
hcp:0-7    — da 0 a 7 punti&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HCP nel seme (specifico) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Shcp:3+    — almeno 3 HCP a picche&lt;br /&gt;
Chcp:0     — 0 HCP a fiori (nessun onore)&lt;br /&gt;
Hhcp:0-2   — da 0 a 2 HCP a cuori&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== HCP nel seme (wildcard) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
xhcp:0     — 0 HCP nel seme wildcard (x)&lt;br /&gt;
xhcp:0-1   — 0-1 HCP nel seme x&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Shape class ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
shape:balanced      — distribuzione bilanciata (4333, 4432, 5332)&lt;br /&gt;
shape:one_suiter    — monocolore&lt;br /&gt;
shape:two_suiter    — bicolore&lt;br /&gt;
shape:three_suiter  — tricolore&lt;br /&gt;
shape:any           — qualsiasi (default)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Fit (vincolo cross-posizione) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
fit:H8+    — almeno 8 cuori totali tra i compagni&lt;br /&gt;
fit:S9+    — almeno 9 picche totali tra i compagni&lt;br /&gt;
fit:M8+    — almeno 8 carte in un seme maggiore (H o S)&lt;br /&gt;
fit:m8+    — almeno 8 carte in un seme minore (D o C)&lt;br /&gt;
fit:8+     — almeno 8 carte in un seme qualsiasi&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Il fit si applica tra &amp;#039;&amp;#039;&amp;#039;compagni&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
* Se appare su &amp;lt;code&amp;gt;opener&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;responder&amp;lt;/code&amp;gt;, o a livello di scenario → coppia dichiarante&lt;br /&gt;
* Se appare su &amp;lt;code&amp;gt;opp1&amp;lt;/code&amp;gt; o &amp;lt;code&amp;gt;opp2&amp;lt;/code&amp;gt; → coppia difensiva&lt;br /&gt;
&lt;br /&gt;
=== Formato range ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Sintassi !! Significato&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;5+&amp;lt;/code&amp;gt; || Almeno 5 (min=5, max=null)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0-1&amp;lt;/code&amp;gt; || Da 0 a 1 (min=0, max=1)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || Esattamente 3 (min=3, max=3)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;12-21&amp;lt;/code&amp;gt; || Da 12 a 21 (min=12, max=21)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Nella risposta JSON, &amp;lt;code&amp;gt;max: null&amp;lt;/code&amp;gt; significa &amp;quot;nessun limite superiore&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Semi non menzionati ===&lt;br /&gt;
&lt;br /&gt;
I semi &amp;#039;&amp;#039;&amp;#039;non vincolati&amp;#039;&amp;#039;&amp;#039; e non coperti da &amp;lt;code&amp;gt;x:&amp;lt;/code&amp;gt; sono distribuiti &amp;#039;&amp;#039;&amp;#039;casualmente&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
dal generatore, rispettando il vincolo che il totale delle carte per mano sia 13.&lt;br /&gt;
&lt;br /&gt;
== Struttura JSON di uno scenario ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
interface Scenario {&lt;br /&gt;
  label: string;           // Etichetta (es. &amp;quot;1H-4C&amp;quot;), vuota se non specificata&lt;br /&gt;
  positions: {&lt;br /&gt;
    [posName: string]: Position;  // &amp;quot;opener&amp;quot;, &amp;quot;responder&amp;quot;, &amp;quot;opp1&amp;quot;, &amp;quot;opp2&amp;quot;&lt;br /&gt;
  };&lt;br /&gt;
  fit: FitConstraint[];    // Vincoli di fit (array, può essere vuoto)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
interface Position {&lt;br /&gt;
  suits?: {                // Vincoli lunghezza seme (solo semi esplicitati)&lt;br /&gt;
    [suit: string]: Range; // &amp;quot;S&amp;quot;, &amp;quot;H&amp;quot;, &amp;quot;D&amp;quot;, &amp;quot;C&amp;quot;&lt;br /&gt;
  };&lt;br /&gt;
  hcp?: Range;             // HCP totali&lt;br /&gt;
  suit_hcp?: {             // HCP per seme specifico&lt;br /&gt;
    [suit: string]: Range;&lt;br /&gt;
  };&lt;br /&gt;
  x?: Range;               // Lunghezza seme wildcard&lt;br /&gt;
  x_hcp?: Range;           // HCP seme wildcard&lt;br /&gt;
  shape?: string;          // Shape class: &amp;quot;balanced&amp;quot;, &amp;quot;one_suiter&amp;quot;, etc.&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
interface Range {&lt;br /&gt;
  min: number;&lt;br /&gt;
  max: number | null;      // null = nessun limite superiore&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
interface FitConstraint {&lt;br /&gt;
  suit: string | null;      // &amp;quot;S&amp;quot;,&amp;quot;H&amp;quot;,&amp;quot;D&amp;quot;,&amp;quot;C&amp;quot; o null&lt;br /&gt;
  suit_class: string | null; // &amp;quot;major&amp;quot;, &amp;quot;minor&amp;quot; o null&lt;br /&gt;
  min: number;              // Numero minimo di carte (es. 8)&lt;br /&gt;
  pair: string;             // &amp;quot;declarer&amp;quot; o &amp;quot;defense&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Logica per il generatore ==&lt;br /&gt;
&lt;br /&gt;
=== Algoritmo base ===&lt;br /&gt;
&lt;br /&gt;
Per ogni scenario:&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Scegli lo scenario&amp;#039;&amp;#039;&amp;#039;: random tra quelli disponibili, oppure lascia scegliere all&amp;#039;utente&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Risolvi wildcard&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
#* Se una posizione ha &amp;lt;code&amp;gt;x:&amp;lt;/code&amp;gt;, scegli un seme casuale tra quelli non esplicitamente vincolati&lt;br /&gt;
#* &amp;lt;code&amp;gt;xhcp:&amp;lt;/code&amp;gt; si applica allo stesso seme scelto per &amp;lt;code&amp;gt;x:&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Risolvi fit&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
#* Se &amp;lt;code&amp;gt;fit.suit&amp;lt;/code&amp;gt; è specificato, entrambi i compagni devono avere un totale &amp;gt;= &amp;lt;code&amp;gt;fit.min&amp;lt;/code&amp;gt; in quel seme&lt;br /&gt;
#* Se &amp;lt;code&amp;gt;fit.suit_class&amp;lt;/code&amp;gt; è &amp;quot;major&amp;quot;, scegli tra H e S; se &amp;quot;minor&amp;quot;, tra D e C&lt;br /&gt;
#* Se entrambi sono null, scegli un seme qualsiasi&lt;br /&gt;
#* &amp;lt;code&amp;gt;fit.pair&amp;lt;/code&amp;gt; indica quale coppia: &amp;quot;declarer&amp;quot; (opener+responder) o &amp;quot;defense&amp;quot; (opp1+opp2)&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Genera le mani&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
#* Per ogni posizione, genera una mano che rispetti tutti i vincoli&lt;br /&gt;
#* I semi senza vincoli vengono riempiti casualmente&lt;br /&gt;
#* Il totale delle carte per mano deve essere esattamente 13&lt;br /&gt;
#* Il totale delle carte per seme (tutte e 4 le mani) deve essere esattamente 13&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Posizioni non menzionate&amp;#039;&amp;#039;&amp;#039;: se uno scenario non menziona &amp;lt;code&amp;gt;opp1&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;opp2&amp;lt;/code&amp;gt;, distribuisci le carte rimanenti casualmente tra gli avversari&lt;br /&gt;
&lt;br /&gt;
=== Priorità dei vincoli ===&lt;br /&gt;
&lt;br /&gt;
# Vincoli di fit (cross-posizione) — determinano la distribuzione di base&lt;br /&gt;
# Vincoli di seme specifico (S:, H:, D:, C:) — limitano i singoli semi&lt;br /&gt;
# Vincoli wildcard (x:) — dopo aver fissato i semi specifici&lt;br /&gt;
# Vincoli HCP (hcp:, Shcp:, xhcp:) — filtro finale&lt;br /&gt;
# Shape class (shape:) — validazione della forma complessiva&lt;br /&gt;
&lt;br /&gt;
=== Gestione di &amp;lt;code&amp;gt;max: null&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Quando &amp;lt;code&amp;gt;max&amp;lt;/code&amp;gt; è &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;, non c&amp;#039;è limite superiore esplicito. I limiti fisici&lt;br /&gt;
del bridge si applicano comunque:&lt;br /&gt;
* Massimo 13 carte per seme (tutte e 4 le mani)&lt;br /&gt;
* Massimo 13 carte per mano&lt;br /&gt;
* Massimo 10 HCP per seme (A+K+Q+J = 4+3+2+1)&lt;br /&gt;
* Massimo 37 HCP per mano (raro ma teoricamente possibile con tutti gli onori)&lt;br /&gt;
&lt;br /&gt;
== Esempi completi ==&lt;br /&gt;
&lt;br /&gt;
=== Splinter (tutti gli scenari specifici) ===&lt;br /&gt;
&lt;br /&gt;
DSL nel template wiki:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
1H-4C: opener H:5+ hcp:12-21; responder H:4+ C:0-1 Chcp:0 hcp:10-15 //&lt;br /&gt;
1H-4D: opener H:5+ hcp:12-21; responder H:4+ D:0-1 Dhcp:0 hcp:10-15 //&lt;br /&gt;
1H-4S: opener H:5+ hcp:12-21; responder H:4+ S:0-1 Shcp:0 hcp:10-15 //&lt;br /&gt;
1S-4C: opener S:5+ hcp:12-21; responder S:4+ C:0-1 Chcp:0 hcp:10-15 //&lt;br /&gt;
1S-4D: opener S:5+ hcp:12-21; responder S:4+ D:0-1 Dhcp:0 hcp:10-15 //&lt;br /&gt;
1S-4H: opener S:5+ hcp:12-21; responder S:4+ H:0-1 Hhcp:0 hcp:10-15&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Splinter (compatto con fit e wildcard) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
dopo 1H: fit:H8+ opener H:5+ hcp:12-21; responder x:0-1 xhcp:0 hcp:10-15 //&lt;br /&gt;
dopo 1S: fit:S8+ opener S:5+ hcp:12-21; responder x:0-1 xhcp:0 hcp:10-15&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Stayman ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
fit a cuori: fit:H8+ opener hcp:15-17 S:2-4 H:2-4 D:2-5 C:2-5; responder H:4+ hcp:8+ //&lt;br /&gt;
fit a picche: fit:S8+ opener hcp:15-17 S:2-4 H:2-4 D:2-5 C:2-5; responder S:4+ hcp:8+&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Contro informativo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
base: opener hcp:12-21 x:5+; opp1 hcp:12+ S:3+ H:3+ D:3+ C:3+; responder hcp:0-8 //&lt;br /&gt;
con intervento: opener hcp:12-21 x:5+; opp1 hcp:12+ S:3+ H:3+ D:3+ C:3+; opp2 hcp:8+ x:5+&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Preempt 3-a-livello ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
opener H:7+ x:0-1 hcp:5-10&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Overcall con fit avversari ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
overcall semplice: opener hcp:12-21 x:5+; opp1 hcp:10+ x:5+; opp2 fit:8+ //&lt;br /&gt;
con barrage: opener hcp:12-21 x:5+; opp1 hcp:6-10 x:6+; opp2 fit:9+&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Note implementative ==&lt;br /&gt;
&lt;br /&gt;
* L&amp;#039;API è read-only, non richiede token CSRF&lt;br /&gt;
* L&amp;#039;accesso anonimo è abilitato di default (&amp;lt;code&amp;gt;BridgeShapeAllowAnonymous: true&amp;lt;/code&amp;gt;) perché i dati sono pubblici e i tool esterni ne hanno bisogno&lt;br /&gt;
* Il campo &amp;lt;code&amp;gt;raw&amp;lt;/code&amp;gt; nella risposta &amp;lt;code&amp;gt;get&amp;lt;/code&amp;gt; contiene la stringa DSL originale, utile per debug&lt;br /&gt;
* L&amp;#039;azione &amp;lt;code&amp;gt;validate&amp;lt;/code&amp;gt; permette di testare stringhe DSL senza creare pagine wiki&lt;br /&gt;
* I calcoli HCP usano la scala standard: A=4, K=3, Q=2, J=1&lt;br /&gt;
&lt;br /&gt;
[[Categoria:Documentazione tecnica]]&lt;/div&gt;</summary>
		<author><name>Lpala</name></author>
	</entry>
</feed>