Coroa coroa de cem coroas

26

Percebi que um determinado jogo tinha um contador de vida peculiar que, em vez de parar 999, ganhou um novo dígito - o número seguinte era de cem coroas ou 👑00. Depois 👑99veio a coroa cem coroas ( 👑👑0) e o último número, depois 👑👑9, foi a coroa cem coroas ou 👑👑👑, que seria 1110 em decimal.

Sua tarefa é escrever um programa ou uma função que produz esse contador.

Dado um número inteiro do intervalo [0,1110](inclusive nas duas extremidades), produza uma cadeia de três caracteres em que

  • cada personagem é da lista 0123456789👑
  • a coroa (👑) pode aparecer apenas como o caracter mais à esquerda ou quando houver uma coroa à esquerda
  • quando esse número é lido como um número decimal, mas com a coroa contando como 10, você recebe de volta o número original

Casos de teste

   0 → "000"
  15 → "015"
 179 → "179"
 999 → "999"
1000 → "👑00"
1097 → "👑97"
1100 → "👑👑0"
1108 → "👑👑8"
1110 → "👑👑👑"

Você pode usar qualquer caractere não decimal em vez da coroa. Para incentivar uma impressão bonita, o caractere de coroa (sequência de bytes UTF8 "\ 240 \ 159 \ 145 \ 145") conta como um byte em vez de quatro. Seu programa não precisa trabalhar com números fora do intervalo válido.

Isso é , então a resposta mais curta, medida em bytes, vence!

Angs
fonte
4
Oh, Terra Super Mario 3D!
Deusovi 8/09/18
2
@ Deusovi Na verdade, eu estava pensando no jogo seguinte, Super Mario 3D World, mas adivinhei!
Angs
3
Esse deve ser o número IMO do Boaty McBoatFace.
Sr. Lister
O bônus é multiplicado pelo número de coroas no código, certo?
Erik the Outgolfer
3
@JeffZeitlin, é um sistema decimal redundante, em que um número pode ter mais de uma representação (mesmo desconsiderando os zeros iniciais). A coroa é então reservada como um elemento surpresa, usada apenas quando absolutamente necessário.
Angs

Respostas:

2

05AB1E , 20 18 bytes

₄‹i₄+¦ëTð.;„1 „  :

Usa espaços para coroas.

Experimente online ou verifique todos os casos de teste .

Explicação:

₄‹i               # If the (implicit) input is smaller than 1000:
   ₄+             #  Add 1000 to the (implicit) input
     ¦            #  And remove the leading 1 (so the leading zeros are added)
                  #   i.e. 17 → 1017 → "017"
  ë               # Else:
   Tð.;           #  Replace the first "10" with a space " "
                  #   i.e. 1010 → " 10"
                  #   i.e. 1101 → "1 1"
                  #   i.e. 1110 → "11 "
       1   :    #  Replace every "1 " with "  " (until it no longer changes)
                  #   i.e. " 10" → " 10"
                  #   i.e. "1 1" → "  1"
                  #   i.e. "11 " → "   "
Kevin Cruijssen
fonte
12

JavaScript (Node.js) , 50 bytes

f=(n,p=1e3)=>n<p?(n+p+'').slice(1):'#'+f(n-p,p/10)

Experimente online!

O TIO foi baseado na resposta de Arnauld. Mostrar 👑 como #.

tsh
fonte
3
Boa abordagem recursiva!
Arnauld
9

JavaScript (ES6),  62 46  44 bytes

Guardado 2 bytes graças a @nwellnhof

Emite coroas como xcaracteres.

n=>(n+1e4+'').replace(/1+0/,'xxx').slice(-3)

Experimente online!

Quão?

Adicionamos à entrada, coagimos a uma string, procuramos o padrão e substituí-lo por . Finalmente, retornamos os três caracteres finais.10000/1+0/xxx

Exemplos:

