Distribuir um baralho ASCII

13

Nunca houve realmente um desafio definitivo para cartões ASCII AFAIK. Portanto, usando o seguinte baralho de cartões ASCII:

.------..------..------..------..------..------..------..------..------..------..------..------..------.
|2.--. ||3.--. ||4.--. ||5.--. ||6.--. ||7.--. ||8.--. ||9.--. ||T.--. ||J.--. ||Q.--. ||K.--. ||A.--. |
| (\/) || (\/) || (\/) || (\/) || (\/) || (\/) || (\/) || (\/) || (\/) || (\/) || (\/) || (\/) || (\/) |
| :\/: || :\/: || :\/: || :\/: || :\/: || :\/: || :\/: || :\/: || :\/: || :\/: || :\/: || :\/: || :\/: |
| '--'2|| '--'3|| '--'4|| '--'5|| '--'6|| '--'7|| '--'8|| '--'9|| '--'T|| '--'J|| '--'Q|| '--'K|| '--'A|
'------''------''------''------''------''------''------''------''------''------''------''------''------'
.------..------..------..------..------..------..------..------..------..------..------..------..------.
|2.--. ||3.--. ||4.--. ||5.--. ||6.--. ||7.--. ||8.--. ||9.--. ||T.--. ||J.--. ||Q.--. ||K.--. ||A.--. |
| :/\: || :/\: || :/\: || :/\: || :/\: || :/\: || :/\: || :/\: || :/\: || :/\: || :/\: || :/\: || :/\: |
| :\/: || :\/: || :\/: || :\/: || :\/: || :\/: || :\/: || :\/: || :\/: || :\/: || :\/: || :\/: || :\/: |
| '--'2|| '--'3|| '--'4|| '--'5|| '--'6|| '--'7|| '--'8|| '--'9|| '--'T|| '--'J|| '--'Q|| '--'K|| '--'A|
'------''------''------''------''------''------''------''------''------''------''------''------'
.------..------..------..------..------..------..------..------..------..------..------..------..------.
|2.--. ||3.--. ||4.--. ||5.--. ||6.--. ||7.--. ||8.--. ||9.--. ||T.--. ||J.--. ||Q.--. ||K.--. ||A.--. |
| :/\: || :/\: || :/\: || :/\: || :/\: || :/\: || :/\: || :/\: || :/\: || :/\: || :/\: || :/\: || :/\: |
| (__) || (__) || (__) || (__) || (__) || (__) || (__) || (__) || (__) || (__) || (__) || (__) || (__) |
| '--'2|| '--'3|| '--'4|| '--'5|| '--'6|| '--'7|| '--'8|| '--'9|| '--'T|| '--'J|| '--'Q|| '--'K|| '--'A|
'------''------''------''------''------''------''------''------''------''------''------''------''------'
.------..------..------..------..------..------..------..------..------..------..------..------..------.
|2.--. ||3.--. ||4.--. ||5.--. ||6.--. ||7.--. ||8.--. ||9.--. ||T.--. ||J.--. ||Q.--. ||K.--. ||A.--. |
| :(): || :(): || :(): || :(): || :(): || :(): || :(): || :(): || :(): || :(): || :(): || :(): || :(): |
| ()() || ()() || ()() || ()() || ()() || ()() || ()() || ()() || ()() || ()() || ()() || ()() || ()() |
| '--'2|| '--'3|| '--'4|| '--'5|| '--'6|| '--'7|| '--'8|| '--'9|| '--'T|| '--'J|| '--'Q|| '--'K|| '--'A|
'------''------''------''------''------''------''------''------''------''------''------''------''------'

Pegue dois números inteiros pe qcomo entrada; onde pé o número de jogadores e qo número de cartões que cada jogador recebe.

  • Embaralhe aleatoriamente o baralho de cartas (isso é ambíguo, mas significa que todas as cartas devem ter a mesma probabilidade de aparecer em qualquer lugar uma vez).
  • Distribua 1 rodada de cartas por jogador, gerando qlinhas de pcartas a cada linha.

