Menangani Dek ASCII


13

Tidak pernah ada tantangan ASCII-card yang pasti AFAIK. Jadi, gunakan dek kartu ASCII berikut:

.------..------..------..------..------..------..------..------..------..------..------..------..------.
|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|
'------''------''------''------''------''------''------''------''------''------''------''------''------'

Ambil dua bilangan bulat, pdan qsebagai input; di mana pjumlah pemain dan qjumlah kartu yang didapat setiap pemain.

  • Acak tumpukan kartu secara acak (ini ambigu, tetapi berarti bahwa semua kartu harus memiliki kemungkinan yang sama muncul di mana saja sekali).
  • Menangani 1 putaran kartu per pemain, menghasilkan qbaris pkartu setiap baris.

Aturan:

  • Hasilnya harus acak secara acak, setiap kartu harus memiliki kemungkinan yang sama untuk muncul di mana saja.
  • Dijamin bahwa 0 < p*q <= 52 and p < 10, Anda mungkin memiliki perilaku yang tidak ditentukan untuk skenario di mana ini tidak terpenuhi.
  • Anda harus menampilkan qderetan kartu dengan pkartu per baris.
  • Setiap kolom harus dipisahkan oleh | (char pipa dikelilingi oleh spasi); jika Anda memilih char yang berbeda dari ini, jelaskan alasannya. Ruang di sekitar sini BUKAN opsional.
  • Setiap baris harus memiliki 1 atau lebih baris baru di antara mereka, lebih dari satu dapat diterima, 0 tidak (1 baris berarti baris baru di sana secara default).
  • Setiap baris harus diberi label dengan pemain yang memilikinya dalam format "Player N" (0 atau 1-diindeks baik-baik saja).
  • Tidak ada satu kartu pun yang muncul lebih dari satu kali.
  • T adalah untuk Sepuluh.

Contoh:

Fungsi ( p=1,q=1):

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

Fungsi ( p=2,q=1):

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

Fungsi ( p=2,q=2):

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

Penghargaan artistik untuk font di: http://patorjk.com/software/taag


5
Apakah Anda akan memposting banyak tantangan kartu dari kartu yang Anda temukan di patorjk.com/software/taag ?

1
Soooo ... Bisakah kita "menggunakan" situs ini untuk menampilkan hasilnya ???
J42161217

1
Maksud saya: Dapatkah saya membuat program yang menampilkan patorjk.com/software/taag/... ini untuk kasus pengujian terakhir Anda?
J42161217

5
Juga, Each row must have 1 or more newlines inbetween them, more than one is acceptable, 0 is not.... Tetapi kotak uji Anda tidak memiliki garis baru di antara kartu ..?
totallyhuman

1
Hampir ada satu tantangan pada kartu ASCII: Waktu bermain diposting oleh saya.
sergiol

Jawaban:


6

Charcoal , 142 133 125 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Sunting: Disimpan 9 byte dengan meningkatkan kode pengambilan sampel acak saya. Menyimpan 8 byte lebih lanjut dengan meningkatkan kode pencetakan setelan saya. Penjelasan:

Nθ

Baca jumlah kartu q.

FN«

Ulangi setiap pemain.

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

Jika ini bukan pemain pertama, cetak garis vertikal antara pemain sebelumnya dan ini.

Player Iι

Cetak nomor pemain.

Fθ«

Lingkari setiap kartu.

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

Cetak tepi kartu.

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

Pilih indeks kartu yang belum diambil, dan tambahkan ke daftar indeks kartu yang dipilih.

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

Pilih dan cetak peringkat kartu dengan melakukan pengindeksan secara siklis ke serangkaian peringkat kartu yang valid ( 2-9, T, J, Q, K, A).

.--.¶

Cetak bagian atas jas.

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

Cetak bagian tengah jas dengan mengiris tali. Iris dimulai pada kartu indeks modulo 4 dan mengambil setiap 4 karakter sampai string habis (atauf = 1000 tercapai). Karena 4 dan 13 adalah koprime, ini memastikan bahwa semua 52 kartu dimungkinkan.

'--'δ↘

Cetak bagian bawah jas dan salinan pangkat, dan kemudian pindah ke titik yang nyaman tidak terlalu jauh dari salinan pangkat, awal kartu berikutnya, atau awal garis pemisah untuk pemain selanjutnya.


Ketika saya melihat ini di kotak pasir itu adalah tantangan kc untuk mencetak dek, yang membawa saya 102 byte: Coba online! Tautan adalah untuk mengucapkan versi kode.
Neil

3

Python 2 , 357 byte

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])))

Cobalah online!

Saya tidak punya ide.


3

Jelly , 126 byte

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

Cobalah online!


3

JavaScript (ES6), 328 ... 312 byte

Mengambil input dalam sintaks currying (p)(q). Pemain diindeks 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

