ASCII 데크 다루기


13

실제로 AFAIK에 대한 결정적인 ASCII 카드 도전은 없었습니다. 따라서 다음 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|
'------''------''------''------''------''------''------''------''------''------''------''------''------'

두 정수, 가지고 pq입력으로를; 여기서 p플레이어 q의 수는 각 플레이어가 얻는 카드의 수입니다.

  • 카드 덱을 무작위로 섞습니다 (모호하지만 모든 카드가 한 번에 같은 위치에 나타날 가능성이 있음).
  • 플레이어 당 1 라운드의 카드를 처리하여 각 행 qp카드의 행을 출력 합니다 .

규칙 :

  • 결과는 균일하게 무작위이어야하며, 각 카드는 어느 곳에서나 동일하게 나타날 것입니다.
  • 것을 보장 0 < p*q <= 52 and p < 10이 충족되지 않은 시나리오에 대한 정의되지 않은 동작을 할 수 있습니다.
  • 행당 q카드가있는 p카드의 행을 출력해야합니다 .
  • 각 열은 | (공백으로 둘러싸인 파이프 문자) 로 구분해야합니다 . 이것과 다른 문자를 선택하면 그 이유를 설명하십시오. 여기의 주변 공간은 선택 사항이 아닙니다.
  • 각 행에는 그들 사이에 하나 이상의 줄 바꿈이 있어야하며, 둘 이상의 줄 바꿈이 허용되며 0은 허용되지 않습니다 (기본적으로 줄 바꿈을 의미하는 줄 바꿈 1 개).
  • 각 행에는 "Player N"형식으로 해당 행을 소유 한 플레이어로 레이블이 지정되어야합니다 (0 또는 1- 인덱싱은 괜찮음).
  • 하나의 카드가 두 번 이상 나타날 수 없습니다.
  • T 10입니다.

예 :

기능 ( p=1,q=1) :

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

기능 ( p=2,q=1) :

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

기능 ( p=2,q=2) :

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

http://patorjk.com/software/taag 의 글꼴에 대한 예술적 신용


5
patorjk.com/software/taag 에서 찾은 카드에서 많은 카드 챌린지를 게시 하시겠습니까 ?

1
Soooo ... 결과를 출력하기 위해이 사이트를 "사용"할 수 있습니까 ???
J42161217

1
내 말은 : patorjk.com/software/taag/… 를 출력하는 프로그램을 만들 수 있습니까 ?
J42161217

5
또한 Each row must have 1 or more newlines inbetween them, more than one is acceptable, 0 is not....하지만 테스트 사례에는 카드 사이에 줄 바꿈이 없습니다 ..?
완전히 인간적인

1
ASCII 카드에 거의 문제가 있었다 : 재생 시간 내 옆에 게시 됨.
sergiol

답변:


6

, 142 (133) 125 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 편집 : 무작위 샘플링 코드를 개선하여 9 바이트를 절약했습니다. 양복 인쇄 코드를 개선하여 8 바이트를 더 절약했습니다. 설명:

Nθ

의 카드 수를 읽으십시오 q.

FN«

각 플레이어를 반복합니다.

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

첫 번째 플레이어가 아닌 경우 이전 플레이어와이 플레이어 사이의 세로선을 인쇄하십시오.

Player Iι

플레이어 번호를 인쇄하십시오.

Fθ«

각 카드를 반복합니다.

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

카드의 가장자리를 인쇄하십시오.

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

아직 선택하지 않은 카드 색인을 선택하여 선택한 카드 색인 목록에 추가하십시오.

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

유효한 카드 등급 문자열 ( 2-9, T, J, Q, K, A) 로 주기적으로 색인하여 카드 등급을 선택하고 인쇄하십시오 .

.--.¶

양복의 상단을 인쇄하십시오.

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

끈으로 자르면서 수트의 중간을 인쇄하십시오. 슬라이스는 카드 인덱스 모듈로 4에서 시작하여 문자열이 다 떨어질 때까지 (또는 f= 1000 번째 문자에 도달 할 때까지) 모든 4 번째 문자를 사용합니다. 4와 13이 공동 프라임이므로 52 개의 카드를 모두 사용할 수 있습니다.

'--'δ↘

수트의 바닥과 랭크 사본을 인쇄 한 다음 랭크 사본, 다음 카드의 시작 또는 분할 선의 시작과 너무 멀지 않은 지점으로 이동하십시오. 다음 선수.


샌드 박스에서 이것을 보았을 때 갑판을 인쇄하는 것은 kc 도전이었습니다 .102 바이트가 필요 했습니다. 온라인으로보십시오! 링크는 자세한 버전의 코드입니다.
Neil

3

파이썬 2 , 357 바이트

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

온라인으로 사용해보십시오!

나는 어리석은 생각이 없다.


3

젤리 , 126 바이트

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

온라인으로 사용해보십시오!


3

자바 스크립트 (ES6), 328 ... 312 바이트