Regras:

  • Os resultados devem ser uniformemente aleatórios, cada cartão deve ter a mesma probabilidade de aparecer em qualquer lugar.
  • É garantido que 0 < p*q <= 52 and p < 10, você pode ter um comportamento indefinido para cenários em que isso não é atendido.
  • Você deve gerar qlinhas de cartões com pcartões por linha.
  • Cada coluna deve ser separada por | (um caractere de tubo cercado por espaços); se você escolher um caractere diferente, explique o motivo. Os espaços circundantes aqui NÃO são opcionais.
  • Cada linha deve ter 1 ou mais novas linhas entre elas, mais de uma é aceitável, 0 não é (1 nova linha significa a nova linha por padrão).
  • Cada linha deve ser rotulada com o player que o possui no formato "Player N" (0 ou 1 indexado é bom).
  • Nenhum cartão pode aparecer mais de uma vez.
  • T é para dez.

Exemplos:

Função ( p=1,q=1):

Player 1 # Can also be 0.
.------.
|2.--. |
| (\/) |
| :\/: |
| '--'2|
'------'

Função ( p=2,q=1):

Player 1 | Player 2 # Can also be "Player 0 | Player 1"
.------. | .------.
|2.--. | | |T.--. |
| (\/) | | | (\/) |
| :\/: | | | :\/: |
| '--'2| | | '--'T|
'------' | '------'

Função ( p=2,q=2):

Player 1 | Player 2 # Can also be "Player 0 | Player 1"
.------. | .------.
|J.--. | | |3.--. |
| (\/) | | | :/\: |
| :\/: | | | :\/: |
| '--'J| | | '--'3|
'------' | '------'
.------. | .------.
|8.--. | | |6.--. |
| :(): | | | :/\: |
| ()() | | | (__) |
| '--'8| | | '--'6|
'------' | '------'

Crédito artístico para uma fonte em: http://patorjk.com/software/taag

Urna de polvo mágico
fonte
5
Você vai postar muitos desafios com os cartões encontrados em patorjk.com/software/taag ?
1
Soooo ... Podemos "usar" este site para gerar o resultado ???
J42161217
1
Quero dizer: Posso criar um programa que produz patorjk.com/software/taag/… para o seu último caso de teste?
J42161217
5
Além disso, Each row must have 1 or more newlines inbetween them, more than one is acceptable, 0 is not.... Mas seus casos de teste não têm novas linhas entre cartões ..?
totallyhuman
1
Havia quase um desafio nos cartões ASCII: o tempo de jogo publicado por mim.
sergiol 25/10

Respostas:

6

Carvão , 142 133 125 bytes

