Обратный отсчет и переработка


14

обратный отсчет

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

Сначала ваше приложение читает число, либо в качестве аргумента программы, либо с использованием стандартного ввода. Далее вам просто нужно будет отсчитать, как это: 10 9 8 7 6порядке убывания)

Но подождите, это еще не все!

Утилизация отходов

Есть ситуации, когда мы можем напечатать каждый номер, но не перечислять каждый номер, мы можем сделать переработку! Позвольте мне привести быстрый пример:

Input: 110

Output:   11091081071061051041031021010099... etc
Recycled:  10                        1

Теперь мы все еще перечислили все числа, 110, 109, 108, но мы переработали 0 и 1 .

Другой пример:

Input: 9900

Output:   9900989989897989698959894... etc
Recycled:        9 98  

Код-гольф вызов

  • Читать число (аргумент или стандартный)
  • Вывести обратный отсчет в порядке убывания при утилизации всех возможных чисел (в стандартный вывод или файл)
  • Остановитесь, когда достигнете 1 ИЛИ в тот момент, когда вы переработали от 0 до 9 (что бы ни случилось раньше)

Простой пример (пока не достигнуто 1):

Input: 15
Output: 15141312110987654321

(Notice the 110 instead of 1110)

Более сложный пример (все переработано):

Input: 110
Output:   110910810710610510410310210100998979695949392919089887868584838281807978776757473727170696867665646362616059585756554535251504948474645443424140393837363534332313029282726252423221
Recycled:  10                            9                    8                    7                    6                    5                    4                    3                    2

(We've recycled all 0-9)


2
Это действительно не связано с проблемой «одного кольца, чтобы управлять ими всеми».
Будет

@RoyvanRijn Вы ничего не упомянули о порядке возрастания в своем вопросе - если бы у меня не было близкого голосования в качестве дубликата, у меня было бы «неясно, что вы спрашиваете». если числа должны быть в порядке возрастания, то как 10 (во втором примере) может быть в самом начале последовательности?
гордый haskeller

1
@proudhaskeller не вопрос задать нисходящий порядок? «обратный отсчет» означает «нисходящий порядок».
Будет

1
Рой, я не голосовал за дубликат. Но явное упоминание связанных вопросов дополняет автоматическое угадывание связанных вопросов. @ Конечно, это связано. Удалите условие ранней остановки, и этот вопрос просит вас реализовать конкретную неоптимальную стратегию для «одной строки, чтобы управлять ими всеми».
Питер Тейлор

Ответы:


11

T-SQL - 291 277 267 217 199 191 166 158 153 145 142 128 117

Подойдя к этому по-новому, мне удалось снизить до 145 (142 после пары незначительных настроек), не слишком потертый. Это означает, что я мог бы бороться за серебро или бронзу. ^^

DECLARE @ INT=100;WITH N AS(SELECT 1A UNION ALL SELECT A+1FROM N WHERE A<@)SELECT LEFT(A,LEN(A)-1+A%11)FROM N ORDER BY-A

Это не печатает список, он выбирает результаты. Вопрос никогда не давал подробностей о выходе, так что все должно быть в порядке. Это все еще имеет тот же предел в 100 на входе, отчасти потому, что я злоупотребляю тем фактом, что каждый 11-й член до 100 теряет символ, и частично из-за предела рекурсии 100 по умолчанию для общих табличных выражений.

DECLARE @ INT=100;

WITH N AS
(
    SELECT 1A
    UNION ALL
    SELECT A+1
    FROM N
    WHERE A<@
)

SELECT LEFT(A,LEN(A)-1+A%11)
FROM N
ORDER BY-A

1
Ха-ха, T-SQL, хороший!
Рой ван Рейн

7

Python 143 147

def t(n):
 p=o='';r=0 # p is previous string, o is output string, r is recycled bitmap
 while n and r<1023: # 1023 is first 10 bits set, meaning all digits have been recycled
    s=`n`;i=-1 # s is the current string representation of n
       # i is from end; negative offsets count backwards in strings
    while p.endswith(s[:i])-1:i-=1 # find common ending with prev; s[:0] is '',
       # which all strings end with
    for j in s[:i]:r|=1<<int(j) # mark off recycled bits
    o+=s[i:];p=s;n-=1 # concatenate output, prepare for next number
 print o # done

Отступ первого уровня - пробел, второй - символ табуляции.


2
Некоторые стандартные сохранения символов: p=o=''помещайте в функцию такие вещи, как необязательные параметры; Вы можете использовать *для andв n and r<1023или , может быть , даже r<1023*n; while x-1:может побрить пространство как while~-x. Кроме того, может быть короче использовать набор цифр, а не битовую маску для хранения того, какие цифры были использованы.
кнор

5

Хаскелл, 154 149 147 145 128 120 119 117 байт

import Data.List
(r%x)n|n>0&&r<":"=[(r\\t)%(x++(show n\\t))$n-1|t<-tails x,isPrefixOf t$show n]!!0|0<1=x
h=['0'..]%""

добавление в стоимость проверки переработки много символов ... вздох

немного поиграл, вспомнив, какие цифры еще не были переработаны, и остановился, когда список пуст. затем немного поиграл в гольф, перейдя к явной рекурсии и еще нескольким трюкам.

пример вывода:

*Main> h 110
"110910810710610510410310210100998979695949392919089887868584838281807978776757473727170696867665646362616059585756554535251504948474645443424140393837363534332313029282726252423221"

5

Python 2: 119 117

Отмечать это как вики сообщества, потому что это всего лишь более точная версия ответа Уилла .

n=input()
d=s,={''}
exec"t=`n`;i=len(t)\nwhile(s*i)[-i:]!=t[:i]:i-=1\ns+=t[i:];d|=set(t[:i]);n-=len(d)<11;"*n
print s

фантастический! Как d=s,={''}работает?
Будет

2
@Will d=s,={''}эквивалентно d={''}; s,={''}. s,={''}использует последовательность распаковки, функция более широко используется в таких заявлениях, как a, b = (b, a), но вы также можете использовать его , чтобы извлечь единственный элемент из последовательности одного элемента.
штормовое землетрясение,

1
@flornquake О, моя ошибка. Я думаю, что вы все еще можете сделатьlen(d)%11*n , хотя похоже, что это спорный с вами, используя цикл exec.
xnor

1
@ В качестве фона для того, почему этот хитрый трюк эффективен, по иронии судьбы сделать пустой набор проще, set()чем набор из одного элемента {x}. Итак, flornquake инициализирует его с помощью элемента-заполнителя и проверяет, имеет ли он все десять цифр, проверяя, имеет ли он одиннадцать элементов. Поскольку пустая строка должна быть инициализирована s, она служит в качестве этого элемента-заполнителя, объединяя эти инициализации для сохранения символов.
xnor

1
@ Да, len(d)%11*nбыло бы неплохо. :)
Flornquake

