Geri sayım ve geri dönüşüm


14

geri sayım

Bu kod-golf meydan okuma için amacınız geri sayım ve bu arada geri dönüşüm sayıları. Açıklamama izin ver.

İlk önce uygulamanız bir sayıyı program argümanı olarak veya stdin kullanarak okur. Sonra sadece şu şekilde geri saymanız gerekir: 10 9 8 7 6( azalan sırada)

Ama bekleyin, dahası var!

geri dönüşüm

Her sayıyı yazdırabileceğimiz, ancak her sayıyı listelemediğimiz durumlar var, geri dönüşüm yapabiliriz! Kısa bir örnek vereyim:

Input: 110

Output:   11091081071061051041031021010099... etc
Recycled:  10                        1

Şimdi hala tüm sayıları listeledik, 110, 109, 108, ancak 0 ve 1'i geri dönüştürdük .

Başka bir örnek:

Input: 9900

Output:   9900989989897989698959894... etc
Recycled:        9 98  

Kod-golf mücadelesi

  • Bir sayı okuma (bağımsız değişken veya standart)
  • Olası tüm sayıları (stdout veya dosyaya) geri dönüştürürken geri sayımı azalan sırada çıktılayın
  • 1 VEYA 0 ile 9 arasında geri dönüş yaptığınız andan itibaren durun (önce ne olursa olsun)

Basit örnek (1'e kadar):

Input: 15
Output: 15141312110987654321

(Notice the 110 instead of 1110)

Daha gelişmiş örnek (tümü geri dönüştürülmüş):

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

(We've recycled all 0-9)


2
Bu gerçekten "hepsine hükmedecek bir halka" sorunu ile ilgili değil.
Will

@RoyvanRijn Sorunuzda artan düzen hakkında hiçbir şeyden bahsetmediniz - eğer yinelenen bir oyla yakın bir oyum olmasaydı, "ne soruyorsunuz belirsiz" olurdu. eğer sayılar artan sırada olmalıdırsa, 10 (ikinci örneğinizde) dizinin başlangıcında nasıl olabilir?
gururlu haskeller

1
@proudhaskeller soru azalan sırayı belirtmiyor mu? "geri sayım" azalan düzen anlamına gelmektedir.
Will

1
Roy, kopya olarak kapatmak için oy vermedim. Ancak ilgili sorulardan açıkça bahsetmek, sistemin ilgili soruları otomatik olarak tahmin etmesini tamamlar. @ Elbette ilgili olacak. Erken durdurma koşulunu kaldırın ve bu soru sizden "hepsini yönetecek bir dize" için uygun olmayan belirli bir strateji uygulamanızı istiyor.
Peter Taylor

Yanıtlar:


11

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

Buna yeni bir şekilde yaklaştıktan sonra, çok düşkün değil, 145'e (birkaç küçük değişiklikten sonra 142) inmeyi başardım. Bu, gümüş veya bronz için rekabet edebileceğim anlamına geliyor. ^^

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

Bu bir liste yazdırmaz, sonuçları seçer. Soru hiçbir zaman çıktı hakkında ayrıntılı bilgi vermedi, bu yüzden bu iyi olmalı. Kısmen 100'ün altındaki her 11. terimin bir karakteri kaybetmesi ve kısmen ortak tablo ifadelerindeki varsayılan 100 özyineleme sınırı nedeniyle, bu girişte 100 ile aynı sınırlama vardır.

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
Haha T-SQL, güzel olan!
Roy van Rijn

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

İlk seviye girintisi boşluk, ikinci seviye sekme karakteridir.


2
Bazı standart karakter tasarrufları: p=o=''Fonksiyona isteğe bağlı parametreler gibi şeyler koyun ; Kullanabileceğiniz *için andde n and r<1023ya da belki r<1023*n; while x-1:bir alanı tıraş edebilir while~-x. Ayrıca, hangi rakamların kullanıldığını saklamak için bir bit maskesi yerine bir dizi rakam kullanmak daha kısa olabilir.
xnor

5

Haskell, 154 149 147 145 128 120 119 117 bayt

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'..]%""

geri dönüşüm kontrol maliyeti ekleyerek çok sayıda karakter ...

henüz hangi rakamların geri dönüştürülmediğini hatırlayarak ve liste boşken durarak biraz golf oynadı. sonra açık özyineleme ve birkaç hile daha hareket ederek biraz daha golf.

örnek çıktı:

*Main> h 110
"110910810710610510410310210100998979695949392919089887868584838281807978776757473727170696867665646362616059585756554535251504948474645443424140393837363534332313029282726252423221"

5

Python 2: 119 117

Bunu topluluk wiki'si olarak işaretlemek çünkü Will'in cevabının sadece daha golfçü bir versiyonudur .

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

fantastik! Nasıl d=s,={''}çalışır?
Will

2
@Will d=s,={''}eşittir d={''}; s,={''}. s,={''}gibi ifadelerde daha yaygın olarak kullanılan bir özellik olan dizi açma a, b = (b, a)işlevini kullanır, ancak bunu tek öğeli bir diziden tek öğeyi çıkarmak için de kullanabilirsiniz.
flornquake

1
@flornquake Oh, hatam. Yine de yapabileceğinizi düşünüyorum len(d)%11*n, ama bir exec döngü kullanarak sizinle tartışmalı gibi görünüyor.
xnor

1
@Bu Zeki hilenin neden etkili olduğunun arka planı olarak, boş bir set yapmak set()tek öğeli bir setten daha ironiktir {x}. Böylece, flornquake onu bir dolgu elemanı ile başlatır ve on basamağa sahip olup olmadığını on bir elemanı olup olmadığını kontrol eder. Boş dizenin başlatılması sgerektiğinden, bu dolgu öğesi olarak hizmet etmek için yapılır ve karakterleri kaydetmek için bu başlatmaları birleştirir.
xnor

1
@ Evet, len(d)%11*ngüzel olurdu. :)
flornquake

4

Yakut, 145 139 130 bayt

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}