0 "10000" "xxx000" "000"123 "10123" "xxx123" "123"1023 "11023" "xxx23" "x23"1103 "11103" "xxx3" "xx3"1110 "11110" "xxx" "xxx"

Arnauld
fonte
s.replace(/./g,`#`)é legal ... eu tinha Array(s.length+1).join`#`, e minha regex também era mais longa! Bom trabalho, +1
Mr. Xcoder 8/18
@ Mr.Xcoder Na verdade, foi uma péssima idéia. Mas levou mais de um ano para corrigi-lo. : D
Arnauld
8

Linguagem de programação de Shakespeare , 763 692 690 689 683 bytes

,.Ajax,.Ford,.Page,.Act I:.Scene I:.[Enter Ajax and Ford]Ford:Listen tothy!Ajax:You big big cat.Scene V:.Ajax:Remember the remainder of the quotient betweenI twice the sum ofa cat a big big cat.Ford:You be the quotient betweenyou twice the sum ofa cat a big big cat.Ajax:You be the sum ofyou a pig.Be you nicer zero?If solet usScene V.Ford:You big big cat.[Exit Ajax][Enter Page]Page:Recall.Ford:You be I.Scene X:.Page:Recall.Am I nicer zero?If notopen heart.If notlet usScene L.Ford:You big big big big big cat.Speak thy.Am I worse a cat?If soyou zero.Scene L:.[Exit Page][Enter Ajax]Ford:You be the sum ofyou a pig.Is you nicer a cat?[Exit Ajax][Enter Page]Ford:If solet usScene X.

Experimente online!

Usa em " "vez de coroas. Ao custo de mais 4 bytes, isso pode ser modificado para mostrar um caractere "visível".

Explicação:

,.Ajax,.Ford,.Page,.Act I:.Scene I:.[Enter Ajax and Ford]

    Boilerplate, introducing the characters.

Ford:Listen tothy!

    Input a value to Ajax.

Ajax:You big big cat.

    Set Ford's value to 4 (we will be pushing 4 digits from Ajax onto Ford's personal stack).

Scene V:.Ajax:Remember the remainder of the quotient betweenI twice the sum ofa cat a big big cat.Ford:You be the quotient betweenyou twice the sum ofa cat a big big cat.

    DIGIT-PUSHING LOOP: Push Ajax's last digit onto Ford's stack; divide Ajax by 10.

Ajax:You be the sum ofyou a pig.Be you nicer zero?If solet usScene V.

    Decrement Ford; loop until Ford is 0.

Ford:You big big cat.

    Set Ajax's value to 4 (we will pop 3 digits from Ford's stack in the next loop).

[Exit Ajax][Enter Page]Page:Recall.Ford:You be I.

    Pop the top value off Ford's stack, and store that into Page.
    Here, Page will contain 0 if there are no crowns to be drawn,
    and 1 if there are crowns to be drawn.

Scene X:.Page:Recall.Am I nicer zero?If notopen heart.If notlet usScene L.

    DIGIT-DRAWING LOOP: Pop the top value off of Ford's stack and set Ford equal to that value.
    If there are no crowns to be drawn, output Ford's literal value here, and skip the crown-drawing section.

Ford:You big big big big big cat.Speak thy.Am I worse a cat?If soyou zero.

    Draw crown.
    If we are drawing crowns, and Ford contains 0 here, then we are now done drawing crowns, and thus we store 0 into Page.
    (Put in one more "big" for the crown to look like an @ symbol.)

Scene L:.[Exit Page][Enter Ajax]Ford:You be the sum ofyou a pig.Is you nicer a cat?[Exit Ajax][Enter Page]Ford:If solet usScene X.

    Decrement Ajax; loop until Ajax is 1 (i.e. 3 times).
JosiahRyanW
fonte
683 bytes
Olá, adeus
@HelloGoodbye Obrigado, esqueci de me livrar de alguns espaços.
JosiahRyanW
5

Python 2 , 53 bytes

Tiramos o chapéu para Arnauld por -22 bytes . A recursão ainda vence, no entanto.

