Il protocollo dell'orinatoio


38

sfondo

Il cosiddetto "Protocollo degli orinatoi", che descrive l'ordine in cui i singoli orinatoi vengono raccolti nel bagno di un uomo, è stato discusso in più punti. Una versione è disponibile in questo post sul blog di xkcd . Questa domanda riguarda una leggera variazione:

Disposizione : n orinali in linea.
Protocollo : ogni nuova persona seleziona uno degli orinatoi più distanti da quelli già in uso.

Si noti che ciò non pone restrizioni su quale orinatoio viene prelevato dalla prima persona.

Aggiornamento : la sequenza del numero di modi diversi in cui n persone possono selezionare n orinatoi inizia con 1, 2, 4, 8, 20 ... Nota che questo non è lo stesso di OEIS A095236 , che descrive restrizioni leggermente più severe rispetto a questo domanda.

Compito

Dato un numero intero compreso tra 0 e 10, genera (in qualsiasi ordine) tutti i possibili ordini in cui n persone possono occupare n orinali. Ogni ordine deve essere stampato come la disposizione finale: una sequenza di cifre che rappresentano le persone (1-9 per le prime 9 persone, 0 per la decima), a partire dall'orinatoio più a sinistra, con separatori non alfanumerici opzionali tra (ma non prima o dopo) le cifre. Ad esempio, i seguenti output sono entrambi validi:

>> 3
132
213
312
231

>> 4
1|3|4|2
1|4|3|2
3|1|4|2
4|1|3|2
2|3|1|4
2|4|1|3
2|3|4|1
2|4|3|1

È possibile scrivere un programma o una funzione, prendendo l'input tramite STDIN (o l'alternativa più vicina), argomento della riga di comando o argomento della funzione. I risultati devono essere stampati su STDOUT (o l'alternativa più vicina).

punteggio

Il codice più corto vince. Si applicano termini e condizioni standard.


1
Hm. Per 5 orinatoi ottengo questo . Dovrebbero essere invece 16 righe. Qualcuno potrebbe elaborare quali di queste soluzioni sono sbagliate? Questo è attualmente in fase di implementazione: scegli uno qualsiasi degli orinatoi con la massima distanza da chiunque altro.
Knedlsepp,

1
Tanto per il sandboxing :-( Le specifiche sono come descritte nell'attività, non la definizione della sequenza. Aggiornerò non appena arrivo a un computer.
Uri Granta,

1
@knedlsepp Le righe 3, 4, 17, 18 non sono corrette. In questi, inserisci la persona n. 3 in a spandi lunghezza 1, dove è disponibile una spanlunghezza di 2. Improvvisamente sono riuscito a confondermi. Sembrerebbe che l'OP sia intenzionalmente derivato dal collegamento, e quindi il collegamento dovrebbe essere seguito?
BrainSteel,

Specifiche aggiornate per notare che l'attività non è la stessa di A095236.
Uri Granta,

È consentito l'output del formato in [1, 3, 2], dove ciascuna di queste soluzioni è separata da nuove righe? (quindi non solo un separatore di ",", ma anche l'inizio di "[" e la fine di "]")
orlp

Risposte:


11

Pyth, 53 51

MhSm^-dG2HjbmjdmehxkbQusmm+dkfqgTdeSmgbdQUQGUtQm]dQ

Questo è un approccio iterativo. Dato un possibile set di posizioni ordinato parzialmente compilato, troviamo tutte le ulteriori posizioni ottimali, quindi generiamo l'elenco di posizioni corrispondente e ripetiamo.

I risultati vengono generati nel modulo [<first person's location>, <second person's location> ...], quindi questo viene trasformato nel formato desiderato. MhSm^-dG2Hdefinisce una funzione di supporto che trova le distanze minime da una determinata stalla a una stalla occupata (al quadrato). In modo divertente, il separatore è gratuito.

Esempio di esecuzione.

Spiegazione:

Innanzitutto, la funzione di aiuto g, che trova la distanza minima quadrata tra G e qualsiasi valore in H.

MhSm^-dG2H
M             def g(G,H): return
 hS           min(                         )
   m     H        map(lambda d:        , H) 
    ^-dG2                      (d-G)**2

Successivamente, troviamo la posizione massima sopra l'orinatoio della distanza minima quadrata tra quell'orinatoio e qualsiasi orinatoio occupato:

