Корона сто корона корона


26

Я заметил, что в определенной игре был специфический счетчик жизней, который вместо того, чтобы останавливаться 999, получил новую цифру - следующий номер был короной сто или 👑00. После того, как 👑99вышел коронные сто crownty ( 👑👑0) и последний номер, после того, как 👑👑9была краун сто crownty корона или 👑👑👑, что было бы 1110 в десятичной системе .

Ваша задача - написать программу или функцию, которая выводит этот счетчик.

Учитывая целое число из диапазона [0,1110](включительно на обоих концах), выведите трехсимвольную строку где

  • каждый персонаж из списка 0123456789👑
  • корона (👑) может отображаться только как крайний левый символ или если слева от него есть корона
  • когда это число читается как десятичное число, но корона считается как 10, вы получаете исходное число

Контрольные примеры

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

Вы можете использовать любой не десятичный символ вместо короны. Чтобы поощрить красивую печать, символ короны (последовательность байтов UTF8 "\ 240 \ 159 \ 145 \ 145") считается одним байтом вместо четырех. Ваша программа не должна работать для чисел вне допустимого диапазона.

Это , поэтому самый короткий ответ, измеряемый в байтах, выигрывает!


4
О, Супер Марио 3D Land!
Деусови

2
@Deusovi Я на самом деле думал о последующей игре Super Mario 3D World, но я догадался!
Angs

3
Это должен быть номер IMO для Боти МакБоатФейс.
мистер Листер

Бонус умножается на количество крон в коде, верно?
Эрик Outgolfer

3
@JeffZeitlin - это избыточная десятичная система, в которой число может иметь более одного представления (даже без учета начальных нулей). Корона зарезервирована как элемент неожиданности, используется только тогда, когда это абсолютно необходимо.
Angs

Ответы:


2

05AB1E , 20 18 байт

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

Использует места для коронок.

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

₄‹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 " → "   "


9

JavaScript (ES6),  62 46  44 байта

Сохранено 2 байта благодаря @nwellnhof

Выводит короны как xперсонажи.

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

Попробуйте онлайн!

Как?

10000/1+0/xxx

Примеры:

0 "10000" "Xxx000" "000"123 "10123" "Xxx123" "123"+1023 "11023" "Xxx23" "X23"1103 "11103" "Xxx3" "XX3"1110 "11110" «Ххх» «Ххх»


s.replace(/./g,`#`)это аккуратно ... у меня было Array(s.length+1).join`#`, и мое регулярное выражение тоже было длиннее! Отличная работа, +1
г-н Xcoder

@ Mr.Xcoder Это была ужасная идея. Но потребовалось больше года, чтобы это исправить. : D
Арно

8

Язык программирования Шекспира , 763 692 690 689 683 байта

,.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.

Попробуйте онлайн!

Использует " "вместо коронок. По стоимости еще 4 байта это можно изменить, чтобы вместо него отображался «видимый» символ.

Объяснение:

,.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).


@HelloGoodbye Спасибо, я забыл избавиться от некоторых пробелов.
JosiahRyanW

5

Python 2 , 53 байта

Снимаю шляпу перед Арнаулдом за -22 байта . Хотя рекурсия все еще выигрывает.

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

Попробуйте онлайн!

Python 2 , 51 байт

Вместо этого он реализует рекурсивный метод tsh . Сохранено 2 байта благодаря ovs .

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

Попробуйте онлайн!


54 байта путем обновления 1-го решения так же, как я сделал с моим ответом JS. Похоже, рекурсия все еще побеждает в Python.
Арно

1
@Arnauld Спасибо: D. Это редактирование действительно было SGITW
Mr. Xcoder

С тех пор nwellnhof отмечает, что добавление 10000 приводит к более простой схеме 1+0. Следовательно, это 53-байтовая версия.
Арно,

@ Arnauld Спасибо;) Это довольно впечатляет.
г-н Xcoder


3

Сетчатка 0.8.2 , 41 байт

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

Попробуйте онлайн! Использует #s вместо 👑s. Ссылка включает в себя тестовые случаи. Объяснение:

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

Pad 1- и 2-значные номера до трех цифр.

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

Измените первые 1s четырехзначных чисел на #s и удалите следующий 0.


3

Желе , 19 байт - 0 = 19

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

Полная программа печати результата с использованием пробела в качестве короны.
(В качестве монадической ссылки получен смешанный список целых цифр и пробелов)

Попробуйте онлайн! Или посмотрите набор тестов .

... может быть, рекурсивная реализация будет короче.

Как?

<ȷ¬ȧ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"

3

Python 2 , 40 байт

lambda n:'%3s'%`10000+n`.lstrip('1')[1:]

Попробуйте онлайн!

Реализует идею, похожую на ответ г-на Xcoder на основе регулярных выражений, но без регулярных выражений. Снимают ведущую 1 - й в 10000+n, а также следующий символ, затем пэд с пробелами до длины 3. Результат похож на решение OVS игрового использования , lstripно без необходимости два случая.


2

Чисто , 87 байт

Не выводит короны (использует c).

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

Попробуйте онлайн!

$ 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

Чистый , 99 - 3 = 96 байт

У этого есть короны.

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

Попробуйте онлайн!


Второй ответ имеет оценку только 90.
pppery


1

Java 10, 84 83 байта

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);}

Порт @tsh 'C комментарий .
Использует .вместо коронок.

Попробуйте онлайн.

Альтернативный подход (84 (87-3) байта):

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

Порт @tsh 'ответ JavaScript .

Попробуйте онлайн.


1

APL (Dyalog Unicode) , 32 байта

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

Попробуйте онлайн!

Префикс прямой функции.

Порт ответа @ tsh на JS .

Как:

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



1

C  84  58 байт

Спасибо @tsh за сохранение 25 байтов и спасибо @ceilingcat за сохранение байта!

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

Попробуйте онлайн!


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



0

Чисто , 96 байт

Я думаю, что Super Mario 3D Land, New Super Mao Bros.2 и Super Mario 3D World имеют этот счетчик жизни.

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

Я согласен с Чистым .

Убедитесь, что я не изменяю.


3
Добро пожаловать на сайт. Что это за язык?
Пшеничный волшебник
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.