Count My Change


21

Sua tarefa é classificar uma matriz que contenha as cadeias "quarto", "moeda de dez centavos", "níquel" e "centavo" várias vezes em nenhuma ordem específica e classificá-las para que elas estejam nessa ordem: quarter dime nickel penny(em outras palavras, maior ou menor valor monetário).


Regras

  1. Seu programa deve usar uma matriz como entrada, contendo os nomes das moedas dos EUA e classificá-las do maior para o menor em valor monetário.
    • Para quem não é dos EUA ou não usa troco, os valores das moedas dos EUA, do maior para o menor, são:
      • Trimestre: 25 centavos
      • Moeda de dez centavos: 10 centavos
      • Níquel: 5 centavos
      • Centavo: 1 centavo
  2. Você pode classificar essa matriz da maneira que desejar, desde que a saída seja ordenada pelos valores monetários mostrados acima.
  3. A entrada pode ser recebida de qualquer forma, seja argumentos de linha de comando ou STDIN.
  4. Uma matriz de entrada seria composta por minúsculas, algo como isto:
    • quarter dime nickel nickel quarter dime penny penny
  5. O formato real de entrada e saída é com você.

Casos de teste

"penny nickel dime quarter" 
-> "quarter dime nickel penny"

"nickel penny penny quarter quarter quarter dime dime dime dime"
-> "quarter quarter quarter dime dime dime dime nickel penny penny"

"quarter dime nickel nickel quarter dime penny penny"
-> "quarter quarter dime dime nickel nickel penny penny"

Este é o , portanto, aplicam-se regras e brechas padrão.



11
Todos os casos de teste devem incluir saída. No celular, o segundo e o terceiro casos são mostrados em duas linhas, então parece que a segunda linha é a saída.
— Luis Mendo

4
Eu sou canadense, posso assumir que a entrada não tem centavos? ;)
— undergroundmonorail

11
@undergroundmonorail Infelizmente, não.
— Ckjbgames

11
O que aconteceu com malucos e meio dólar?
— Adám 6/02/17

Respostas:


26

Japonês , 5 3 bytes

ñg9

Teste online!

Explicação

Também adicionei uma função de classificação ao meu idioma nas últimas semanas :-) ñpega uma matriz e uma função e classifica a matriz como se cada item tivesse sido mapeado por essa função.

A gfunção em uma string recebe um número ne retorna o nth char na string, quebrando se nfor negativo ou após o final da string. As seqüências de caracteres podem ser alinhadas da seguinte maneira:

quarterquarter...
dimedimedimedi...
nickelnickelni...
pennypennypenn...

O nono caractere (indexado 0) de cada sequência foi destacado em negrito. Eles estão na ordem correta, então tudo o que precisamos fazer é ñg9. (Embora agora que eu olhe para trás, ñg5funcione também ...)


Também deve funcionar com 5, eu acho.
— FlipTack 03/02

@ FlipTack Sim, acabei de perceber isso sozinho. Não que isso faça diferença ;-)
— ETHproductions

Este. Não podes. Estar. Derrotado.
— ckjbgames

11
@ckjbgames Dennis não postou nenhuma resposta ;-)
— ETHproductions

11
@ETHproductions Ele provavelmente vai. Apenas mostre a ele essa pergunta.
— Ckjbgames

8

V , 7 bytes

ú/¨qu©¿

Experimente online!

Isto usa o spiffy novo tipo de comando I adicionados ao V cerca de uma semana atrás ( ú). Momento doce!

A maneira como isso funciona é classificando todas as linhas por classificação padrão (valores ASCII), mas ignorando a primeira correspondência de um determinado regex. Nesse caso, o regex é (qu)?, embora tenha algumas coisas brutas não-ASCII para evitar o uso de barras invertidas. Se você ignorar as duas primeiras letras de "quarto", começa com 'a' e todas as moedas já estão em ordem alfabética.

Versão não concorrente, 4 bytes

ú!/.

Esse recurso já foi implementado, mas eu ainda não o havia testado extensivamente, portanto havia um bug que só percebi por causa desse desafio. Não há link TIO porque o TIO está um pouco atrasado.

Isso funciona classificando inversamente todas as linhas, mas ignorando o primeiro caractere em cada linha.


8

Python, 36 bytes

lambda a:a.sort(key=lambda x:x[-5:])

Função sem nome que classifica a lista no local pela função de chave fornecida.

As fatias de cada nome de moeda são então, arter, dime, ickel, e penny- que estão em ordem alfabética (ou, mais importante, ordinal).


Oh oops - se eu não conseguir o ela maneira errada ao redor eu perca o c: p
— Jonathan Allan


6

Python 3 , 42 41 38 bytes

Uma função lambda sem nome que recebe a entrada como uma lista de seqüências de caracteres, classifica no lugar.

(Superado por Jonathan Allan)

lambda x:x.sort(key=lambda s:(s*2)[5])

Experimente online!

Outras soluções com as quais eu brinquei:

lambda x:x.sort(key=lambda s:s*(s<'q'))
lambda x:x.sort(key=lambda s:(s+'pi')[5])
lambda x:x.sort(key=lambda s:ord(s[3])%16)

