Introdução
Há muito tempo, quando eu codificava jogos de cartas com cartas de baralho comuns, costumava especificar um número para cada carta e chamar uma função com algum número para obter uma carta. Isso me inspirou um pouco a fazer esse desafio.
Portanto, para as pessoas que desconhecem as cartas de baralho, um baralho de cartas consiste em 52 cartas (13 em cada um dos quatro naipes, ou seja, Copas, Diamantes, Espadas, Paus). Em cada naipe, há 13 cartas - primeiro as cartas numeradas de 2 a 10, depois o Valete (J), a Rainha (Q), o Rei (K) e o Ás (A). Esta é a ordem
Desafio
O desafio é pegar um número inteiro entre 1 e 52 como entrada e exibir o cartão nessa posição. Mas, sua saída deve estar em palavras. Além disso, a ordem deve ser mantida, ou seja, as 13 primeiras cartas serão de Copas, depois Diamantes, depois Espadas e, finalmente, Clubes.
Por exemplo, se alguém escolher o número 30
. A carta pertenceria ao terceiro naipe, ou seja, as Espadas. Além disso, seria a quarta carta do naipe, o que significa o número 5. Portanto, sua saída em palavras deve ser: five of spades
e deve sempre seguir este formato , isto é, primeiro a carta, seguida por um of
e o nome do naipe em final, com espaços necessários no meio.
Entrada e saída
A entrada será um número inteiro entre 1 e 52 (ambos inclusive). Observe que a contagem começa aqui a partir de 1. Você pode optar por começar a partir de 0 . No entanto, você deve manter a ordem dos cartões mencionados acima. Sua saída deve ser o cartão nessa posição, escrito em palavras. Você não precisa manipular entradas inválidas. Além disso, sua saída pode estar em letras minúsculas ou maiúsculas.
Dada a seguir, é apresentada a lista de todas as entradas possíveis e suas saídas:
1 -> two of hearts
2 -> three of hearts
3 -> four of hearts
4 -> five of hearts
5 -> six of hearts
6 -> seven of hearts
7 -> eight of hearts
8 -> nine of hearts
9 -> ten of hearts
10 -> jack of hearts
11 -> queen of hearts
12 -> king of hearts
13 -> ace of hearts
14 -> two of diamonds
15 -> three of diamonds
16 -> four of diamonds
17 -> five of diamonds
18 -> six of diamonds
19 -> seven of diamonds
20 -> eight of diamonds
21 -> nine of diamonds
22 -> ten of diamonds
23 -> jack of diamonds
24 -> queen of diamonds
25 -> king of diamonds
26 -> ace of diamonds
27 -> two of spades
28 -> three of spades
29 -> four of spades
30 -> five of spades
31 -> six of spades
32 -> seven of spades
33 -> eight of spades
34 -> nine of spades
35 -> ten of spades
36 -> jack of spades
37 -> queen of spades
38 -> king of spades
39 -> ace of spades
40 -> two of clubs
41 -> three of clubs
42 -> four of clubs
43 -> five of clubs
44 -> six of clubs
45 -> seven of clubs
46 -> eight of clubs
47 -> nine of clubs
48 -> ten of clubs
49 -> jack of clubs
50 -> queen of clubs
51 -> king of clubs
52 -> ace of clubs
Pontuação
Isso é código-golfe , então o código mais curto vence.
fonte
two\s\s\sof\shearts
onde\s
representa um espaço? (Note os dois espaço extra.)Respostas:
Python 3 ,
11590 bytesUma função sem nome retornando a string em maiúsculas.
Experimente online!
Quão?
Caracteres Unicode têm nomes. Os nomes de alguns deles são como "PLAYING CARD DOIS OF SPADES"; portanto, podemos obter os caracteres do caractere Unicode que representam o cartão necessário e retirar os 13 primeiros caracteres para obter nossa saída.
Os caracteres Unicode de interesse estão dentro de um bloco da seguinte maneira:
Onde
x
não são os caracteres que buscamos (os quatro naC
coluna são "cavaleiros"; trêsF
são "palhaços"; um0
é genérico; o restante são caracteres reservados).Como tal, podemos adicionar algum valor a 0x1F0A1 = 127137 (As) para encontrar a placa que queremos.
O valor a acrescentar é complicado apenas por três coisas:
O uso da opção de indexação única permite que o uso da divisão inteira negativa seja indexada em uma matriz de deslocamentos em linha para o processo de reordenação com
[6,0,4,2][-n//13]*8+
(efetivamente[48,0,32,16][-n//13]
), também podemos colocar os ases nos locais corretosn%13+
e evitar o cavaleiros em colunaC
comn%13//11+
(efetivamente(n%13>10)+
).fonte
Perl6 / Rakudo 70 bytes
Índice 0
Usando
perl6 -pe
e sem compactação de dicionário:Ele apenas procura o cartão em Unicode (a partir do Ace), pede o nome e o usa. Esta é uma rota semelhante (embora eu não soubesse na época!) À resposta em Python de Jonathan Aitken - apenas eu indexo de todos os 4 ases em vez de 4 desvios do Ás de Espadas e multiplico por 1,091 para fazer o índice arredondar para fora da entrada Knight em Unicode.
Veja toda a saída (para os valores de entrada de 0 a 51) https://glot.io/snippets/ez5v2gkx83
Editado para lidar com os Knights no deck Unicode, porque Unicode.
Perl6 ♥ Unicode
fonte
05AB1E , 54 bytes
Indexado a 0
Experimente online!
Explicação
fonte
“»€Å‹ spadesž…“#"of "ì“‚•„í†ìˆÈŒšï¿Ÿ¯¥Š—¿—ÉŸÄ‹ŒÁà“#âí»
- 54 bytes também!Python 2 ,
167148 bytesIndexado a zero.
Experimente Online!
Edição: Bubbler fez um grande ponto usando o método de divisão (e fornecendo uma resposta mais curta). No segundo bloco, usar split () gera a mesma contagem de bytes.
fonte
[n%13::13]
ou algo assim, mas sem sorte.s
; xnor apontou no chat.R , 154 bytes
Experimente online!
Recebe entrada (indexada 1) do STDIN e com
source(...,echo=T)
imprime o resultado no console.Não é bonito, mas ele vem em 2 bytes mais curto que a melhor solução que eu poderia usar
outer
(apresentada abaixo), então deixe isso ser um lembrete para examinar outra abordagem!R , 156 bytes
Experimente online!
Essencialmente o mesmo que acima; no entanto,
outer
fará a reciclagem corretamente, mas ter que definirsep=" of "
para quepaste
isso seja feito apenas um pouco mais.fonte
Emojicode , 202 bytes
0 indexado. Experimente online!
Explicação :
fonte
Excel, 156 bytes
Cartões de 0 a 51. Infelizmente, o Excel não possui uma função para converter
1
para"one"
...Usar
TRIM
eMID
é mais curto que usarCHOOSE
para os valores de face, mas maior que usarCHOOSE
para o naipe.fonte
MID()
e combinando as palavras!Java 8, 141 bytes
A entrada é indexada em 0.
Explicação:
Experimente online.
fonte
Kotlin ,
154152140 bytesExperimente online!
Atualizado para usar apenas a expressão lambda.
fonte
JavaScript ES6,
124118 bytes, 0-indexVersão Base64
fonte
Stax ,
585756 bytesExecute e depure
Aqui está a representação não-comentada do mesmo programa. Ele usa literais compactados da stax fortemente. A entrada é indexada em 0. É o algoritmo 05AB1E de Emigna.
Execute este
fonte
Bash, 133 bytes
Escolhendo usar 0 com base na opção dada, suportando 0 (dois de copas) a 51 (ás de paus)
fonte
Casca , 52 bytes
Experimente online!
Sempre fico feliz em mostrar o sistema de compressão de cordas da Husk: D
Explicação
A maioria do programa (a partir
¨
de então) é obviamente uma string compactada. Quando não compactado, ele se transforma em:O programa é então:
Há algumas coisas a serem explicadas:
Construímos as cartas com naipes antes dos valores devido à forma como o produto cartesiano
Π
funciona: se o fizéssemos o contrário, a lista de cartas seria ordenada por valor (ou seja, duas de copas, duas de ouros, duas de espadas, duas de clubes, três de copas ...). Como conseqüência, temos que reverter nosso resultado.O resultado do programa é uma matriz bidimensional de seqüências de caracteres. Isso é impresso automaticamente pelo Husk como uma única sequência criada ao unir linhas da matriz com novas linhas e células com espaços. A razão pela qual construímos essa matriz em vez de usar a mais direta
w
(juntar uma lista de palavras com espaços) é que, se o usow
do inferenciador de tipos adivinha outra interpretação para o programa, produzindo um resultado diferente.fonte
mIRCScript , 157 bytes
Carga como um alias, então use:
/c N
. O mIRC é indexado em 1, portanto, a divisão do piso (//) no valor negativo da entrada produz -1 a -4 conforme necessário.fonte
C (gcc) , 148 bytes
Experimente online!
Baseado em 0.
fonte
\0
literal por bytes nulos.Haskell , 132 bytes
Experimente online!
Uma função anônima, usando a compreensão da lista para criar todas as combinações de naipe e valor e indexando na lista resultante com a entrada.
fonte
F #,
174168 bytesRemovido um espaço em branco extra, como observado por Manish Kundu. Obrigado!
Experimente online!
Serei honesto - sou novo no código golf, por isso não sei se é mais apropriado responder com uma função pura como esta (com parâmetros, mas sem E / S) ou com um bloco de código funcional com o usuário E / S.
fonte
Oitava ,
155153151150 bytesExperimente online!
Isso cria uma string iniciada por
' of '
e's'
, em seguida, todos os naipes seguidos por todas as classificações. Essa cadeia é dividida em vírgulas em cadeias separadas. As ações estão na frente das fileiras, porque, como isso economiza um byte ao criar os índices. Depois disso, o indexamos usando colchetes com os seguintes índices:qual é o ranking, seguido pelo primeiro elemento
' of '
, seguido pelo naipe, seguido por's'
.Tendo
's'
como parte dos fatos (hearts,diamonds,spades,clubs
) em vez de uma sequência separada é exatamente do mesmo comprimento, mas menos divertido.A divisão no separador padrão
salvaria 4 bytes na
strsplit
chamada-, mas os espaços ao redor' of '
seriam removidos e precisariam ser adicionados manualmente, custando mais bytes.fonte
V ,
154147144142 Bytes-7 bytes graças a DJMcMayhem
Experimente online!
Hexdump:
fonte
« == \+
2)12dj == 13D
ò
? Tenteiò13j0Pò
, em vez de4ñ13j0Pñ
, mas que não cessaramP
adiciona novas linhas? Além disso, você tem certeza de que precisa0
dessa parte? Parece-me que provavelmente funcionaria sem0
é desnecessárioC # ,
219207202197 bytes (0 indexada)graças à contribuição de @Ciaran_McCarthy e @raznagul
Pega uma entrada de int I, subtrai 1 para corresponder à indexação 0 da matriz de strings e gera o número com base em I mod 13 e o naipe com base em i / 14 + 13.
funciona muito bem para o meu segundo código de golfe, apenas querendo saber se eu poderia obtê-lo mais curto usando LINQ ou outra coisa.
fonte
i++
possa ser removida completamente. Ao converter a função em um lambda, reduzi- o para 178 bytes .using
Declaração. Enfim +1 de mim."of"
na matriz.PowerShell ,
207192182174165163161157 bytes0-Indexado
Experimente online!
4 bytes salvos graças ao AdmBorkBork nos comentários
fonte
-split
no espaço em branco para salvar 6 bytes-split'two three four five six seven eight nine ten jack queen king ace'
e outro byte usando linha substituir em vez de piso$_/13-replace'\..*'
CJam , 114 bytes
Experimente online!
Indexado a zero. Provavelmente será derrotado por idiomas com compressão de dicionário, mas tudo bem ...
fonte
Geléia , 61 bytes
Indexação 0. Experimente online!
fonte
“...“...»Ḳ€¤Œpị@j“ of
é provavelmente mais curto.Julia 0.6 , 156 bytes
Experimente online!
-2 bytes graças a @Stewie Griffin
fonte
Haskell , 144 bytes
Experimente online!
Isso atinge todos os tipos de pontos problemáticos de Haskell.
fonte
SOGL V0.12 , 53 bytes
Experimente aqui!
fonte
Javascript
149143140 bytes-3 bits graças a @rick hitchcock
fonte
[_/13|0]
. Por exemplo:["hearts","diamonds","spades","clubs"][_/13|0]
a=
pois sua função não é recursiva.Perl 5
-p
, 119 bytesBaseado em 0
Experimente online!
fonte
Japt ,
9186 bytesIndexado a 0.
Eu usei uma ferramenta escrita por @Shaggy para gerar as listas compactadas.
Experimente online!
Explicação:
A primeira sequência compactada contém os valores do cartão delimitados por
d
. A segunda sequência compactada contém as classificações do cartão delimitadas pork
.Esses caracteres foram escolhidos usando a ferramenta Shaggy, que gera uma string delimitada por um caractere que é compactado de maneira ideal usando shoco (a compressão que Japt usa). Isso nos permite criar uma lista de valores e classificações de cartas.
Usamos backticks
`
para descomprimir essas strings, depois dividimos a string usandoq
, seguido pelo char para dividir.Depois de termos as listas, mapeamos os valores dos cartões e obtemos o índice da entrada. É importante observar que o Japt agrupa seus índices, para que não tenhamos o módulo em 13.
Em cada item, percorremos as classificações do cartão. Obtemos o índice dividindo a entrada por 13.
Depois de termos os dois itens, concatenamos-os com
" of "
, o que produz a sequência final.fonte
Geléia ,
5855 bytesExperimente online!
fonte