lambda k:re.sub("1+0","CCC",`k+10000`)[-3:]
import re

Experimente online!

Python 2 , 51 bytes

Em vez disso, implementa o método recursivo do tsh . Economizou 2 bytes graças a ovs .

f=lambda n,p=1000:n/p and'C'+f(n-p,p/10)or`n+p`[1:]

Experimente online!

Mr. Xcoder
fonte
54 bytes , atualizando a 1ª solução da mesma maneira que fiz com minha resposta JS. Parece que a recursão ainda vence em Python.
Arnauld
1
@ Arnauld Obrigado: D. Esta edição foi realmente um SGITW
Sr. Xcoder 17/11
Desde então, o nwellnhof apontou que a adição de 10000 leva ao padrão mais direto 1+0. Portanto, esta versão de 53 bytes .
Arnauld
@ Arnauld Obrigado;) Isso é bastante impressionante.
Sr. Xcoder 20/11
3

Retina 0.8.2 , 41 bytes

\b((.)|..)\b
$#2$*00$&
T`d`_#`(?=....)1+0

Experimente online! Usa #s em vez de 👑s. O link inclui casos de teste. Explicação:

\b((.)|..)\b
$#2$*00$&

Coloque números de 1 e 2 dígitos com três dígitos.

T`d`_#`(?=....)1+0

Altere 1s iniciais de números de 4 dígitos para se #apague o próximo 0.

Neil
fonte
3

Geléia , 19 bytes - 0 = 19

<ȷ¬ȧDi0ɓ⁶ẋ⁹Ḋ;+ȷDḊṫʋ

Um programa completo que imprime o resultado usando um caractere de espaço como coroa.
(Como um link monádico, é gerada uma lista mista de dígitos inteiros e caracteres de espaço)

Experimente online! Ou veja a suíte de testes .

... talvez uma implementação recursiva seja mais curta.

Quão?

<ȷ¬ȧDi0ɓ⁶ẋ⁹Ḋ;+ȷDḊṫʋ - Main Link: integer, N    e.g. 1010       or   10
 ȷ                  - literal 1000                  1000            1000
<                   - less than?                    0               1
  ¬                 - logical not                   1               0
    D               - to decimal list               [1,0,1,0]       [1,0]
   ȧ                - logical and                   [1,0,1,0]       0
      0             - literal zero                  0               0
     i              - first index - call this I     2               1  (0 treated as [0] by i)
       ɓ            - new dyadic chain with swapped arguments - i.e. f(N, I)
        ⁶           - literal space character       ' '             ' '
          ⁹         - chain's right argument        2               1
         ẋ          - repeat                        [' ',' ']       [' ']
           Ḋ        - dequeue                       [' ']           []
                  ʋ - last four links as a dyad - i.e. f(N, I)
             +ȷ     -   add 1000                    2010            1010
               D    -   to decimal list             [2,0,1,0]       [1,0,1,0]
                Ḋ   -   dequeue                     [0,1,0]         [0,1,0]
                 ṫ  -   tail from index (I)         [1,0]           [0,1,0]
            ;       - concatenate                   [' ',1,0]       [0,1,0]
                    - implicit print                " 10"           "010"
Jonathan Allan
fonte
2

Limpo , 87 bytes

Não produz coroas (usa c).

import StdEnv,Text
$n#i=3-n/1000-n/1100-n/1110
=("ccc"+lpad(""<+n rem(10^i))i'0')%(i,9)

Experimente online!

$ n                   // function $ of `n`
 # i =                // define `i` as (the number of digits that aren't crowns)
  3 -                 // three minus
  n / 1000 -          // 1 if first digit is crown
  n / 1100 -          // 1 if second digit is crown
  n / 1110            // 1 if third digit is crown
 = (                  // the string formed by
  "ccc" +             // prefixing three crowns to
  lpad (              // the padding of
   "" <+ n rem (10^i) // non-crown digits of `n`
  ) i '0'             // with zeroes
 ) % (i, 9)           // and removing the extra crowns