NθFN«F¬¬ι«→↑×⁶θ| »Player IιFθ«↙↓.↓⁴←'←⁶↑'↑⁴.P⁶↓≔‽⁵²εW№υε≔‽⁵²ε⊞υε≔§”w↘τ[⁵PkxτG”εδδ.--.¶✂”{➙aETê;s∨Hμ⁼⎚↑Z~SÀd~⌀Tê”﹪ε⁴φ⁴'--'δ↘

Experimente online! Link é a versão detalhada do código. Edit: Salvo 9 bytes, melhorando meu código de amostragem aleatória. Economizei mais 8 bytes melhorando o código de impressão do meu traje. Explicação:

Nθ

Leia o número de cartões em q.

FN«

Faça um loop sobre cada jogador.

F¬¬ι«→↑×⁶θ| »

Se este não for o primeiro reprodutor, imprima a linha vertical entre o reprodutor anterior e este.

Player Iι

Imprima o número do jogador.

Fθ«

Loop sobre cada cartão.

↙↓.↓⁴←'←⁶↑'↑⁴.P⁶↓

Imprima a borda do cartão.

≔‽⁵²εW№υε≔‽⁵²ε⊞υε

Escolha um índice de cartão que ainda não tenha sido escolhido e adicione-o à lista de índices de cartões escolhidos.

≔§”w↘τ[⁵PkxτG”εδδ

Escolha e imprima a classificação do cartão indexando ciclicamente em uma sequência de classificações válidas de cartões ( 2-9, T, J, Q, K, A).

.--.¶

Imprima a parte superior do terno.

✂”{➙aETê;s∨Hμ⁼⎚↑Z~SÀd~⌀Tê”﹪ε⁴φ⁴

Imprima o meio do traje cortando em uma corda. A fatia começa no módulo de índice de cartas 4 e leva a cada 4 caracteres até que a sequência se esgote (ou o f1000 caractere seja atingido). Como 4 e 13 são coprime, isso garante que todas as 52 placas sejam possíveis.

'--'δ↘

Imprima a parte inferior do naipe e uma cópia da classificação e, em seguida, vá para um ponto que não esteja muito longe da cópia da classificação, do início da próxima carta ou do início da linha divisória. próximo jogador.

Neil
fonte
Quando vi isso na sandbox, foi um desafio kc imprimir o baralho, o que levou 102 bytes: Experimente online! Link é a versão detalhada do código.
Neil
3

Python 2 , 357 bytes

from random import*
p,q=input()
A,V=':/\:',':\/:'
c=sample([(""".------.
|%s.--. |
| %s |
| %s |
| '--'%s|
'------'"""%(n,s,t,n)).split('\n')for s,t in('(\/)',V),(A,V),(A,'(__)'),(':():','()()')for n in'123456789TJQKA'],p*q)
print' | '.join('Player '+`i`for i in range(p))
for i in range(0,p*q,p):print'\n'.join(map(' | '.join,zip(c[i:i+p][0],c[i:i+p][1])))

Experimente online!

Não tenho a menor idéia.

totalmente humano
fonte
3

Gelatina , 126 bytes

³‘Ḷj“×ṁẹHY»;⁶¤ṫ5W;
2r9;“TJQKA”
“¡ẏ%TZ=ẹaɦAY’ṃ“(\/)_:”s4s2
“E¬ƭḊHẈḢ“ðİ“|e*Ḳ?BḤ’ṃ“. -|1¶'”żÐ€¢FỴ$€p2£j/€Ẋ
¢ssḢµṣ€”1Zj€“ | ”Yµ€ÑY

Experimente online!

fireflame241
fonte
3

JavaScript (ES6), 328 ... 312 bytes

Recebe entrada na sintaxe de currying (p)(q). Os jogadores são indexados em 0.

p=>g=(q,i=p*q*6,d=[...Array(52).keys(a=`:\\/:,(__),()(),(\\/),:/\\:,:():, | ,
,.3.,|0.--. |,| 1 |,| 2 |,| '--'0|,'3',Player 4`.split`,`)].sort(_=>Math.random()-.5))=>i--+p?g(q,i,d)+a[i%p?6:7]+a[i<0?14:i/p%6|8].replace(/\d/,c=>['TJQKA'[j=x>>2]||j-3,a['3454'[x&=3]],a[x%3],'------',p+i][c],x=d[i%p+p*(i/p/6|0)]):''

Demo

Quão?

Esta é uma função recursiva, construindo a saída de baixo para cima. Durante a parte principal em que as cartas são sorteadas, ié inicializada p*q*6e diminuída até que ela chegue 0. Em seguida, desenhamos o cabeçalho decrementando ainda mais iaté alcançar -p.

A arte ASCII é dividida em pequenos pedaços armazenados na matriz a[]. A tabela abaixo descreve o conteúdo de a[], o que facilita o entendimento do restante do código.

 Index | Content    | Description
-------+------------+------------------------------------------------
    0  | ":\\/:"    | bottom of 'diamonds' and 'hearts'
    1  | "(__)"     | bottom of 'spades'
    2  | "()()"     | bottom of 'clubs'
    3  | "(\\/)"    | top of 'hearts'
    4  | ":/\\:"    | top of 'diamonds' and 'spades'
    5  | ":():"     | top of 'clubs'
    6  | " | "      | player separator
    7  | "\n"       | line-feed
    8  | ".3."      | card row #1, "3" --> "------"
    9  | "|0.--. |" | card row #2, "0" --> symbol of card value
   10  | "| 1 |"    | card row #3, "1" --> top of color ASCII art
   11  | "| 2 |"    | card row #4, "2" --> bottom of color ASCII art
   12  | "| '--'0|" | card row #5, "0" --> symbol of card value
   13  | "'3'"      | card row #6, "3" --> "------"
   14  | "Player 4" | header, "4" --> player ID

Formatado e comentado

p => g = (                                // p = number of players
  q,                                      // q = number of cards
  i = p * q * 6,                          // i = counter
  d = [...Array(52).keys(                 // d = deck
    a = `:\\/:,(__),...`.split`,`         // a = ASCII art pieces (truncated, see above)
  )].sort(_ => Math.random() - .5)        // shuffle the deck
) =>                                      //
  i-- + p ?                               // if i is greater than -p:
    g(q, i, d) +                          //   do a recursive call and append ...
    a[i % p ? 6 : 7] +                    //   separator or line-feed
    a[i < 0 ? 14 : i / p % 6 | 8]         //   header or card row
    .replace(/\d/, c => [                 //   where digits are replaced with:
        'TJQKA'[j = x >> 2] || j - 3,     //     0: symbol of card value
        a['3454'[x &= 3]],                //     1: top of color ASCII art
        a[x % 3],                         //     2: bottom of color ASCII art
        '------',                         //     3: horizontal border
        p + i                             //     4: player ID
      ][c],                               //
      x = d[i % p + p * (i / p / 6 | 0)]  //   x = current card with: bits 0-1 = color
    )                                     //                          bits 2-5 = value
  :                                       // else:
    ''                                    //   stop recursion
Arnauld
fonte
2

Python 2 , 382 358 346 338 332 bytes

from random import*
p,n=input()
d=zip([0,1,2,3]*13,'23456789TJQKA'*4)
shuffle(d)
C=""".------.
|%s.--. |
| %s |
| %s |
| '--'%s|
'------'"""
print' | '.join('Player '+`i`for i in range(p))
exec"for l in zip(*[(C%(v,'(:::\/(//\)\):::'[s::4],':((:\_)\/_(/:)):'[s::4],v)).split('\\n')for s,v in d[:p]]):print' | '.join(l)\nd=d[p:]\n"*n

Experimente online!

TFeld
fonte
2

SOGL V0.12 , 106 bytes

E⁽⁰⅜║(Ηe─t¦4»\$²‘8n{"1<ω⅛┘‘4n╬¡;4n33žASUjk"TJQKA”+{a;22žF75ž}}'#δ№{ψ⌡≤οc+C}c_.∫:"▓⅛▲ŗ‘Κ⁽e{≤+};H?;lƧ |Γ∙┼;┼

Experimente aqui!

Geração de cartão:

...‘                     push "(\/):\/::/\::\/::/\:(__):():()()" - the suits
    8n                   split to line lengths of 8 - individual suits
      {                  for each suit
       "...‘               push ".---| .-|   " - a quarter of a suit
            4n             split to line lengths of 4 - [".---", "| .-", "|   "]
              έ           quad palindromize - empty card
                ;          get the suit on top
                 4n        split to line lengths of 4
                   33ž     insert in the card at [3; 3]
                      A    save on variable A - card template
SU                         push "1234567890"
  jk                       remove the first and last digits
    "TJQKA”+               append "TJQKA"
            {         }    for each number - "23456789TJQKA"
             a               load the template
              ;22ž           at [2; 2] insert the current number
                  F75ž       at [7; 5] insert the current number

Baralhar:

'#             push 52
  δ            lower range - [0, 1, ..., 50, 51]
   №           reverse - [51, 50, ..., 1, 0]
    {       }  for each, pushing the current item
     ψ           get a random number from 0 to ToS (inclusive)
      ⌡          that many times
       ≤           put the first item of the stack on the top
        οc+C     prepend that to the variable C, predefined with an empty array

Lidando:

c_              push Cs contents on the stack - the stack is now a mess of cards
  .∫            repeat input times - each player - pushing the current player number
    :             duplicate the number
     "..‘         push "player "
         Κ        prepend "player " to the number
          ⁽       uppercase the 1st letter
           e{  }  repeat 2nd input times
             ≤      put the first stack item on the top
              +     append it to "Player X" vertically (making an array)
;                 get the other copy of the player number
 H?               if POP-1 (aka if it's not 1)
   ;                swap the top 2 items - the current collumn and all the previous ones (by then they've been joined together)
    l               get its (vertical) length
     Ƨ |            push " |"
        Γ           palindromize - [" | "]
         ∙          multiply " | " vertically that length times
          ┼         append it horizontally (to the previous collumns)
           ;┼       append the current collumn
dzaima
fonte
2

Ruby, 262 bytes

->p,q{a=[*0..51].shuffle
puts ["Player %d"]*p*(d=" | ")%[*1..p],(1..q*6).map{|i|(["'------'
.------.
|%X.--. |
| %s |
| %s |
| '--'%X|".split($/)[i%6]]*p*d%a[i/6*p,p].map{|j|["(\\/):()::/\\:"[u=j%4*4-4,4],":\\/:()():\\/:(__)"[u,4],j/4][i%3]}).tr("01BC","TJQK")}}

Mais difícil de seguir, mas mais curto!

Ruby, 279 bytes

->p,q{puts [*1..p].map{|k|"Player #{k}"}*" | "
a=[*0..51].shuffle
(q*6).times{|i|puts [".------.
|%s.--. |
| %s |
| %s |
| '--'%s|
'------'".split($/)[i%6]]*p*" | "%a[i/6*p,p].map{|j|[":\\/:()():\\/:(__)"[u=j%4*4-4,4],("%X"%(j/4)).tr("01BC","TJQK"),"(\\/):()::/\\:"[u,4]][i%3]}}}

Cria um formato para cada linha e depois usa o %operador sprintfpara preenchê-lo.

O fato de o valor do cartão aparecer em cada terceira linha é útil. Os valores do cartão são apresentados em hexadecimal com os dígitos 01BCsubstituídos por TJQK.

Os 4 bytes salvos dos símbolos do naipe, considerando que a parte superior dos diamantes e espadas são os mesmos, mas adicionados 2 novamente no -4final dos j%4*4-4códigos do naipe são -4 0 4 ou 8, onde [-4,4]significa 4 caracteres iniciando o 4º último caractere no corda.

Provavelmente poderia salvar mais alguns bytes. Ter que repetir o código para a identificação do jogador é feio.

Level River St
fonte
2

PHP, 509 bytes

<?$hu='(\/}';$hv=$dv=':\/:';$du=$su=':/\:';$sv='(__)';$cu=':():';$cv='()()';$q="------";$t=$argv[1];foreach([h,d,s,c]as$a)foreach([2,3,4,5,6,7,8,9,T,J,Q,K,A]as$b)$c[]=[$b,$a];shuffle($c);$h=$a=0;for(;$a<$t;$a++)$e[]="Player $a";$f[]=join(" | ",$e);for($g=$argv[2];$g--;){$p=$i=$k=$l=$m=$r=[];$j=$h+$t;for(;$h<$j;$h++){$n=$c[$h][0];$o=$c[$h][1];$p[]=".$q.";$i[]="|$n.--. |";$k[]="| ${$o.u} |";$l[]="| ${$o.v} |";$m[]="| '--'$n|";$r[]="'$q'";}foreach([p,i,k,l,m,r]as$b)$f[]=join(" | ",${$b});}echo join('
',$f);

Experimente online!

Esta é a minha primeira tentativa de código de golfe, por isso provavelmente pode ser melhorada bastante. Eu imaginei que tinha que começar em algum lugar. :)

Jo.
fonte
1

Java (OpenJDK 8) , 784 835 843 826 815 781 775 bytes

String k(String s){return s.replaceAll("...$","\n");}
p->q->{int c=0,l=0,s[]=new int[p*q],i=0,j,t,b;java.util.List e=new java.util.Stack();String v="TJQK",o="",n[]=new String[p*q],x=o;for(;i<p;o+="Player "+i+++" | ",x+=v);o=k(o);for(i=0;i<q;i++){o=k(o+x.replace(v,".------. | "));for(j=0;j<p;j++){do{t=(int)(Math.random()*13)+1;b=(int)(Math.random()*4);}while(e.contains(t+""+v.charAt(b)));e.add(t+""+v.charAt(b));s[c]=b;n[c]=t<2?"A":t<10?""+t:""+v.charAt(t-10);o+="|2.--. | | ".replace("2",n[c++]);}o=k(o);for(j=0;j<p;j++,l++)o+="| "+(s[l]<1?"(\\/)":s[l]<3?":/\\:":":():")+" | | ";o=k(o);for(j=0;j<p;j++)o+="| "+(s[i*p+j]<2?":\\/:":s[i*p+j]<3?"(__)":"()()")+" | | ";o=k(o);for(j=0;j<p;)o+="| '--'2| | ".replace("2",n[i*p+j++]);o=k(k(o)+x.replace(v,"'------' | "));}return o;}

Experimente online!

Por que o voto negativo, está em conformidade com as especificações

Roberto Graham
fonte
Além disso, você deve criar métodos alternativos em vez de criar Function<String,String>: o último é muito, muito caro. Tanto na criação quanto quando usado.
Olivier Grégoire
Eu estou supondo que o voto negativo foi para a resposta com bug original, mas a corrente parece correta, então eu votei para neutralizá-la. Algumas coisas pequenas no golfe: os parênteses podem ser removidos em n[c]=t<2?"A":t<10?""+t:""+"TJQK".charAt(t-10); for(j=0;j<p;j++){o+=...;l++;}pode ser for(j=0;j<p;l++,j++)o+=...;; você pode em return o;vez de System.out.print(o);usar um segundo em Functionvez de Consumer; ,y=p*qpode ser removido e você pode usar p*qduas vezes diretamente, em vez de y. Sem dúvida, há muito mais para jogar golfe, mas não tenho tempo para investigar isso agora. #
447 Kevin Cruijssen
1
@KevinCruijssen Na verdade, não. Fiz um voto negativo após a primeira edição por "nenhum esforço no golfe" além de remover espaços e usar nomes de variáveis ​​com 1 caractere. Meu palpite é que Roberto Graham deve reler inteiramente as dicas para jogar golfe em Java . O ponto é que ele realmente cumpre as especificações do desafio, mas não as especificações da tag code-golf.
Olivier Grégoire
Como sei que ele pode ser jogado ainda mais? Eu tinha cerca de 400 bytes quando desisti depois de ver esta resposta e calculei em mais 50 bytes o restante para finalizá-la. 450 bytes vs. 850, quase não há golfe envolvido.
Olivier Grégoire
s[l]<2?":/\\:":s[l]<3?":/\\:"pode ser s[l]<3?":/\\:"e s[i*p+j]<1?":\\/:":s[i*p+j]<2?":\\/:"pode ser s[i*p+j]<2?":\\/:". @ OlivierGrégoire E eu sei que é provável que esteja quase pela metade, então eu entendo o voto negativo. Mas isso é principalmente falta de experiência e, na verdade, não é possível ler todas as dicas várias vezes. Algumas das coisas da resposta que eu fiz no passado também, e esse não é um desafio fácil para o Java. Btw, se você tem uma resposta de 400 a 450 bytes, por que não a publica como uma resposta separada (se é significativamente diferente o suficiente)? Você gostaria do meu voto. ;)
Kevin Cruijssen 26/10
1

Python 3, 332 bytes

from random import*
P=lambda x:print(*x,sep=' | ')
R=range
def f(p,c):
 P(f"Player {i}"for i in R(p))
 d=[f".------.,|{n}.--. |,| {a[:4]} |,| {a[4:]} |,| '--'{n}|,'------'".split(",")for a,n in sample([*zip(r':/\:(__) (\/):\/: :/\::\/: :():()()'.split()*13,'A23456789TJQK'*4)],p*c)]
 for i in R(c):
  for t in zip(*d[i::c]):
   P(t)
RootTwo
fonte