( Qè l'input.)

eSmgbdQ
eS          max(                                   )
  m   Q         map(lambda b:      , range(len(Q)))
   gbd                       g(b,d)

din questo caso è l'elenco degli orinatoi occupati, mentre bscorre le posizioni degli orinatoi.

Successivamente, troviamo tutte le posizioni degli orinatoi la cui distanza minima quadrata dall'orinale occupato più vicino è uguale al valore massimo trovato sopra.

fqgTdeSmgbdQUQ
f           UQ    filter(lambda T:                             , range(len(Q)))
 qgTd                             g(T,d) ==
     eSmgbdQ                                <value found above>

Successivamente, genereremo gli elenchi delle posizioni orinatoi creati aggiungendo le posizioni degli orinatoi sopra trovate d. Lo faremo per ogni precedente elenco di posizioni degli orinatoi, estendendo così gli elenchi da lunghezza Na N+1. Gè l'elenco di elenchi legali di posizioni orinatoi occupate di una determinata lunghezza.

smm+dkfqgTdeSmgbdQUQG
sm                  G    sum(map(lambda d:                               ,G)
  m+dk                                   map(lambda k:d+[k],            )
      fqgTdeSmgbdQUQ                                        <above list>

Successivamente, applicheremo ripetutamente l'espressione sopra, per generare l'elenco completo di elenchi di posizioni orinatoi occupate. u, la funzione di riduzione, fa esattamente questo, tutte le volte che ci sono elementi nel suo secondo argomento.

usmm+dkfqgTdeSmgbdQUQGUtQm]dQ
usmm+dkfqgTdeSmgbdQUQG           reduce(lambda G,H: <the above expression)
                      UtQ        repeat Q-1 times
                         m]dQ    starting with [[0], [1], ... [Q-1]]. 

Convertire dalla rappresentazione di cui sopra, che va [<1st location>, <2nd location>, ... ]al form uscita desiderata, [<person in slot 1>, <person in slot 2>, ... ]. Quindi, il modulo di output viene unito nella stringa di output e stampato. La stampa è implicita.

jbmjdmehxkbQ
jbm             '\n'.join(map(λ k:                                    ,<above>)
   jdm     Q                      ' '.join(map(λ b:                ,Q)
        xkb                                        b.index(k)
      eh                                                     +1 %10

Dannazione, dovrei smettere di scrivere soluzioni ricorsive in Pyth. Vengo sempre picchiato: P
orlp

kajsdlkas^23asdjkla1lasdkj~JZasSSA- quasi la metà delle dimensioni.
Ottimizzatore

@Optimizer Aggiungerò una spiegazione quando sono meno occupato.
Isaacg,

8

Pyth, 75 71 67

DcGHFk_UQJf!s:GeS,0-TkhS,h+TklGUQIJRsmcX>G0dhHhHJ)R]Gjbmjdmebkcm0Q0

Soluzione combinatoria ricorsiva.

È una traduzione abbastanza diretta da questa soluzione Python:

N = int(input())

def gen(l, p):
    for d in reversed(range(N)):
        s = []
        for i in range(N):
            if not sum(l[max(0,i-d):min(i+d+1, len(l))]):
                s.append(i)

        if s:
            r = []
            for possib in s:
                j = l[:]
                j[possib] = p+1
                r += gen(j, p+1)

            return r

    return [l]

print("\n".join(" ".join(str(x % 10) for x in sol) for sol in gen([0] * N, 0)))

Come funziona? Più in dettaglio della "soluzione combinatoria ricorsiva".
martedì

@tbodt Aggiunto il codice Python che ho scritto prima di tradurre in Pyth.
orlp

5

C, 929 878 byte

Questo è un mostro, ragazzi. Scusate.

