language agnostic - Código de golf: Diamond Blackjack
language-agnostic code-golf (9)
El reto
El código más corto por número de caracteres para generar una mano de blackjack en el mejor de los casos de la lista de tarjetas de números.
La entrada es una lista de números del 1 al 10 (inclusive) separados por espacio.
La salida será la mejor mano de blackjack formada a partir de esa lista de cartas: el combo más cercano disponible para alcanzar 21 por la suma de todos los valores de la carta sin sobrepasarla. Las tarjetas pueden ser removidas pero no agregadas.
Si es necesario quitar dos o más cartas a favor de una para lograr el mismo resultado (quitar 5 o 4,1 para ganar 21), es necesario quitar la menor cantidad de cartas. Si se eliminará la misma cantidad de tarjetas (eliminando 1,4 o 3,2), el grupo con el mínimo del mínimo se eliminará (en el ejemplo anterior, 1,4 se eliminará como min(min(3,2), min(1,4))
pertenece a ese par). En el caso de tarjetas duplicadas, el primer encuentro debe ser eliminado.
La salida se formará como tarjetas de diamante, con el orden de entrada conservado:
__________ __________ | || | | || // | | || // | | // || | | // || | | || // | | || // | |__________||__________| __________ __________ | || | | // || // // | | // || // // | | // || | | // || | | // || // // | | // || // // | |__________||__________| __________ __________ | || | | // // || // // | | // // || // // | | // || // // | | // || // // | | // // || // // | | // // || // // | |__________||__________| __________ __________ | || | | // // || // // | | // // // || // // // | | // // // || // // // | | // // || // // // | | // // || // // // | | // // || // // | |__________||__________| __________ __________ | // // || // // | | // // || // // // | | // // || // // // | | // // // || // // | | // // // || // // | | // // || // // // | | // // || // // // | |_//____//_||_//____//_|
Casos de prueba
Input:
1 5 7 8
Output:
__________ __________ __________ __________
| || || || |
| || // // || // // || // // |
| || // // || // // // || // // // |
| // || // || // // // || // // // |
| // || // || // // || // // // |
| || // // || // // || // // // |
| || // // || // // || // // |
|__________||__________||__________||__________|
Input:
10 3 4 2 6
Output:
__________ __________ __________ __________
| // // || || || |
| // // // || // || // || // // |
| // // // || // || // || // // |
| // // || // || || // // |
| // // || // || || // // |
| // // // || // || // || // // |
| // // // || // || // || // // |
|_//____//_||__________||__________||__________|
Input
5 10 5 2 3
Output:
__________ __________ __________ __________
| // // || || || |
| // // // || // // || // || // |
| // // // || // // || // || // |
| // // || // || || // |
| // // || // || || // |
| // // // || // // || // || // |
| // // // || // // || // || // |
|_//____//_||__________||__________||__________|
El conteo de códigos incluye entrada / salida (es decir, programa completo).
Golfscript - 228 personajes
'' '':x/{~}%:h;9,{:r;h,2/?,{:m;h,,{2/?m&},{h/=}%}%1>{:j[{+}*.22</j,j$j]}$)/;{:c;[x]3,{4/?'' ////__''2/[11''?''*8''@''*''bb@BBbbbbbQY@AAQQQYYbfH@H@HbffYQD@D@DQQYfb@``bbbbfQY@PPQQQQQbf''8''?''*]'']]''+10r*c+=@/3&=}%[x]++'' _''1/7r&!=*}%''|'':x;n}%
$ echo 10 9 8 7 6 5 | ../golfscript.rb black.gs __________ __________ __________ | || || | | // // || // // || // // | | // // // || // // // || // // | | // // // || // // // || // // | | // // // || // // || // // | | // // // || // // || // // | | // // || // // || // // | |__________||__________||__________|
231 personajes
'' '':x/{~}%:h,2/?,{:m;h,,{2/?m&},{h/=}%}%1>{:j[{+}*.22</j,j$j]}$-1=:h;9,{:r;h{:c;[x]3,{4/?'' ////__''2/11''?''*8''@''*''bb@BBbbbbbQY@AAQQQYYbfH@H@HbffYQD@D@DQQYfb@``bbbbfQY@PPQQQQQbf''8''?''*'']]''++++10r*c+=@/3&=}%[x]++'' _''1/7r&!=*}%''|'':x;n}%
cómo funciona
# parse input into a list
'' '':x/{~}%:h
# create the powerset
,2/?,{:m;h,,{2/?m&},
# map the powerset onto the cards
{h/=}%}%
# trim the empty set from the powerset
1>
# sort the hands. most preferred hand will be last
{:j[{+}*.22</j,j$j]}$
# take the preferred hand from the end of the list
-1=:h;
# for r in 0..8
9,{:r
...more to follow
Python - 298 personajes
simplemente cambia el nombre del script como este
mv blackjack.py ''???????????@@@@@@@@bb@BBbbbbbQY@AAQQQYYbfH@H@HbffYQD@D@DQQYfb@``bbbbfQY@PPQQQQQbf????????]].py''
Aquí está el guión
import sys
h=map(int,raw_input().split());H=len(h);R=range
for r in R(9):x=["| "[1>r]];print"".join("_ "[0<r<8].join(x+[" ////__"[ord(sys.argv[0][r*10+c])*2>>i&6:][:2]for i in 0,2,4]+x)for c in max([[h[b]for b in R(H)if n&1<<b]for n in R(1<<H)],key=lambda c:(sum(c)<22,sum(c),len(c),sorted(c),c)))
y una muestra de ejecución
$ echo 1 2 3 4 5 | python ''???????????@@@@@@@@bb@BBbbbbbQY@AAQQQYYbfH@H@HbffYQD@D@DQQYfb@``bbbbfQY@PPQQQQQbf????????]].py''
__________ __________ __________ __________ __________ | || || || || | | || // || // || // // || // // | | || // || // || // // || // // | | // || || // || || // | | // || || // || || // | | || // || // || // // || // // | | || // || // || // // || // // | |__________||__________||__________||__________||__________|
Python - 365 personajes
h=map(int,raw_input().split());H=len(h);R=range
for r in R(9):x=["| "[1>r]];print"".join("_ "[0<r<8].join(x+[" ////__"[ord((''?''*11+''@''*8+''bb@BBbbbbbQY@AAQQQYYbfH@H@HbffYQD@D@DQQYfb@``bbbbfQY@PPQQQQQbf????????]]'')[r*10+c])*2>>i&6:][:2]for i in 0,2,4]+x)for c in max([[h[b]for b in R(H)if n&1<<b]for n in R(1<<H)],key=lambda c:(sum(c)<22,sum(c),len(c),sorted(c),c)))
$ echo 2 4 8 1 8 3| python blackjack.py __________ __________ __________ __________ | || || || | | // || // // || // // || // | | // || // // // || // // // || // | | || // // // || // // // || // | | || // // // || // // // || // | | // || // // // || // // // || // | | // || // // || // // || // | |__________||__________||__________||__________| $ echo 1 4 5 4 7 4 8| python blackjack.py __________ __________ __________ __________ __________ | || || || || | | || // // || // // || // // || // // | | || // // || // // || // // // || // // | | // || // || || // // // || | | // || // || || // // || | | || // // || // // || // // || // // | | || // // || // // || // // || // // | |__________||__________||__________||__________||__________|
369 personajes
h=map(int,raw_input().split());H=len(h);R=range;j=[]
for n in R(1<<H):c=[h[b]for b in R(H)if n&1<<b];j+=[(sum(c)<22,sum(c),len(c),sorted(c),c)]
for r in R(9):x=["| "[1>r]];print"".join("_ "[0<r<8].join(x+[" ////__"[ord((''?''*11+''@''*8+''bb@BBbbbbbQY@AAQQQYYbfH@H@HbffYQD@D@DQQYfb@``bbbbfQY@PPQQQQQbf????????]]'')[r*10+c])*2>>i&6:][:2]for i in 0,2,4]+x)for c in max(j)[-1])
377 personajes
h=map(int,raw_input().split());H=len(h);R=range;j=[]
for n in R(1<<H):c=[h[b]for b in R(H)if n&1<<b];j+=[(sum(c),len(c),sorted(c),c)]*(sum(c)<22)
T="@@@HD@@?@BA@@`P?@BAHD`P?@bQ@@bQ?@bQHDbQ?@bQbQbQ?@bYfQbQ?@bYfYfQ?bQbYfQb]bYfQbYf]"
for r in R(9):x=["| "[1>r]];print"".join("_ "[0<r<8].join(x+[" ////__"[ord((''?''+T[c*8-8:])[r])*2>>i&6:][:2]for i in 0,2,4]+x)for c in max(j)[-1])
408 caracteres
h=map(int,raw_input().split());H=len(h);R=range;j=[]
for n in R(1<<H):c=[h[b]for b in R(H)if n&1<<b];j+=[(sum(c),len(c),sorted(c),c)]*(sum(c)<22)
T="@@@DH@@ @AB@@P` @ABDHP` @Qb@@Qb @QbDHQb @QbQbQb @QfYbQb @QfYfYb QbQfYbQn QfYbQfYn".split();U="/x3f"
for r in R(9):s="_ "[0<r<8];x=["| "[1>r]];print"".join(s.join(x+[(" ","///","//","__")[ord((U+T[c-1]+U)[r])>>i&3]for i in 0,2,4]+x)for c in sorted(j)[-1][-1])
Lua, 895
Ok corrige ahora Incluso puede marcar 1 como as.
t=table p=ipairs j=arg x={}r={}o={}b=0 function f()local e,s,n,m=0,0,{}for i,v in p(j)do s=s+v e=e+(v+0==1 and 1 or 0)n[i]=v end t.sort(n)for i,v in p(n)do if o[i]and v~=o[i]then m=v>o[i]break end end while e>0 and s<12 do s=s+10 e=e-1 end if s<=21 and s>b or(s==b and(#j>#r or(#j==#r and m)))then b=s for i=1,#r>#j and #r or #j do r[i]=j[i]o[i]=j[i]end t.sort(o)end if s>0 then for i=1,#j do t.insert(x,t.remove(j,i))f()t.insert(j,i,table.remove(x))end end end f()t={" __________ ","| |","|__________|","| /// |","| /// |","| /// |","| /// /// |","| /// /// /// |","|_///____///_|"}c={"12224D223","125E226F3","125E4D6F3","127G227G3","127G4D7G3","127G7G7G3","1278HG7G3","1278H8HG3","17G78HG79","178HG78H9"}for i=1,9 do for j,x in p(r)do v=c[tonumber(x)]:sub(i,i):byte()io.write(v<64 and t[v-48]or(t[v-64]:gsub("[///]",{["/"]="//",["//"]="/"})))end io.write("/n")end
Salida de muestra:
>lua card.lua 8 9 10 7
__________ __________
| // // || // // |
| // // || // // // |
| // // || // // // |
| // // // || // // |
| // // // || // // |
| // // || // // // |
| // // || // // // |
|_//____//_||_//____//_|
>lua card.lua 1 4 5 4 7 4 8
__________ __________ __________ __________ __________
| || || || || |
| || // // || // // || // // || // // |
| || // // || // // || // // // || // // |
| // || // || || // // // || |
| // || // || || // // || |
| || // // || // // || // // || // // |
| || // // || // // || // // || // // |
|__________||__________||__________||__________||__________|
>lua card.lua 1 9 5 5
__________ __________ __________
| || || |
| || // // || // // |
| || // // || // // |
| // || // || // |
| // || // || // |
| || // // || // // |
| || // // || // // |
|__________||__________||__________|
Perl, 410 caracteres
No sé cuánta más mejora es posible, pero tal vez esto sea más fácil de transferir a GolfScript que el algoritmo de gnibbler:
sub R{for(@_){substr$q[$_],$B+$z,2,''///';substr$q[$_+1],$B+$z,2,''//'';
if($B==2){$B=8;R(8-$_);$B=2}}}
for$i(1..1<<(@p=@ARGV)){$s=$n=0;$i&1<<$n++&&($s+=21*$_+1)for@p;
$q=$s,$N=$i if$s<462&&$q<$s}
@q=($/)x9;for$p(grep$N&1<<$_,0..@p){
s/$/| |/for@q;
$B=5;($P=$p[$p])&1&&R(4-($P==7));$P-8||R 5,3;$P>9&&R 6,2;
$B=2;if($P>8){R 1,3,5,7}else{R 2if$P>1;R 6if$P>3;R 4if$P>5}$z+=12}
$q[0]=~y/| / _/;$q[-1]=~y/ /_/;print@q
Python, 632 caracteres
from itertools import*
o=sum;q=range;r=filter
l=map(int,raw_input().split())
s=r(lambda x:o(x)<22,chain.from_iterable(imap(combinations,repeat(l),q(len(l)+1))))
s=r(lambda x:o(x)==max(map(o,s)),s)
t=max(([(min(x),x)for x in s if len(x)==max(map(len,s))]))[1]
a=" __________ "
b="| |"
c="| // // |";e=c[::-1]
d="| // |";l=d[::-1]
g="| // |";k=g[::-1]
i="| // |";j=i[::-1]
h="| // // // |";f=h[::-1]
n="|_//____//_|"
m="|__________|"
y="aaaaaaaaaabbbbbbbbccbddcccccefbggeeeffchibibichhfejbjbjeefhcbkkcccchefblleeeeechmmmmmmmmnn"
for x in q(9):
print''''.join([globals()[y[x*10:(x+1)*10][v-1]]for v in t])
Salida de muestra:
10 5 7 4 1 1 __________ __________ __________ __________ __________ | // // || || || || | | // // // || // // || // // || || | | // // // || // // || // // || || | | // // || // || || // || // | | // // || // || || // || // | | // // // || // // || // // || || | | // // // || // // || // // || || | |_//____//_||__________||__________||__________||__________|
J , 303 caracteres
4(1!:2)~,&(10{a.)"1>,.&.>/4 :''''''////'''(x(<@:+)"1]4 2$1|.4#0 1)}y''&.>/@((<>1 7 1#1&|.@(2 10&#)&.>'' _'';''| '';''|_''),~>)"0(>({~[:(i.[:>./[*22&>)+/@>)(#:@i.@(2&^)@#<@#"1 _])".1!:1]3){a:,(((1$7);(a 0 _1;7),(a 0 2 _3 _1;7),((a=:,&.>//)0 2 6 8 _3 _1;4;_5)){&.><,{(2+i.5);2 5 8),(4 5;k);<2 5;6 5;k=:,{2 8;~>:+:i.4
$ echo -n 1 5 7 8 | jconsole test.ijs __________ __________ __________ __________ | || || || | | || // // || // // || // // | | || // // || // // // || // // // | | // || // || // // // || // // // | | // || // || // // || // // // | | || // // || // // || // // // | | || // // || // // || // // | |__________||__________||__________||__________| $ echo -n 10 3 4 2 6 | jconsole test.ijs __________ __________ __________ __________ | // // || || || | | // // // || // || // || // // | | // // // || // || // || // // | | // // || // || || // // | | // // || // || || // // | | // // // || // || // || // // | | // // // || // || // || // // | |_//____//_||__________||__________||__________| $ echo -n 5 10 5 2 3 | jconsole test.ijs __________ __________ __________ __________ | // // || || || | | // // // || // // || // || // | | // // // || // // || // || // | | // // || // || || // | | // // || // || || // | | // // // || // // || // || // | | // // // || // // || // || // | |_//____//_||__________||__________||__________|
El núcleo, encontrar la mejor mano, es realmente muy fácil. Genere el conjunto de potencias de las tarjetas dadas y seleccione el que tenga el valor más alto menor que 22.
({~[:(i.[:>./[*22&>)+/@>)(#:@i.@(2&^)@#<@#"1 _])
Entonces empezamos con una tarjeta en blanco.
<>1 7 1#1&|.@(2 10&#)&.>'' _'';''| '';''|_''
y capa sobre diamantes en los lugares apropiados.
''////'(x(<@:+)"1]4 2$1|.4#0 1)}y
El resto del programa está dominado por la tabla de qué diamantes van a dónde.
Perl
Robado descaradamente de la solución Python de gnibbler ; resulta ser tres caracteres más corto, en 362, si la entrada se da en la línea de comando.
sub p{(local$z=pop)?(@z=&p,map[@$_,$z],@z):[]}
for(p@ARGV){$t=0;$t+=$_ for@$_;($s,@c)=($t,@$_)if$t>=$s&&$t<22}
for$r(0..8){$x=$r?''|'':$";for$c(@c){print+join$r*($r<8)?$":''_'',$x,
map(join('''',((split//,'' ////__'')[ord(((''?'')x11,(''@'')x8,split//,
''bb@BBbbbbbQY@AAQQQYYbfH@H@HbffYQD@D@DQQYfb@``bbbbfQY@PPQQQQQbf????????]]''
)[$r*10+$c])*2>>$_&6..7])[0,1]),0,2,4),$x}print$/}
Para leer desde la entrada estándar, reemplace @ARGV
por @F
y use perl -an
; Usando el tradicional puntaje de golf de Perl, eso cuenta como 362.
Y, por supuesto, el otro truco de Python de gnibbler también se puede copiar.
$ perl -pechomp <<''END'' / > >''bb@BBbbbbbQY@AAQQQYYbfH@H@HbffYQD@D@DQQYfb@``bbbbfQY@PPQQQQQbf????????]]'' > sub p{(local$z=pop)?(@z=&p,map[@$_,$z],@z):[]} > for(p@F){$t=0;$t+=$_ for@$_;($s,@c)=($t,@$_)if$t>=$s&&$t<22} > for$r(0..8){$x=$r?''|'':$";for$c(@c){print+join$r*($r<8)?$":''_'',$x, > map(join('''',((split//,'' ////__'')[ord(((''?'')x11,(''@'')x8,split//,$0) > [$r*10+$c])*2>>$_&6..7])[0,1]),0,2,4),$x}print$/} > END $ wc -c <bb* 287 $ echo 10 5 2 9 3 | perl -an bb* __________ __________ __________ | // // || || // // | | // // // || // || // // | | // // // || // || // // | | // // || || // // // | | // // || || // // // | | // // // || // || // // | | // // // || // || // // | |_//____//_||__________||_//____//_|
Haskell probó mínimamente 721 caracteres
La versión actualizada de Haskell, ahora supuestamente funciona para todos los casos, pero probablemente podría hacer más pruebas.
import Data.List --17
--shorteners
m=map --6
r=reverse --10
l=length --9
u=True --7
g=minimum --10
--printing of the cards
p=foldl1(zipWith(++)).m d --26
a=[" __________ ","| |","| /// /// |",r(a!!2),"| /// |",r(a!!4),"| /// |",r(a!!6),"| /// |",r(a!!8),"| /// /// /// |",r(a!!10),"|_///____///_|","|__________|"] --190
j(Just x)=x --12
d(n+1)=m(j.(flip$lookup)(zip"abcedlgkijhfnm"a).("aaaaaaaaaabbbbbbbbccbddcccccefbggeeeffchibibichhfejbjbjeefhcbkkcccchefblleeeeechmmmmmmmmnn"!!).(+n))[0,10..80] --160
-- interaction and pipeline
main=interact$unlines.p.f.m read.words --39
f x=head.filter((<22).sum).r.sortBy(o x)$x:z x --47
-- generate all possible hands (power set)
z[]=[] --7
z(x:s)=s:m(x:)(z s)++z s --25
-- sorting logic
c f a b=compare(f a)$f b --25
o x a b|l a==l b=s x a b|u=c l a b --35
s o a b|g a==g b=t o a b|u=c g a b --35
t o a b|all(`elem`b)a=c(n o)a b|u=GT --37
n t=m(j.(`elemIndex`t)) --24
La versión de Haskell no ha terminado todavía 622 caracteres
no ganará ningún concurso de belleza, también podría mejorarse, estoy seguro, y no sigue exactamente las especificaciones (sigue trabajando en el problema de min(min(3,2), min(1,4))
también como el filtrado duplicado (la función o
necesita más casos)). A pesar de su estado incompleto, pasa todos los casos de prueba dados.
Cada línea se comenta ( --
) con la cantidad de caracteres en ella, incluida la nueva línea.
import Data.List --17
p=foldl1(zipWith(++)).m d --26
r=reverse --10
a=[" __________ ","| |","| /// /// |",r(a!!2),"| /// |",r(a!!4),"| /// |",r(a!!6),"| /// |",r(a!!8),"| /// /// /// |",r(a!!10),"|_///____///_|","|__________|"] --190
j(Just x)=x --12
d(n+1)=m(j.(flip$lookup)(zip"abcedlgkijhfnm"a).("aaaaaaaaaabbbbbbbbccbddcccccefbggeeeffchibibichhfejbjbjeefhcbkkcccchefblleeeeechmmmmmmmmnn"!!).(+n))[0,10..80] --160
m=map --6
main=interact$unlines.p.snd.f.m read.words --43
f x=head.filter((<22).fst).m(/x->(sum x,x))$r$sortBy o$x:z x --61
c f a b=compare(f a)$f b --25
z[]=[] --7
z(x:s)=s:m(x:)(z s)++z s --25
l=length --9
o a b|l a==l b=GT|True=c l a b --31