4

Рубин, 145 139 130 байт

n=gets.to_i
d=*?0..?9
s=''
n.times{|i|j=(t=(n-i).to_s).size;j-=1 while s[-j,j]!=u=t[0,j];d-=u.chars;s=t;$><<t[j..-1];exit if[]==d}

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

whileВместо этого есть альтернативная версия, timesно что бы я ни пытался, количество байтов одинаково:

n=gets.to_i
d=*?0..?9
s=''
(j=(t=n.to_s).size;j-=1 while s[-j,j]!=u=t[0,j];d-=u.chars;s=t;$><<t[j..-1];exit if[]==d;n-=1)while 0<n

3

CJam, 80 77 65 57 54 персонажа

Скорее всего, не оптимизирован, но после многих оптимизаций и отладки здесь приведено прямое преобразование моего ответа ES6 в CJam:

Mr{s:C_,{:H<M_,H->=!_CH@-@}g:T>+:MCT<_O@-+:O,A<Ci(*}h;

Попробуйте онлайн здесь . Функция принимает число в качестве STDIN и выводит обратный отсчет времени повторного использования, останавливаясь между ними, если переработка завершена.

Я постараюсь играть в гольф дальше.

Как это устроено:

Основная идея заключается в том, что для каждого числа C обратного отсчета проверьте, равны ли первые H цифр последним H цифрам результирующей строки, где H переходит от количества цифр в C к 0

Mr                                    "Put an empty string and input on stack";
  { ... }h;                           "Run while top element of stack is true, pop when done";
s:C                                   "Store string value of top stack element in C"
   _,                                 "Put the number of characters in C to stack";
     { ... }g                         "Run while top element of stack is true";
:H<                                   "Store the digit iteration in H and slice C";
   M                                  "M is the final output string in making";
    _,H-                              "Take length of M and reduce H from it";
        >                             "Take that many digits of M from end and..."
         =!_                          "Compare with first H digits of C, negate and copy";
            CH@                       "Put C and H on stack and bring the above result to top of stack";
               -                      "Reduce H if the matched result was false";
                @                     "Bring the matched result on top in order continue or break the loop"
             :T                       "Store top stack element in T after the loop";
               >+:M                   "Take everything but first T digits of C and add it to M and update M";
                   CT<_               "Take first T digits of C and copy them";
                       O@             "Put saved digits on stack, and rotate top three elements";
                         -            "Remove all occurence of first T digits of C from O";
                          +:O         "Add first T digits of C to O and update O";
                             ,A<      "Compare number of saved digits with 10";
                                Ci(   "Decrement integer value of C and put it on stack";
                                   *  "If number of saved digits greater than 9, break loop";

2

JavaScript ES6, 149 146 символов

Такой многословный, много персонажей, вау.

C=n=>{s=c='';while(n>0&s.length<10){j=1;while(t=(n+'').slice(0,-j++))if(c.endsWith(t)){s+=~s.search(t)?'':t;break}c+=(n--+'').slice(1-j)}return c}

Запустите его в последней веб-консоли Firefox.

После запуска он создает метод, Cкоторый вы можете использовать как

C(12)
12110987654321

ОБНОВЛЕНИЕ : Иногда обычный старый returnкороче закрытия функции стрелки :)


Он не должен выводить, какие цифры были переработаны, только последовательность
обратного

Ой! в том, что ? Все его примеры тоже выводили это.
Оптимизатор

@proudhaskeller О, я тоже выводю переработанные символы. Спасибо, это сэкономит мне немного символов.
PenutReaper
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.