Відлік та переробка


14

Відлік часу

Ваша мета цього завдання для коду-гольфу - підраховувати та тим часом переробляти номери. Дозволь пояснити.

Спочатку ваша програма читає число, або як аргумент програми, або за допомогою stdin. Далі вам просто потрібно буде відлічити так: 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  

Код-гольф виклик

  • Прочитайте число (аргумент або stdin)
  • Виведіть зворотний відлік у порядку зменшення під час рециркуляції всіх можливих чисел (у stdout чи файл)
  • Зупиніться, коли досягнете 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

Пітон 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. Крім того, може бути коротше використовувати набір цифр, а не біт-маску для зберігання, які цифри були використані.
xnor

5

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

Пітон 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), але ви також можете використовувати її для вилучення єдиного елемента з одноелементної послідовності.
flornquake

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коротший, ніж закриття функції стрілки :)


Він не повинен виводити, які цифри були перероблені, лише послідовність відліку після переробки
гордий haskeller

Ой! чи це ? Усі його приклади також були наслідком цього.
Оптимізатор

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