typedef unsigned long U;typedef unsigned char C;U f(int*u,n){C c[8],a[8];*(U*)(&c)=-1;int i,b=0,l=-9,s=-2,f=0,d;for (i=0; i<n; i++) {if (!u[i]&&s<0)s=i,l=0;if(!u[i])l++;if(u[i]&&s>=0){if(!s)l=2*l-1;d=(l-1)/2;if(b<d)*(U*)(a)=0,*(U*)(c)=-1,*c=s,*a=l,f=1,b=d;else if(b==d)c[f]=s,a[f++]=l;s=-1;}}if(s>=0&&l){l=2*l-1;d=(l-1)/2;if(b<d)*(U*)(c)=-1,*c=s,*a=l,f=1,b=d;else if(b==d)c[f]=s,a[f++]=l;}d=f;for(i=0;i<d;i++){if((c[i]+1)&&c[i]){if(c[i]+a[i]==n)c[i]=n-1;else{if(!(a[i]%2))c[f++]=b+c[i]+1;c[i]+=b;}}}return*(U*)c;}void P(int*u,n,i,c,m){for(i=0;i<n;i++){if(!u[i])c++;if(u[i]>m)m=u[i];}if(!c){for(i=0;i<n;i++)printf("%d",u[i]==10?0:u[i]);printf("\n");}else{int s[8][n];for(i=0;i<8;i++)for(c=0;c<n;c++)s[i][c]=u[c];U t=f(u,n);C*H=&t;for(i=0;i<8;i++)if((C)(H[i]+1))s[i][H[i]]=m+1,P(s[i],n,0,0,0);}}void L(n){int u[n],i,j;for(i=0;i<n;i++){for(j=0;j<n;j++)u[j]=j==i?1:0;P(u,n,0,0,0);}}

Definisce 3 funzioni, f(int*,int), P(int*,int,int,int,int)eL(int) . Chiama L(n)e viene emesso su STDOUT.

Uscita per n=5:

14352
15342
31452
31542
41352
51342
41532
51432
24153
25143
34152
35142
23415
23514
24513
25413
24315
25314
24351
25341

Aggiornamento: ho rimosso i separatori e risolto il codice. Il vecchio codice non solo è fallito per n = 7 +, ma non è riuscito a produrre nulla per n = 10 (oops!). Ho testato più a fondo questo gruppo. Ora supporta input fino a n = 13 (anche se "%d"dovrebbe essere modificato in "%x"modo che venga stampato in formato esadecimale). La dimensione dell'input dipende da sizeof(long)e si presume che sia 8in pratica.

Ecco alcune spiegazioni su come funziona e perché esiste una tale strana restrizione:

Questi sono stati usati molto, quindi li definiamo per salvare un paio di byte:

typedef unsigned long U; typedef unsigned char C;

Ecco qui f:

U f(int*u,n){
    C c[8],a[8];
    *(U*)(&c)=-1;
    int i,b=0,l=-9,s=-2,f=0,d;
    for (i=0; i<n; i++) {
        if (!u[i]&&s<0)
            s=i,l=0;
        if(!u[i])
            l++;
        if(u[i]&&s>=0){
            if(!s)
                l=2*l-1;
            d=(l-1)/2;
            if(b<d)
                *(U*)(a)=0,
                *(U*)(c)=-1,
                *c=s,
                *a=l,
                f=1,
                b=d;
            else if(b==d)
                c[f]=s,a[f++]=l;
            s=-1;
        }
    }
    if(s>=0&&l){
        l=2*l-1;
        d=(l-1)/2;
        if(b<d)
            *(U*)(c)=-1,
            *c=s,
            *a=l,
            f=1,
            b=d;
        else if(b==d)
            c[f]=s,a[f++]=l;
    }
    d=f;
    for(i=0;i<d;i++){
        if((c[i]+1)&&c[i]){
            if(c[i]+a[i]==n)
                c[i]=n-1;
            else{
                if(!(a[i]%2))
                    c[f++]=b+c[i]+1;
                c[i]+=b;
            }
        }
    }
    return*(U*)c;
}

faccetta una matrice di numeri interi di dimensioni ne nse stessa. L'unico bit intelligente qui è che restituisce un unsigned long, che viene convertito in a char[8]dalla funzione chiamante. Ciascun carattere dell'array viene quindi impostato su0xFF o su un indice che punta a un orinatoio valido per la persona successiva. Per n<10, non abbiamo mai bisogno di più di 5 byte per contenere ogni orinatoio valido che la prossima persona può usare.

Ecco qui P:

void P(int*u,n,i,c,m){
    for(i=0;i<n;i++){
        if(!u[i])c++;
        if(u[i]>m)m=u[i];
    }
    if(!c){
        for(i=0;i<n;i++)
            printf("%d",u[i]==10?0:u[i]);
        printf("\n");
    }
    else{
        int s[8][n];
        for(i=0;i<8;i++)
            for(c=0;c<n;c++)
                s[i][c]=u[c];
        U t=f(u,n);
        C*H=&t;
        for(i=0;i<8;i++)
            if((C)(H[i]+1))
                s[i][H[i]]=m+1,P(s[i],n,0,0,0);
    }
}