5

PowerShell , 21 bytes

$args|sort{($_*3)[9]}

Experimente online!

Explicação

Roubou descaradamente o algoritmo na resposta da ETHproductions (basicamente). Multiplico cada string por 3 e, em seguida, classifico com base no nono caractere da string resultante.


O que há $_no PowerShell?
— Ckjbgames

@ckjbgames Em um pipeline, dentro de um bloco de script, ele se refere ao item atual. Então, algo como 1,2,3,4 | ForEach-Object { $_*2 }produzirá cada número vezes 2; o bloco de scripts é executado uma vez por item de entrada.
— Briantist

Isso faz sentido.
— Ckjbgames 3/02

5

Gelatina , 4 bytes

6ịµÞ

Experimente online! (o rodapé,ÇYjunta-se à lista resultante com alimentações de linha para uma impressão mais bonita.)

Quão?

6ịµÞ - Main link: list of strings
  µ  - monadic chain separation
   Þ - sort the list of strings by the monadic function:
6ị   - the sixth index - Jelly indexing is modular and 1-based

O enésimo índice de uma lista no Jelly é o enésimo item, começando à esquerda, contando de 1 e retornando ao início quando necessário. (O 0º está à direita, o -1º à esquerda e assim por diante).

Portanto, o sexto caractere de ['d','i','m','e']é 'i'que seis é congruente a dois módulos quatro.

O sexto caractere das quatro moedas em ordem é quart er, d ime, nicke l, penny. Estes estão em ordem alfabética (ou mais importante, ordinal).


Outra maneira de conseguir a mesma coisa seria a de ordenar por as cordas giradas com ṙ5µÞ, onde ṙgira para a direita, fazendo com que as cordas erquart, imed, lnicke, e penny.


5

Python , 32 bytes

lambda s:s.sort(key="npr".strip)

Experimente online! Classifica a lista no lugar.

A idéia é usar uma função de chave de classificação sem a lambda. Um bom candidato foi x.strip, que pega a string xe remove as bordas esquerda e direita de todos os caracteres da entrada. Por exemplo,"abcdef".strip("faces") == "bcd" ,.

O método "npr".stripleva:

quarter ->  np
dime    ->  npr
nickel  ->  pr
penny   ->  r

que são classificadas lexicograficamente. Encontrei a corda nprpor força bruta. npue npttambém trabalho, e não há mais curto.


5

Bash (+ coreutils) 11 bytes

Golfe

sort -rk1.2

Como funciona

Classificação reversa, com a "chave de classificação" do segundo caractere do primeiro campo (palavra) até o final da linha, ou seja:

uarter
ime
ickel
enny

Teste

>echo penny nickel dime quarter|tr ' ' '\n'|sort -rk1.2

quarter
dime
nickel
penny

Experimente Online!


4

CJam , 8 bytes

q~{5=}$p

Experimente online!

Explicação

q~        Get and eval all input (array of coin names)
  {5=}$   Sort the array by the 5th index of each element (array indices loop in CJam)
       p  Print the result



3

V , 8 7 bytes

1 byte salvo graças a @DJMcMayhem

Úçq/:m0

[Experimente online!]

Veja a resposta de @ DJMcMayhem em V ( 1 0 bytes menor que o meu)

Experimente online!

Ú                    " sort all lines "
 ç                   " globally "
  q/                 "  where there a q is matched, "
    :m0              "  move it to the top of the buffer "

Aqui está uma solução mais antiga com 1 byte maior, mas eu realmente gosto disso.

V , 8 bytes

Ú/q
dGHP

[Experimente online!]

Experimente online!

Explicação

Ú        " sorts the lines

Agora o buffer estará neste formato:

dimes
nickels
pennies
quarters

A única coisa que resta a fazer agora é mover os quartos para o topo.

/q      " search for a q "
dG      " delete everything from the first quarter to the end of buffer "
HP      " and paste it at the top of the buffer

Você pode fazer :m0em seu solução alternativa para salvar um byte (e me amarrar)Úçq/:m0
— DJMcMayhem

@DJMcMayhem Thanks, TIL about:move
— Kritixi Lithos


1

T-SQL, 41 36 34 bytes

select*from @ order by right(a,5)

Explicação

Suponha que a entrada seja pré-carregada em uma variável de tabela denominada @, com uma única coluna denominadaa , em que cada valor é uma moeda a ser classificada.

A select * from @peça é a placa da caldeira 'obtém todos os valores para retornar'. A verdadeira magia acontece na order bycláusula.

Usando a mesma estratégia como Johnathan Allan , eu ordenar por os últimos cinco caracteres (SQL retornará a seqüência inteira se é demasiado curta): arter, dime, ickel, penny.


qé a próxima letra a seguir p, portanto, para que um mod simples resulte em qmenos do que po valor precisa ser um fator de q, o que é primo. Você poderia subtrair 1 primeiro e depois um módulo de 7 iria funcionar, mas que, presumivelmente, ter pelo menos tantos bytes como 113.
— Neil

