Os jogadores do tradicional jogo de tabuleiro Go medem suas habilidades em um sistema de classificações :
- Jogadores novos no jogo são classificados em 30º kyū (por escrito
30k
) e o progresso é regressivo até o 1º kyū (por escrito1k
). Estes são considerados as fileiras dos estudantes . - Um jogador pode promover do 1º kyū ao 1º dan rank (escrito
1d
) e, em seguida, progredir contando até o 7º dan rank (escrito7d
). Estas são as fileiras principais . - O passado de jogadores excepcionalmente habilidosos
7d
pode ser promovido para a 1ª posição profissional1p
e o progresso contando até a 9ª posição profissional (escrita9p
). Esta é a classificação mais alta.
Em resumo: as classificações são ordenadas 30k < 29k < ··· < 1k < 1d < 2d < ··· < 7d < 1p < 2p < ··· < 9p
.
Tarefa
Dadas duas cordas entre { 30k
, ..., 1k
, 1d
, ..., 7d
, 1p
, ..., 9p
} como entrada, saída da maior classificação dos dois. (Se eles são iguais, basta gerar uma das entradas.)
(Como de costume, a E / S é flexível - sua resposta pode ser uma função ou um programa completo, lendo entradas de qualquer maneira razoável e produzindo saídas de qualquer maneira razoável.)
Este é o código-golfe : o objetivo é minimizar a contagem de bytes do seu código.
Casos de teste
(Formato:. input1 input2 output
)
29k 9k 9k
21k 27k 21k
6d 1p 1p
5d 17k 5d
1k 1d 1d
1d 1d 1d
1d 2d 2d
9p 1d 9p
2d 30k 2d
1p 1k 1p
1d 1p 1p
1p 2d 1p
7p 8p 8p
30k 30k 30k
4 k
ou4K
mais ou menos, ou.)30k
,29k
,1k
,1d
et cetera, por isso não vou permitir que qualquer variação lá.Respostas:
JavaScript (ES7), 58 bytes
Pega as duas strings na sintaxe de currying
(a)(b)
.Experimente online!
Quão?
A função auxiliar g () converte a sequência de entrada s em uma pontuação.
1) Procuramos s [1] na string "_dp" . Isto dá:
2) Cubamos esse resultado, que deixa 1 e -1 inalterados, mas fornece 8 para uma classificação profissional e dan .
3) Nós multiplicamos pela parte decimal da classificação.
fonte
a=>b=>(g=s=>parseInt(s)*~{d:~1,p:~8}[s[1]])(a)>g(b)?a:b
Gelatina , 14 bytes
Um link monádico que aceita uma lista de cadeias * (conforme descrito) que produz a classificação mais alta encontrada.
* Também funciona com números diferentes de dois.
Experimente online! Ou veja uma suíte de testes .
Quão?
Classifica por uma função de tecla e retorna a mais à direita (ou seja, um máximo).
As letras , e têm os ordinais , e respectivamente. No binário , o conjunto de oito bits é definido, enquanto os outros não, portanto, OR bit a bit com 8, obtemos 107, 108 e 120 respectivamente - agora estão na ordem necessária para classificar as classes que identificam.d p 107 100 112 107k d p 107 100 112 107
As fileiras amadoras estão em ordem decrescente, para concluir nossa função de chave, poderíamos concatenar nosso identificador de classe com o número fornecido na string, negando se a string termina em (por exemplo, -> while -> ). No código, isso exige o armazenamento do identificador de classe e a exponenciação menos um para a multiplicação - que é de bytes.16k 16
'7k'
[107,-7]
7p
[120,7]
OṪ|©8-*×ṖV$®,µÞṪ
Para melhorar isso, podemos usar menos dois e multiplicar os elementos juntos, o que pode ser alcançado com uma única multiplicação.
Tabela de ação da função de tecla ...
fonte
2^8=256
, que é ASCII, afaik. Você não precisa de mais de um byte para armazenar caracteres unicode?Geléia ,
1110 bytesInspirado a voltar à prancheta de desenho de Arnauld!
Um link monádico que aceita uma lista de cadeias * (conforme descrito) que produz a classificação mais alta encontrada.
Experimente online! Ou veja uma suíte de testes .
Quão?
Classifica por uma função de tecla e retorna a mais à direita (ou seja, um máximo).
A função da tecla primeiro altera qualquer k para se tornar um N usando o átomo diádico
y
, converte, com a lista de dois caracteres⁾kN
(código Jelly para['k','N']
) e depois avalia a string como uma mônada com um argumento de nove (pelo uso do códigov9
).Em Jelly:
N
é um átomo monádico que nega sua entrada9 30N
não usa os nove e resulta no número inteiro-30
d
é um átomo diádico que produz o resultado de um divmod Python de dois valores - o par dos resultados da divisão inteira e do módulo9 7d
resulta em emparelhado com que é[0,7]
p
é um átomo diádico que executa um produto cartesiano, que inclui a faixa implícita de 1-indexação implícita de suas entradas9 p3
produz o produto cartesiano de[1,2,3]
e[1,2,3,4,5,6,7,8,9]
que é[[1,1],[1,2],...,[1,9],[2,1],[2,2],...,[2,9],[3,1],[3,2],...,[3,9]]
Depois que essas avaliações forem realizadas usando as seqüências de caracteres a serem comparadas, precisamos poder comparar os resultados; como ints não são comparáveis com listas, precisamos agrupar os valores negados em uma lista, mas como a ordem ainda funcionaria após o
p
achatamento das listas (por exemplo,[[1,1],[1,2],...]
->[1,1,1,2]
), podemos usar o átomo monádico de byte únicoF
aplicado a todas as avaliações.Uma tabela das entradas para seu valor-chave é a seguinte:
Comentário do código:
fonte
MATL ,
30282523 bytesExperimente online!
(-2 bytes graças a Luis Mendo)
(outros -3 bytes substituídos
v&X>
por>
, desta vez com base na resposta de Luis Mendo)(-2 bytes usando
&)
sintaxe)Explicação:
Subtraia 'k' do último caractere (fornece n = -7, 0, 5 para 'd', 'k', 'p' respectivamente).
Calcule v = n ^ 2 + 6n-1 (dá 7, -1, 54 respectivamente).
Multiplique esse valor v pelo número de classificação real (para que os níveis de k obtenham produtos negativos, os níveis de d vão de 7 a 49, os níveis de p de 54 e acima).
Faça isso para as duas cadeias de entrada, compare os produtos
Obter a sequência de entrada correspondente ao produto maior
Método alternativo e mais direto:
23 bytes
Experimente online!
fonte
Haskell ,
7371 bytesExperimente online!
Como de costume, para mim, apenas uma implementação direta, em vez de algo particularmente interessante. A função "(#)" assume duas fileiras como seqüências de caracteres e retorna a maior. Funciona apenas com exatamente o formato especificado na pergunta.
(Eu também tentei uma versão usando
comparing
emaximumBy
, mas que acabou sendo 3 bytes mais - caramba, vocêbase
! E seus nomes de função legíveis ocasionalmente humanos)(Sugestões aplicadas por Amphibological e Lynn)
fonte
True
para1<2
.(-x)
pode ser0-x
.r(x,_)=x+7
!0-x
pode ser `-x`)Python 2 , 54 bytes
Experimente online!
Usando o método de Arnauld . O mapeamento
int(x,27)%9-3
depende apenas da última letra dex
, pois todos os dígitos, exceto o último, contribuem com um múltiplo de9
. Leva:Essa margem é quase insuficiente para o multiplicador
1p
vencer7d
, a classificação mais alta e dan, quando interpretada na base 26.Achei isso forçando expressões brutais desta forma e de algumas outras.
Python 2 , 64 bytes
Experimente online!
fonte
R , 73 bytes
Experimente online!
as.double
vez de,strtoi
uma vez que o último não lida com espaços / pontos e não consegui pensar em outro caractere válido para substituird
rank
vez deorder
, pois são iguais quando existem apenas dois elementosfonte
L
no lugar de,.
mas também não está funcionando ... avisará se eu encontrar outra coisa.Gelatina , 13 bytes
Isso é bem diferente da minha outra resposta Jelly , por isso estou publicando isso separadamente.
Recebe entrada como uma lista de duas (ou mais) seqüências de caracteres.
Experimente online!
Comentado
fonte
Julia 0,7
10093 bytesNão é a maneira mais eficiente ( resposta Julia 0,6 da contraste @ sundar ), mas é agradável porque é puramente numérica. Também usa despacho (embora infelizmente apenas uma vez)
Código muito semelhante funciona em 0,6 Experimente online
Como:
O truque está na
!(z)
função.Ele mapeia o valor UTF-8:
k
em um número negativo, por isso é ordenado ao contráriod
em um número positivop
em um número positivo maiorComo mostrado:
Resultado dos testes
fonte
.~[a,b]
era possível! Aliás, acho que você pode substituir o collect (r) por[r...]
e salvar alguns bytes.Int[r...]
mais doInt([r...])
que economizar. Obrigadoargmax
porindmax
) no Julia 0.6 também. Você pode incluir um Experimente-o online! link, se desejar.Haskell , 64 bytes
Experimente online!
A expressão
gcd(fromEnum c)28-3
mapeia o caractere para um multiplicadorA idéia era pegar os valores de seus personagens
[107,100,112]
e optar28
por ter fatores cada vez maiores em comum com eles, facilitados, mas o primeiro deles sendo o principal. Esse método economiza 2 bytes ao escrever explicitamente um mapeamento .O built-in
reads
é usado para separar o número e a classificação.(Na verdade, a divisão direta de Sara J é um byte mais curto, fornecendo 63 bytes .)
A etapa "pegue o maior" leva um número irritante de bytes na minha solução. Tentei outras abordagens, como iterar sobre as fileiras em ordem decrescente e pegar a primeira que é um elemento
[a,b]
, mas elas ficaram mais tempo.fonte
MATL ,
2827 bytesExperimente online! Ou verifique todos os casos de teste .
Explicação
fonte
Gelatina , 16 bytes
Recebe a entrada como uma lista de duas strings.
Experimente online! (todos os casos de teste)
Quão?
Que dá:
Comentado
Fórmula alternativa
Também para 16 bytes, podemos usar:
Experimente online!
fonte
JavaScript (ES6),
5554 bytes-1 byte graças a @Shaggy
Experimente Online!
Explicação
fonte
f("2d")("1d")
, mas substitui-ad:1
pord:2
corrigida.Ruby ,
5246 bytesPorta direta da resposta do xnor.
Experimente online!
EDIT: -6 bytes, percebendo que eu poderia ter usado um Proc
fonte
C # (Compilador Visual C #) ,
136135 bytesExperimente online!
-1 Byte graças a TheLethalCoder
Expansão:
fonte
a=>b=>
.PadLeft
requerchar
e usar em107
vez de'k'
não faz diferença.Perl,
4638 bytesExecutar como
perl -pae '...'
. Obtém a entrada de stdin, separada por espaço em uma linha.Executa algumas substituições para tornar a comparação "mais fácil". As substituições regexp equivalem essencialmente à substituição
p
por um zero à direita ek
por um sinal negativo inicial. Assim10k
se torna-10
(então a ordem é invertida) e3p
se torna30
(de modo quep
está acima de tudo o resto). Então é apenas uma comparação numérica simples.Obrigado ao DomHastings pela sugestão
$`
/$'
, que reduziu 8 bytes.fonte
/ /
e usando `` $ `` `e$'
: Experimente online!R ,
65bytes 62Experimente online!
Isso é um pouco menor do que as respostas anteriores do R e faz bom uso da funcionalidade de estatísticas do R :-)
-3 bytes, graças à sugestão de Robin Ryder para usar em
ordered
vez defactor
Recebe informações do stdin (embora o link TIO se reestruture levemente para facilitar o teste). Lança as classificações de entrada em uma ordem
factor
de todas as classificações e, em seguida, obtém o máximo.A saída se parece com:
fonte
factor
e perdi completamenteordered
.Java 8,
128122121 bytes-6 bytes graças a @SaraJ .
Experimente online. (Veja a parte inferior da saída nos links TIO para ver os valores mapeados.)
Explicação:
fonte
Haskell ,
757068 bytesExperimente online!
-5 bytes
graças a @Laikoni-2 bytes
graças a @ ASCII-onlyfonte
(read$init k)
pode serread(init k)
. Uma função auxiliar é mais curta que a utilizadacase of
: Experimente online!Python 2 , 61 bytes
Usa o algoritmo de Arnauld.
Experimente online!
Resposta anterior, 73 bytes
Experimente online!
fonte
Julia 0.6 ,
757165 bytesExperimente online!
(-4 bytes, a análise em 0,6 detecta automaticamente como Int)
(-6 bytes, use com
(search("_dp",s[2])-1)^3)
base na resposta JS de Arnauld, em vez de((c=cmp(s[end],'k'))^2*6+4c-1)
)fonte
Retina 0.8.2 , 29 bytes
Experimente online! Aceita qualquer número de classificações e gera o mais alto. Explicação:
Classifique as linhas ...
... usando a chave especificada ...
... Em ordem inversa.
A chave é criada a partir da linha de entrada da seguinte forma: a) a letra (profissional) e a classificação b) a classificação em unário c) a letra kyū (quando aplicável). Como essa é uma classificação inversa, a classificação profissional de dan classifica-se
p
antes da classificação de dand
e a classificação de kyū, que começa1
porque a letra de kyū é deixada no final. Dentro das fileiras, as fileiras (profissionais) e dan são classificadas em ordem decrescente devido ao comprimento da sequência unária, no entanto, ak
busca pelas fileiras de kyū as classifica em ordem crescente.Selecione a primeira linha, que agora é a melhor classificação.
fonte
J, 39 bytes
Experimente online!
explicação
fonte
Python , 59 bytes
Uma função sem nome que aceita um iterável de seqüências de caracteres que retorna um máximo por classificação Go. Funciona como minha resposta Jelly (apenas usa toda a cadeia avaliada como um número inteiro na base 26 para salvar bytes).
Experimente online!
fonte
C (gcc) , 95 bytes
Experimente online!
fonte
Perl 6 , 35 bytes
Experimente online!
Uma abordagem bastante diferente para todo esse material de pesquisa e cubo. Essencialmente substituição string:
...k -> -...
,p -> 0
,d
excluído. Assim, os novatos obtêm uma pontuação negativa, os dans obtêm sua classificação e os profissionais obtêm uma classificação * 10. Usar o WhateverStar nos leva a um fechamento emax
assume uma função de comparador.fonte
05AB1E , 12 bytes
.V
(avalie como código 05AB1E) é inspirado na abordagem semelhante de @Arnauld em sua resposta Jelly .Insira como uma lista de duas (ou mais) das seqüências válidas.
Experimente online ou verifique todos os casos de teste .
Explicação:
k
"30k"
"1k"
-1
d
>= 0
"1d"
"7d"
1
p
°
"2k"
"2d"
"2k"
"2d"
°
"2"
p
°
100
"1p"
"9p"
Veja todos os valores mapeados aqui.
fonte
Scala ,
3076154 bytesMuito obrigado a Kevin Crujissen e ASCII, apenas por seu trabalho nessa resposta, que diminuiu em ~ 250b.
Alguma otimização de algoritmo para ordenar a função da resposta 61b.
Casos de teste aqui: Experimente online!
Resposta antiga de 61 bytes
O truque é calcular a distância entre
rank letter
ei
(código de char105
). Então usamos essa distância como uma pontuação ( dan = 5, kyu = 2, pro = 7) que multiplicamos pelo número da classificação. Então, tomamos o máximo em array de entrada usando a função de pontuação.Experimente online também!
fonte
var f: Function1[String, Function1[String, String]]=
. 247 bytes .PHP ,
10098 bytes(-2 bytes alterando a declaração da função)
Para executá-lo:
Exemplo:
Ou Experimente online!
PHP (7.4), 74 bytes
Experimente online!
Quão?
Semelhante à abordagem de Arnauld , mas em PHP. Estou usando uma função para converter cada classificação em um valor numérico e comparar e gerar uma com valor mais alto.
O valor do ranking vem da posição do segundo caractere da string de entrada em
!!dp
, reduzida por um e depois alimentada para 3 e multiplicada pela parte inteira da string de entrada.Assim, por exemplo, a posição do segundo carácter da
1p
qual ép
em!!dp
é 3, reduzido em um e alimentado a 3 será 8. Assim, parte número inteiro de todos os*p
postos será multiplicado por 8. Estes meios1p = 8
,2p = 16
, ...,9p = 72
.Para todas as
*d
classificações, a parte inteira será multiplicada por 1 (ou simplesmente sem multiplicação). Isso significa1d = 1
, ...,7d = 7
.E para todos
*k
e**k
classificações, a posição do segundo caractere!!dp
seráfalse
igual a 0 (sem explícito), reduzida por um e alimentada por 3, significa que a parte inteira será multiplicada por -1. Isso significa30k = -30
, ...,1k = -1
.Esta é a minha primeira tentativa de golfe, não tenho certeza do quão ruim é!
fonte
Excel VBA, 129 bytes
Uma função de janela imediata VBE anônima que recebe entrada no intervalo
A1:A2
e sai para o console.Explicação
fonte