Korona sto koronowa korona

26

Zauważyłem, że pewna gra ma osobliwy licznik życia, który zamiast się zatrzymać 999, zyskał nową cyfrę - następną liczbą była setka koron👑00 . Po 👑99przyszedł korony sto crownty ( 👑👑0) i ostatni numer, po 👑👑9, była korona sto crownty korona lub 👑👑👑, co byłoby 1110 w systemie dziesiętnym.

Twoim zadaniem jest napisanie programu lub funkcji, która wyświetli ten licznik.

Biorąc pod uwagę liczbę całkowitą z zakresu [0,1110](włącznie na obu końcach), wypisz ciąg trzech znaków gdzie

  • każda postać jest z listy 0123456789👑
  • korona (👑) może pojawiać się tylko jako postać znajdująca się najbardziej na lewo lub gdy po lewej stronie znajduje się korona
  • gdy liczba ta jest odczytywana jako liczba dziesiętna, ale z liczeniem korony jako 10, odzyskujesz pierwotną liczbę

Przypadki testowe

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

Zamiast korony możesz użyć dowolnego znaku nie dziesiętnego. Aby zachęcić do ładnego drukowania, znak korony (sekwencja bajtów UTF8 „\ 240 \ 159 \ 145 \ 145”) liczy się jako jeden bajt zamiast czterech. Twój program nie musi działać dla liczb spoza prawidłowego zakresu.

To jest , więc wygrywa najkrótsza odpowiedź, mierzona w bajtach!

Angs
źródło
4
Och, Super Mario 3D Land!
Deusovi
2
@Deusovi Tak naprawdę myślałem o kontynuacji gry, Super Mario 3D World, ale dobrze zgadłem!
Angs
3
Powinien to być numer IMO dla Boaty McBoatFace.
Pan Lister,
Bonus jest mnożony przez liczbę koron w kodzie, prawda?
Erik the Outgolfer
3
@JeffZeitlin to redundantny system dziesiętny, w którym liczba może mieć więcej niż jedną reprezentację (nawet pomijając początkowe zera). Korona jest następnie zarezerwowana jako element zaskoczenia, używany tylko wtedy, gdy jest absolutnie potrzebny.
Angs

Odpowiedzi:

2

05AB1E , 20 18 bajtów

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

Wykorzystuje miejsca na korony.

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

₄‹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
źródło
12

JavaScript (Node.js) , 50 bajtów

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

Wypróbuj online!

TIO oparto na odpowiedzi Arnaulda. Pokaż 👑 jako #.

tsh
źródło
3
Ładne podejście rekurencyjne!
Arnauld,
9

JavaScript (ES6),  62 46  44 bajty

Zaoszczędzono 2 bajty dzięki @nwellnhof

Wyprowadza korony jako xpostacie.

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

Wypróbuj online!

W jaki sposób?

10000/1+0/xxx

Przykłady:

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

Arnauld
źródło
s.replace(/./g,`#`) is neat... I had Array(s.length+1).join`#`, and my regex was longer too! Nice work, +1
Mr. Xcoder
@Mr.Xcoder It was actually a terrible idea. But it took more than one year to fix it. :D
Arnauld
8

Shakespeare Programming Language, 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.

Try it online!

Uses " " instead of crowns. At the cost of 4 more bytes, this could be modified to show a "visible" character instead.

Explanation:

,.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
źródło
683 bytes
Hello Goodbye
@HelloGoodbye Thank you, I forgot to get rid of some spaces.
JosiahRyanW
5

Python 2, 53 bytes

Hats off to Arnauld for -22 bytes. Recursion still wins, though.

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

Try it online!

Python 2, 51 bytes

This instead implements tsh's recursive method. Saved 2 bytes thanks to ovs.

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

Try it online!

Mr. Xcoder
źródło
54 bytes by updating the 1st solution the same way as I did with my JS answer. Seems like recursion still wins in Python, though.
Arnauld
1
@Arnauld Thanks :D. This edit was really a SGITW
Mr. Xcoder
nwellnhof has since pointed out that adding 10000 leads to the more straightforward pattern 1+0. Hence this 53 bytes version.
Arnauld
@Arnauld Thanks ;) That's rather impressive.
Mr. Xcoder
4

Python 2, 52 bytes

lambda n:['%03d'%n,'%3s'%`n`.lstrip('1')[1:]][n>999]

Try it online!

ovs
źródło
3

Retina 0.8.2, 41 bytes

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

Try it online! Uses #s instead of 👑s. Link includes test cases. Explanation:

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

Pad 1- and 2-digit numbers to three digits.

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

Change leading 1s of 4-digit numbers to #s and delete the next 0.

Neil
źródło
3

Jelly, 19 bytes - 0 = 19

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

A full program printing the result using a space character as the crown.
(As a monadic Link a mixed list of integer digits and space characters is yielded)

Try it online! Or see the test-suite.

...maybe a recursive implementation will be shorter.

How?

<ȷ¬ȧ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
źródło
2

Clean, 87 bytes

Doesn't output crowns (uses c).

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

Try it 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

Clean, 99 - 3 = 96 bytes

This one has crowns.

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

Try it online!

Οurous
źródło
The second answer has a score of only 90.
pppery
1

Japt, 20 bytes

A naïve (and slightly drunk!) port of Arnauld's solution. Uses " for crown.

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

Try it

Shaggy
źródło
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);}

Port of @tsh' C comment.
Uses . instead of crowns.

Try it online.

Alternative approach (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);}

Port of @tsh' JavaScript's answer.

Try it online.

Kevin Cruijssen
źródło
1

APL (Dyalog Unicode), 32 bytes

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

Try it online!

Prefix direct function.

Port of @tsh's JS Answer.

How:

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é
źródło
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;

prints C for the crown. Run as pipe with -nR or try it online.

Titus
źródło
1

C,  84  58 bytes

Thanks to @tsh for saving 25 bytes and thanks to @ceilingcat for saving a byte!

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

Try it online!

Steadybox
źródło
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, but score is 39, since each 👑 counts as 1.

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

Try it online!

Digital Trauma
źródło
1

Perl 6, 38 - 9 = 29 bytes

-2 bytes thanks to Jo King

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

Try it online!

Inspired by Arnauld's JavaScript solution.

nwellnhof
źródło
0

Clean, 96 bytes

I think Super Mario 3D Land, New Super Mao Bros.2, and Super Mario 3D World have this life counter.

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

I agree with Clean.

Verify that I’m not cheating.

Leo
źródło
3
Welcome to the site. What language is this?
Wheat Wizard