@ Neil Sim, eu percebi que ser primo estava destruindo minhas tentativas de reduzir a contagem. Fazer -1 e, em seguida, o mod 7 é mais bytes (incluindo parênteses necessários.)
— Brian J

1

JavaScript (ES6), 35 33 bytes

a=>a.sort(([,...a],[,...b])=>b>a)

Casos de teste


1

Anterior, 158 bytes

~:0`v0v4<~_
9:%8_^>8*`^1p9\+1g
$:!#@_1-0" ynnep">:#,_>
1-0" lekcin">:#,_>$:!#^_
" emid">:#,_>$:!#^_1-0
>:#,_$1>-:!#^_0" retrauq"
*84g9< ^*84g91-*84g94-*84g96-

Experimente online!

O processamento e a classificação de strings não são o tipo de coisa que você normalmente gostaria de tentar no Befunge, mas esta solução está aproveitando a observação de John Kasunich de que não precisamos realmente classificar nada. Contamos apenas o número de ocorrências de cada moeda (que pode ser facilmente determinada a partir do primeiro caractere) e, em seguida, produzimos muitos dos nomes de cada moeda na ordem apropriada.

Ainda não é nada competitivo com outros idiomas em termos de tamanho, mas essa abordagem é pelo menos melhor do que teria sido se tentássemos lidar com o desafio como um exercício de classificação de cadeias.



1

APL (Dyalog APL) , 11 bytes

Retorna e retorna a lista de strings.

{⍵[⍋↑5⌽¨⍵]}

Experimente online!

{ função anônima:

 ⍵[... ] o argumento indexado por

 ⍋ os índices ascendentes de

 ↑ a matriz cujas linhas são acolchoadas

 5⌽ girado em cinco etapas

 ¨⍵ itens do argumento

}



1

Casca , 3 bytes

Öṙ9

Experimente online!

Portado da minha resposta Brachylog, que rasga a resposta Japt da ETHproductions, mas não é uma tradução exata, pois usa rotação em vez de simples acesso ao enésimo elemento. Lá, eu fiz isso porque ∋não permite que você indexe além do final da entrada (o que provavelmente é bastante útil em muitas circunstâncias devido à natureza declarativa da linguagem). Em Husk, ! faz deixar você índice após o fim da entrada, com o mesmo em torno de embrulho modular que Japt ñg9usos, mas é a partir de 1 de modo que este programa, em particular, iria acabar por ser um byte mais: Ö!10.

Ö      Sort by
 ṙ     rotation by
  9    9.

0

Lote, 82 bytes

@for %%c in (quarter dime nickel penny)do @for %%a in (%*)do @if %%a==%%c echo %%c

Leva a entrada como argumentos da linha de comando e gera STDOUT. Funciona concatenando as listas resultantes da filtragem da lista original em cada moeda.


0

Ruby, 34 bytes

->m{m.sort_by{|c|c[1..2]}.reverse}

entrada e saída como uma matriz de strings


0

Ruby, 31 bytes

->s{s.sort_by{|i|i[1]}.reverse}

Isso nem sempre classifica "níquel" e "centavo" corretamente.
— Daniero

0

Ruby, 30 bytes

->m{m.sort_by{|s|s[3].ord^16}}

Números mágicos encontrados por tentativa e erro. Um pouco desajeitado, mas mais curto do que usar .reverse.


0

Perl 6 ,  40 36  34 bytes

*.sort: {(<q d n p>Zxx 1..*).Bag{~m/./}}

Tente

*.sort: {%(<q d n p>Z=>1..*){~m/./}}

Tente

*.sort: {%(<q d n p>Z=>^4){~m/./}}

Tente

Expandido:

*\            # WhateverCode lambda ( this is the parameter )

.sort:        # sort using the following code block

{             # bare block lambda with implicit parameter 「$_」

  %(          # treat this list as a hash

    <q d n p> # list of first characters
    Z[=>]     # zipped using pair constructor
    ^4        # Range from 0 up-to 4 ( excludes 4 )

  ){          # get the value associated with this key

    ~m/./     # regex which gets the first character ( implicitly from 「$_」 )

  }

}

0

Mathematica, 50 bytes

Flatten@{Last@#,Most@#}&@Split@Sort@StringSplit@#&

0

RProgN, 18 bytes

~{3mtt¢\3mtt¢>}$

Explained

~               # Zero Space Segment
 {            } # Anonymous Function
  3m            # Repeat the inputted string 3 times
    tt¢         # And take the tenth character of that
       \3mtt¢   # Do the same for the entry underneith
             >  # Compare the ascii value of the two
               $# Sort the input by the anonymous function.

Try it online!


0

java 8, 128 112 bytes

This is a lambda expression for a java.util.function.Function<String[],String[]>

s->{String r="";for(String k:"q d c p".split(" "))for(String t:s)if(t.contains(k))r+=" "+t;return r.split(" ");}

Explantion: For each of the 4 coins in order, go through the input and append the coin's name to the result every time there is a match for that coin's unique character. Split the result into an array and return it.


0

Ruby, 27 bytes

->s{s.sort_by{|x|(x*2)[5]}}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.