Limpo , 99 - 3 = 96 bytes

Este tem coroas.

import StdEnv,Text
$n#i=3-n/1000-n/1100-n/1110
=("👑👑👑"+lpad(""<+n rem(10^i))i'0')%(i*4,99)

Experimente online!

Furioso
fonte
A segunda resposta tem uma pontuação de apenas 90.
pppery 14/07
1

Japonês, 20 bytes

Um porto ingênuo (e um pouco bêbado!) Da solução de Arnauld. Usa "para coroa.

U+A³ s r"^21*0"_çQÃÅ

Tente

Shaggy
fonte
1

Java 10, 84 83 bytes

n->{for(int p=100,t;p>0;n-=t%12*p,p/=10)System.out.printf("%c",t=n/p>9?46:48+n/p);}

Porto de @tsh 'comentário C .
Usa em .vez de coroas.

Experimente online.

Abordagem alternativa (84 (87-3) bytes):

n->f(n,1000)String f(int n,int p){return n<p?(n+p+"").substring(1):"👑"+f(n-p,p/10);}

Porto da resposta do @tsh 'JavaScript .

Experimente online.

Kevin Cruijssen
fonte
1

APL (Dyalog Unicode) , 32 bytes

1e3∘{⍵<⍺:1↓⍕⍵+⍺⋄'C',(⍵-⍺)∇⍨⍺÷10}

Experimente online!

Prefixo da função direta.

Porta da resposta JS do @ tsh .

Quão:

1e3∘{⍵<⍺:1↓⍕⍵+⍺⋄'C',(⍵-⍺)∇⍨⍺÷10}  Main function, arguments  and  (⍵  input,   1000).
     ⍵<⍺:                           If ⍵<⍺
         1                         Drop (↓) the first element (1) of
                                   Format (⍕); 'stringify'
            ⍵+⍺                     ⍵+⍺
                                   else
                'C',                Concatenate (,) the literal 'C' with
                         ∇⍨         Recursive call (∇) with swapped arguments (⍨)
                    (⍵-⍺)  ⍺÷10     New arguments;   ⍵-⍺;   ⍺÷10
J. Sallé
fonte
1

PHP, 71 bytes

for($n=$argn,$x=1e4;1<$x/=10;$n%=$n<$x?$x/10:$x)echo$n<$x?$n/$x*10|0:C;

imprime Cpara a coroa. Execute como pipe -nRou experimente online .

Titus
fonte
1

C,  84  58 bytes

Agradecemos a @tsh por salvar 25 bytes e a @ceilingcat por salvar um byte!

f(n,p){for(p=1e3;p/=10;)n-=putchar(n/p>9?46:48+n/p)%12*p;}

Experimente online!

Steadybox
fonte
1
f(n,p){for(p=1000;p/=10;)n-=putchar(n/p>9?46:48+n/p)%12*p;}
tsh
1

sed , 39

48 bytes, mas a pontuação é 39, pois cada 👑 conta como 1.

/..../s/^1+0/👑👑👑/
s/^/00/
s/.*(...)/\1/

Experimente online!

Trauma Digital
fonte
1

Perl 6 , 38 - 9 = 29 bytes

-2 bytes graças a Jo King

{~m/...$/}o{S/1+0/👑👑👑/}o*+1e4

Experimente online!

Inspirado na solução JavaScript de Arnauld.

Nwellnhof
fonte
0

Limpo , 96 bytes

Acho que o Super Mario 3D Land, o New Super Mao Bros.2 e o Super Mario 3D World têm esse contador de vidas.

import StdEnv,Text
$n#i=3-n/1000-n/1100-n/1110
=("👑👑👑"+lpad(""<+n rem(10^i))i'0')%(i*4,99

Eu concordo com o Clean .

Verifique se não estou trapaceando.

Leo
fonte
3
Bem vindo ao site. Que língua é essa?
Wheat Wizard