Paccetta una matrice udi dimensioni in ncui è impostato esattamente un elemento 1e il resto lo è0 . Quindi trova e stampa ricorsivamente ogni permutazione possibile.

Ecco qui L:

void L(n){
    int u[n],i,j;
    for(i=0;i<n;i++){
        for(j=0;j<n;j++)
            u[j]=j==i?1:0;
        P(u,n,0,0,0);
    }
}

L chiama semplicemente P n tempi con diverse posizioni iniziali ogni volta.

Per gli interessati, questo (meno golf) fgenererà la sequenza in A095236 .

U f(int*u,n) {
    C c[8];
    *(U*)(&c) = -1;
    int i,b=0,l=-10,s=-2,f=0,d;
    for (i=0; i<n; i++) {
        if (!u[i]&&s<0) {
            s=i,l=0;
        }
        if(!u[i]){
            l++;
        }
        if (u[i]&&s>=0) {
            if (!s) {
                l=2*l-1;
            }
            if (b<l) {
                *(U*)(&c)=-1;
                c[0]=s;
                f=1;
                b=l;
            }
            else if (b==l)
                c[f++]=s;
            s=-1;
        }
    }
    if (s>=0&&l) {
        l=2*l-1;
        if (b<l) {
            *(U*)(&c)=-1;
            c[0]=s;
            f=1;
            b=l;
        }
        else if (b==l)
            c[f++]=s;
    }
    d=f;
    for (i=0; i<d; i++) {
        if ((c[i]+1)&&c[i]) {
            if (c[i]+b==n) {
                c[i]=n-1;
            }
            else{
                if (!(b%2)) {
                    c[f++]=(b-1)/2+c[i]+1;
                }
                c[i]+=(b-1)/2;
            }
        }
    }
    return *(U*)c;
}

"1 4 ..." all'inizio sembra essere contrario alle specifiche: se il primo numero è 1, il prossimo dovrebbe essere 5.
anatolyg

2
@anatolyg No. Ecco una spiegazione dettagliata di come può accadere "1 4": gist.github.com/orlp/a5706ba664b70209b48a
orlp,

Ricorda, i separatori sono opzionali. Puoi salvare 1 byte (!) Rimuovendo lo spazio dopo% d :-)
Uri Granta

@UriZarfaty Grazie! In realtà, ci sono un sacco di byte da salvare qui. Attualmente sto scrivendo una soluzione migliore e una spiegazione.
BrainSteel,

@yo 'Penso che stai confondendo un po' l'output. Un risultato della 14352persona media n. 1 ha scelto l'orinatoio più a sinistra. La persona # 2 ha scelto quella più a destra, che ha costretto la # 3 a metà. Non è il numero di orinatoio raccolto successivamente che dovrebbe essere emesso.
BrainSteel

4

Python 2, 208

n=input()
r=range(n)
l=[0]*n
def f(a,d=-1):
 if a>n:print''.join(l);return
 for i in r:
  t=min([n]+[abs(i-j)for j in r if l[j]])
  if t==d:p+=[i]
  if t>d:p=[i];d=t
 for i in p:l[i]=`a%10`;f(a+1);l[i]=0
f(1)

Approccio ricorsivo


4

JavaScript (ES6) 153 160 169

modificare Usando Math.min per trovare (ovviamente) la distanza massima: codice semplificato e 16 byte salvati.

Ricerca ricorsiva, può funzionare con n> 10, basta rimuovere% 10 (ed essere pronti ad attendere mentre la console srotola tutto il suo output).

Uso un solo array per memorizzare lo slot in uso (numeri positivi) o la distanza corrente dallo slot più vicino (numeri negativi così <e >vengono scambiati nel codice).

F=n=>{(R=(m,d,t,x=Math.min(...d=m?
  d.map((v,i)=>(c=i<t?i-t:t-i)?v<c?c:v:m%10)
  :Array(n).fill(-n)))=>
x<0?d.map((v,i)=>v>x||R(-~m,d,i)):console.log(d+[]))()}

Ungolfed