Will'inkine benzer bir yaklaşım, ancak bit maskesi kullanmıyorum, bunun yerine kullanılmayan basamaklardan oluşan bir dizi gibi. Giriş STDIN üzerinden yapılır.

whileBunun yerine kullanarak alternatif bir sürüm var timesama ne olursa olsun denemek bayt sayısı aynı:

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 Karakterler

Muhtemelen hiç optimize edilmemiştir, ancak bir çok optimizasyon ve hata ayıklamadan sonra, CJam'deki ES6 yanıtımın doğrudan dönüşümü:

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

Burada çevrimiçi deneyin . İşlev, numarayı STDIN olarak alır ve geri dönüşüm tamamlandığında geri kalan geri sayımı çıkarır.

Daha fazla golf yapmaya çalışacağım.

Nasıl çalışır:

Temel fikir, her geri sayım sayısı C için, ilk H basamaklarının sonuçtaki dizenin son H basamaklarına eşit olup olmadığını kontrol edin; burada H, C'deki basamak sayısından 0'a gider.

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 karakter

Böyle ayrıntılı, çok fazla karakter, vay canına.

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}

En son Firefox'un Web Konsolunda çalıştırın.

Çalıştırdıktan sonra, Caşağıdaki gibi kullanabileceğiniz bir yöntem oluşturur

C(12)
12110987654321

GÜNCELLEME : Bazen düz eski returnok işlevi kapanış daha kısa :)


Hangi rakamların geri dönüştürüldüğünü, sadece geri dönüşümden sonra geri sayım sırasını
çıkarmamalı

Ah! bu mu ? Bütün örnekleri de bunu çıkardı.
Optimizer

@proudhaskeller Geri dönüşümlü karakterleri de çıkardım. Teşekkürler, bu bana bazı karakter kazandıracak.
PenutReaper
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.