카레 구문으로 입력을 (p)(q)받습니다. 플레이어는 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)]):''

데모

어떻게?

이것은 재귀 함수로서, 출력을 아래에서 위로 빌드합니다. 카드가 뽑히는 주요 부분은에 도달 할 때까지 i초기화 p*q*6되고 감소 0됩니다. 그런 다음에 i도달 할 때까지 헤더를 더 줄 -p입니다.

ASCII 아트는 배열에 저장된 작은 조각으로 나뉩니다 a[]. 아래 표는의 내용을 설명하므로 a[]나머지 코드를보다 쉽게 ​​이해할 수 있습니다.

 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

형식화 및 의견

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

파이썬 (2) , 382 (358) 346 338 332 바이트

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

온라인으로 사용해보십시오!


2

SOGL V0.12 , 106 바이트

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

여기 사용해보십시오!

카드 생성 :

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

셔플 링 :

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

취급:

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

루비, 262 바이트

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

따라 가기는 어렵지만 짧습니다!

루비, 279 바이트

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

각 행에 대한 형식을 작성한 다음 %연산자 를 사용하여 sprintf채우십시오.

3 번째 줄마다 카드 값이 표시되는 것이 편리합니다. 카드 값은 16 자리 숫자로 01BC대체되어 표시 TJQK됩니다.

다이아몬드와 스페이드의 상단은 동일하지만 슈트 코드 -4의 끝 부분 에 2를 다시 추가하여 j%4*4-4-4 0 4 또는 8 임을 고려하여 슈트 기호에서 4 바이트를 절약 [-4,4]했습니다. 끈.

아마도 몇 바이트를 더 절약 할 수있을 것입니다. 플레이어 식별을 위해 코드를 반복해야하는 것은 추악합니다.


2

PHP, 509 바이트

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

온라인으로 사용해보십시오!

이것은 코드 골프에서 처음 시도한 것이므로 아마 많이 향상 될 수 있습니다. 나는 어딘가에서 시작해야한다고 생각했다. :)


1

자바 (오픈 JDK 8) , 784 835 843 826 815 781 775 바이트

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

온라인으로 사용해보십시오!

다운 보트가 사양을 준수하는 이유


또한 생성하는 대신 대체 방법을 만들어야합니다 Function<String,String>. 후자는 비용이 매우 많이 듭니다. 창조시와 사용시.
Olivier Grégoire

나는 downvote가 원래의 버그 답변에 대한 것이라고 가정하고 있지만 현재는 올바른 것처럼 보이므로 그것을 중화하려고했습니다. 골프에 작은 것들 : 괄호는 n[c]=t<2?"A":t<10?""+t:""+"TJQK".charAt(t-10); for(j=0;j<p;j++){o+=...;l++;}될 수 있습니다 for(j=0;j<p;l++,j++)o+=...;; 할 수 있습니다 return o;대신 System.out.print(o);두 번째 사용하여 Function대신을 Consumer; ,y=p*q를 제거 할 수 있으며 p*q대신에 두 번 직접 사용할 수 있습니다 y. 의심 할 여지없이 골프에는 더 많은 것이 있지만, 지금 당장 그것을 볼 시간이 없습니다 ..
Kevin Cruijssen

1
@KevinCruijssen 사실은 아닙니다. 나는 공백을 제거하고 1 문자 변수 이름을 사용하는 것 이상으로 "골프에 노력을 기울이지 않음"에 대한 첫 번째 편집 후에 하향 투표했습니다 . 내 생각에 Roberto Graham은 Java에서의 골프 팁을 완전히 다시 읽어야한다고 생각합니다 . 요점은 실제로 도전 과제의 사양을 준수하지만 코드 골프 태그의 사양은 준수하지 않는다는 것입니다.
Olivier Grégoire

골프를 더 할 수 있다는 것을 어떻게 알 수 있습니까? 나는이 대답을 본 후 포기했을 때 약 400 바이트 였고 나머지는 50 바이트를 더 사용하여 마무리했습니다. 450 바이트 대 850 개에는 골프가 거의 없습니다.
Olivier Grégoire

s[l]<2?":/\\:":s[l]<3?":/\\:"할 수 s[l]<3?":/\\:"있고 s[i*p+j]<1?":\\/:":s[i*p+j]<2?":\\/:"할 수 있습니다 s[i*p+j]<2?":\\/:". @ OlivierGrégoire 그리고 나는 그것이 거의 절반으로 줄어들 수 있다는 것을 알고 있습니다. 그래서 나는 downvote를 이해합니다. 그러나 이것은 대부분 경험이 부족하며 실제로 모든 팁을 여러 번 읽지 않습니다. 내가 과거에 해본 답변 중 일부는 Java에 대한 쉬운 도전이 아닙니다. Btw, 400-450 바이트 답변이 있다면, 별개의 답변으로 게시하지 않는 이유는 무엇입니까? 당신은 나의 공감대를 가질 것입니다. ;)
Kevin Cruijssen

1

파이썬 3, 332 바이트

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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.