F=n=>{
  var R=(m, // current 'man', undefined at first step
   d, // slot array
   t // current position to fill
  ) =>
  {
    if (m) // if not at first step
    {
      d[t] = m % 10; // mark slot in use, (10 stored as 0 )
      d = d.map((v,i) => { // update distances in d[] 
        var c = i<t ? i-t : t-i; // distance from the current position (negated)
        return v < c ? c : v; // change if less than current distance
      });
    }
    else
    {
      d = Array(n).fill(-n) // fill distance array with max at first step
      // negative means slot free, value is the distance from nearest used slot
      // >= 0 means slot in use by man number 1..n 
    }
    var x = Math.min(...d);
    if ( x < 0 ) // if there is still any free slot
    {
      d.forEach((v,i) => { // check distance for each slot 
        if (v <= x) // if slot is at max distance, call recursive search
          R(-~m, [...d], i) // ~- is like '+1', but works on undefined too
      });
    }
    else
    {
      console.log(d+[]); // no free slot, output current solution
    }
  }

  R() // first step call
}

Test nella console di Firefox / FireBug

F(5)

1,4,3,5,2
1,5,3,4,2
3,1,4,5,2
3,1,5,4,2
4,1,3,5,2
5,1,3 , 4,2
4,1,5,3,2
5,1,4,3,2
2,4,1,5,3
2,5,1,4,3
3,4,1,5,2
3 , 5,1,4,2
2,3,4,1,5
2,3,5,1,4
2,4,3,1,5
2,5,3,1,4
2,4,5, 1,3
2,5,4,1,3
2,4,3,5,1
2,5,3,4,1


2

Mathematica, 123 104