Bagaimana?

Ini adalah fungsi rekursif, membangun output dari bawah ke atas. Selama bagian utama di mana kartu ditarik, idiinisialisasi ke p*q*6dan dikurangi hingga mencapai 0. Kami kemudian menggambar header dengan menurunkan lebih lanjut isampai mencapai -p.

Seni ASCII dibagi menjadi beberapa bagian kecil yang disimpan ke dalam array a[]. Tabel di bawah ini menjelaskan konten a[], yang membuat sisa kode lebih mudah dimengerti.

 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

Diformat dan dikomentari

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

2

Python 2 , 382 358 346 338 332 byte

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

Cobalah online!


2

SOGL V0.12 , 106 byte

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

Coba Di Sini!

Menghasilkan kartu:

...‘                     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

Mengocok:

'#             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

Berurusan:

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

2

Ruby, 262 byte

->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")}}

Sulit untuk diikuti, tetapi lebih pendek!

Ruby, 279 byte

->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]}}}

Buat format untuk setiap baris, lalu gunakan %seperti operatorsprintf untuk mengisinya.

Fakta bahwa nilai kartu muncul di setiap baris ke-3 berguna. Nilai kartu disajikan dalam heksadesimal dengan digit yang 01BCdiganti TJQK.

Menyimpan 4 byte dari simbol suit dengan mempertimbangkan bahwa bagian atas berlian dan sekop adalah sama tetapi ditambahkan 2 kembali pada -4pada akhir j%4*4-4kode Suit adalah -4 0 4 atau 8 di mana [-4,4]berarti 4 karakter memulai karakter terakhir ke-4 dalam tali.

Mungkin bisa menyimpan beberapa byte lagi. Harus mengulang kode untuk identifikasi pemain itu jelek.


2

PHP, 509 byte

<?$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);

Cobalah online!

Ini adalah upaya pertama saya di kode golf, jadi mungkin bisa banyak ditingkatkan. Saya pikir saya harus mulai dari suatu tempat. :)


1

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

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;}

Cobalah online!

Mengapa downvote, itu sesuai dengan spek


Selain itu, Anda harus membuat metode alternatif alih-alih membuat Function<String,String>: yang terakhir sangat, sangat mahal. Baik saat pembuatan dan saat digunakan.
Olivier Grégoire

Saya berasumsi downvote adalah untuk jawaban yang disadap asli, tetapi saat ini tampaknya benar, jadi saya telah memilih untuk menetralisirnya. Beberapa hal kecil untuk golf: tanda kurung dapat dihapus di n[c]=t<2?"A":t<10?""+t:""+"TJQK".charAt(t-10); for(j=0;j<p;j++){o+=...;l++;}bisa for(j=0;j<p;l++,j++)o+=...;; Anda bisa return o;bukannya System.out.print(o);menggunakan satu detik Functionbukannya Consumer; ,y=p*qdapat dihapus dan Anda dapat menggunakan p*qdua kali secara langsung, bukan y. Tidak ada keraguan lagi untuk bermain golf, tapi saya tidak punya waktu untuk melihatnya sekarang
Kevin Cruijssen

1
@KevinCruijssen Sebenarnya, tidak. Saya downvoted setelah edit pertama untuk "no effort in golfing" di luar menghapus spasi dan menggunakan nama variabel 1-char. Dugaan saya adalah bahwa Roberto Graham harus sepenuhnya membaca kembali Tips untuk bermain golf di Jawa . Intinya adalah bahwa itu memang sesuai dengan spesifikasi tantangan, tetapi tidak dengan spesifikasi tag-golf tag.
Olivier Grégoire

Bagaimana saya tahu bisa bermain golf lebih lanjut? Saya sekitar 400 byte ketika saya menyerah setelah melihat jawaban ini, dan saya memperkirakan sekitar 50 byte sisanya untuk menyelesaikannya. 450 byte vs 850, hampir tidak ada golf yang terlibat.
Olivier Grégoire

s[l]<2?":/\\:":s[l]<3?":/\\:"bisa s[l]<3?":/\\:"dan s[i*p+j]<1?":\\/:":s[i*p+j]<2?":\\/:"bisa s[i*p+j]<2?":\\/:". @ OlivierGrégoire Dan saya sadar kemungkinan besar hampir setengahnya, jadi saya mengerti downvote. Tapi ini kebanyakan kurangnya pengalaman, dan memang tidak membaca semua tips beberapa kali. Beberapa hal dalam jawaban yang telah saya lakukan di masa lalu juga, dan ini bukan tantangan mudah khusus untuk Jawa. Btw, jika Anda memiliki jawaban 400-450 byte, mengapa Anda tidak mempostingnya sebagai jawaban yang terpisah (jika cukup berbeda)? Anda akan memiliki upvote saya. ;)
Kevin Cruijssen

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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.