f[n_,s_:{}]:=If[Length@s<n,f[n,s~Join~{#}]&/@MaximalBy[Range@n,Min@Abs[#-s]&];,Print@@Ordering@s~Mod~10]

@ MartinBüttner n~f~s~Join~{#}diventerà Join[f[n,s],{#}].
alephalpha,

Oh giusto, ho pensato che fosse giusto associativo.
Martin Ender,

1

MATLAB, 164

function o=t(n),o=mod(r(zeros(1,n)),10);function o=r(s),o=[];d=bwdist(s);m=max(d);J=find(d==m);if~d,o=s;J=[];end,n=max(s)+1;for j=J,o=[o;r(s+n*(1:numel(s)==j))];end

1

Perl, 174

Non molto breve, ma divertente. Non conto use feature 'say';per il totale dei byte.

$n=pop;@u="_"x$n." "x$n."_"x$n;for$p(1..$n){@u=map{my@r;for$x(reverse 0..$n){
s/(?<=\D{$x}) (?=\D{$x})/push@r,$_;substr $r[-1],pos,1,$p%10/eg and last;
}@r}@u}y/_//d&&say for@u

De-giocato a golf:

$n = pop; # Get number of urinals from commandline
@state = ( "_" x $n . " " x $n . "_" x $n );

for my $person (1 .. $n) {
  # Replace each state with its list of possible next states.
  @state = map {
    my @results;
    for my $distance (reverse 0 .. $n) {
      # If there are any spots with at least $distance empty on
      # both sides, then add an entry to @results with the current
      # $person number in that spot, for each spot. Note that this
      # is only used for its side-effect on @results; the modified $_
      # is never used.
      s{
        (?<=\D{$distance})
        [ ]
        (?=\D{$distance})
      }{
        push @results, $_;
        substr $results[-1], pos(), 1, $person % 10;
      }xeg
      # If we found any spots, move on, otherwise try
      # with $distance one lower.
      and last;
    }
    # New state is the array we built up.
    @results;
  } @state;
}

# After adding all the people, remove underscores and print the results
for my $result (@state) {
  $result =~ tr/_//d;
  say $result;
}

1

C, 248 byte

Questo codice utilizza un algoritmo ricorsivo per generare il risultato desiderato.

void q(char*f,int l,int d,char*o){char*c=f;while(f<c+l){if(!*f){sprintf(o+4*d,"%03i,",f-c);*f=1;q(c,l,d+1,o);*f=0;}f++;}if(d+1==l){o[4*d+3]=0;printf("%s\n",o);}}int main(int i,char**v){int k=atoi(v[1]);char*c=calloc(k,5),*o=c+k;q(c,k,0,o);free(c);}

Allargato:

void printperms(char* memory,int length,int offset,char*output)
{
    char*temp_char=memory;
    while(memory<temp_char+length)
    {
        if(!*memory)
        {
            sprintf(output+4*offset,"%03i,",memory-temp_char);
            *memory=1;
            printperms(temp_char,length,offset+1,output);
            *memory=0;
        }
        memory++;
    }
    if(offset+1==length)
    {
        output[4*offset+3]=0;
        printf("%s\n",output);
    }
}

int main(int i,char**v)
{
    int argument=atoi(v[1]);
    char*t=calloc(argument,5),*output=t+argument;
    printperms(t,argument,0,output);
    free(t);
}

1

Bash, 744 674 byte

Questo è ancora troppo lungo :). Uso una stringa per rappresentare la fila di orinatoi e un algoritmo di allagamento per trovare gli orinatoi più distanti in ogni fase della ricorsione. Il codice non golfato è quasi autoesplicativo. Il numero di orinatoi viene letto dalla tastiera.

Codice (golf):

read l;u=----------;u=-${u::$l}-
s(){ u=${u:0:$1}$2${u:$((1+$1))};}
m(){ local u=$1;a=();while :;do [ 0 -ne `expr index - ${u:1:$l}` ]||break;t=$u;y=$u;for i in `seq $l`;do [ ${y:$i:1} = - ]||{ s $(($i-1)) X;s $(($i+1)) X;};done;done;while :;do k=`expr index $t -`;[ 0 != $k ]||break;t=${t:0:$(($k-1))}X${t:$k};if [ 1 -ne $k ]&&[ $(($l+2)) -ne $k ];then a+=($(($k-1)));fi;done;}
e(){ local u f b v;u=$1;f=$2;if [ 1 -eq $l ];then echo 1;return;fi;if [ 1 = $f ];then for i in `seq $l`;do v=$u;s $i 1;e $u 2;u=$v;done;else m $u;b=(${a[@]});if [ 0 -eq ${#b} ];then echo ${u:1:$l};else for i in ${b[@]};do v=$u;s $i $(($f%10));e $u $(($f+1));u=$v;a=(${b[@]});done;fi;fi;}
e $u 1

Uso:

$ source ./script.sh
input number of urinals from keyboard

E ungolfed dice:

read l  # read number of urinals
u=----------
u=-${u:0:$l}- #row is two positions longer (it will be helpful when finding the most distant urinals)

# So, for the end, with 6 men, u might look like this:
# -143652-

# subu no fellow_no => set urinal [number] occupied by [fellow_no]
# this is just convenience for resetting a character inside a string
subu(){ u=${u:0:$1}$2${u:$((1+$1))};}


# this will be iterated in longest to find the remotest places:
# -1---3---2- => spreadstep => X1X-X3X-X2X => spreadstep => X1XXX3XXX2X
# see longest() to get more explanation.
spreadstep()
{
    y=$u
    for i in `seq 1 $l`
    do
    if [ "${y:$i:1}" != "-" ]
    then
        subu $(($i-1)) X
        subu $(($i+1)) X
    fi
    done
}

# Find the urinals with the longest distance. It uses spreadstep() - see above.
# -1---3---2- => spreadstep => X1X-X3X-X2X => spreadstep => X1XXX3XXX2X
# ---> last state with free ones was X1X-X3X-X2X ,
#                                     123456789
# free urinals are no. 3 and no. 7 => save them to arr
longest()
{
    local u=$1
    arr=()
    while true
    do
        if [ 0 -eq `expr index - ${u:1:$l}` ]
        then
            break
        fi
        save=$u
        spreadstep
    done

    while true
    do
        index=`expr index $save -`
        if [ 0 == $index ]
        then
            break
        fi

        save=${save:0:$(($index-1))}X${save:$index}
        if [ 1 -ne $index ] && [ $(($l+2)) -ne $index ]
        then
            arr+=($(($index-1)))
        fi
    done
}

# main function, recursively called
# the first fellow may take any of the urinals.
# the next fellows - only those with the longest distance.
placements_with_start()
{
    local u=$1
    local fellow=$2
    if [ 1 -eq $l ] # special case - there is no 2nd fellow, so below code would work incorrect 
    then
        echo "1"
        return
    fi
    if [ 1 == $fellow ]       # may take any of urinals
    then
        for i in `seq 1 $l`
        do
            local _u=$u
            subu $i 1                     # take the urinal
            placements_with_start $u 2    # let the 2nd fellow choose :)
            u=$_u
        done
    else
        longest $u   # find the ones he can take
        local _arr=(${arr[@]})
        if [ 0 -eq ${#_arr} ]
        then
            echo ${u:1:$l}    # no more free urinals - everyone took one - print the result
        else
            for i in ${_arr[@]}
            do
                local _u=$u
                subu $i $(($fellow % 10))                # take urinal
                placements_with_start $u $(($fellow+1))  # find locations for for next fellow
                u=$_u
                arr=(${_arr[@]})
            done
        fi
    fi
}

placements_with_start $u 1
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.