Hitung mundur dan daur ulang

14

Hitung mundur

Tujuan Anda untuk tantangan kode-golf ini adalah menghitung mundur dan sementara itu mendaur ulang angka. Biarkan saya jelaskan.

Pertama aplikasi Anda membaca angka, baik sebagai argumen program atau menggunakan stdin. Selanjutnya Anda hanya perlu menghitung mundur seperti ini: 10 9 8 7 6(dalam urutan menurun )

Tapi tunggu, masih ada lagi!

Mendaur ulang

Ada situasi di mana kita dapat mencetak setiap angka, tetapi jangan daftar setiap angka, kita dapat melakukan daur ulang! Biarkan saya memberi contoh cepat:

Input: 110

Output:   11091081071061051041031021010099... etc
Recycled:  10                        1

Kami sekarang masih mencantumkan semua angka, 110, 109, 108, tetapi kami telah mendaur ulang 0 dan 1 .

Contoh lain:

Input: 9900

Output:   9900989989897989698959894... etc
Recycled:        9 98  

Tantangan kode-golf

  • Baca angka (argumen atau stdin)
  • Keluarkan hitungan mundur dalam urutan menurun sambil mendaur ulang semua angka yang mungkin (ke stdout atau file)
  • Berhentilah saat Anda mencapai 1 ATAU saat Anda mendaur ulang 0 hingga 9 (apa pun yang terjadi lebih dulu)

Contoh sederhana (sampai 1 tercapai):

Input: 15
Output: 15141312110987654321

(Notice the 110 instead of 1110)

Contoh lebih lanjut (semua daur ulang):

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

(We've recycled all 0-9)
Roy van Rijn
sumber
1
Terkait
Peter Taylor
2
Benar-benar tidak terkait dengan masalah "satu cincin untuk memerintah mereka semua" sama sekali.
Will
@RoyvanRijn Anda tidak menyebutkan apa pun tentang urutan naik dalam pertanyaan Anda - jika saya tidak akan memilih dekat sebagai duplikat, saya akan mengatakan "tidak jelas apa yang Anda minta". jika angkanya harus dalam urutan menaik, maka bagaimana bisa 10 (dalam contoh kedua Anda) bisa tepat di awal urutan?
haskeller bangga
1
@proudhaskeller tidakkah pertanyaan menentukan urutan menurun ? "Hitung mundur" dipahami sebagai urutan menurun.
Will
1
Roy, saya tidak memilih untuk menutup sebagai duplikat. Tetapi secara eksplisit menyebutkan pertanyaan terkait melengkapi sistem menebak otomatis pertanyaan terkait. @ Akan, tentu saja ini terkait. Hapus kondisi berhenti awal dan pertanyaan ini meminta Anda untuk menerapkan strategi spesifik yang tidak optimal untuk "satu string untuk mengatur semuanya".
Peter Taylor

Jawaban:

11

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

Setelah mendekati ini dengan cara baru, saya berhasil turun ke 145 (142 setelah beberapa tweak kecil), tidak terlalu buruk. Itu berarti saya mungkin bisa bersaing untuk mendapatkan perak atau perunggu. ^^

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

Ini tidak mencetak daftar, ia memilih hasilnya. Pertanyaannya tidak pernah memberikan spesifik tentang output, jadi ini harus baik-baik saja. Ini masih memiliki batas yang sama dari 100 pada input, sebagian karena saya menyalahgunakan fakta bahwa setiap istilah ke-11 di bawah 100 kehilangan karakter dan sebagian karena batas rekursi 100 default pada ekspresi tabel umum.

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
PenutReaper
sumber
1
Haha T-SQL, bagus!
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

Indentasi tingkat pertama adalah spasi, level kedua adalah tab char.

Akan
sumber
2
Beberapa char standar menyimpan: Masukkan hal-hal seperti p=o=''params opsional ke fungsi; Anda dapat menggunakan *untuk anddi n and r<1023atau bahkan mungkin r<1023*n; while x-1:dapat mencukur ruang sebagai while~-x. Juga, mungkin lebih pendek untuk menggunakan satu set digit daripada topeng bit untuk menyimpan digit mana yang telah digunakan.
xnor
5

Haskell, 154 149 147 145 128 120 119 117 byte

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

menambahkan biaya pengecekan daur ulang banyak karakter ... huh

bermain golf sedikit dengan mengingat angka apa yang belum didaur ulang dan berhenti ketika daftar kosong. kemudian bermain sedikit lebih banyak dengan pindah ke rekursi eksplisit dan beberapa trik lagi.

contoh output:

*Main> h 110
"110910810710610510410310210100998979695949392919089887868584838281807978776757473727170696867665646362616059585756554535251504948474645443424140393837363534332313029282726252423221"
haskeller bangga
sumber
5

Python 2: 119 117

Menandai ini sebagai komunitas wiki karena itu hanya versi yang lebih golf dari jawaban Will .

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
flornquake
sumber
fantastis! Bagaimana cara d=s,={''}kerjanya?
Will
2
@ Akan d=s,={''}sama dengan d={''}; s,={''}. s,={''}menggunakan pembongkaran urutan, fitur yang lebih umum digunakan dalam pernyataan seperti a, b = (b, a), tetapi Anda juga dapat menggunakannya untuk mengekstrak satu-satunya elemen dari urutan elemen tunggal.
flornquake
1
@flake Goyang Oh, kesalahanku. Saya pikir Anda masih bisa melakukannya len(d)%11*n, meskipun sepertinya itu bisa diperdebatkan dengan Anda menggunakan loop exec.
xnor
1
@ Akan Seperti latar belakang mengapa trik pintar ini efisien, ironisnya lebih lama untuk membuat set kosong set()daripada set elemen tunggal {x}. Jadi, flornquake menginisialisasi dengan anggota pengisi, dan memeriksa apakah ia memiliki semua sepuluh digit dengan melihat apakah ia memiliki sebelas elemen. Karena string kosong perlu diinisialisasi ke s, string ini dibuat untuk berfungsi sebagai anggota pengisi ini, menggabungkan inisialisasi ini untuk menghemat karakter.
xnor
1
@ len(d)%11*nAkan Ya, pasti menyenangkan. :)
flornquake
4

Ruby, 145 139 130 byte

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}

Pendekatan yang mirip dengan Will, kecuali saya tidak menggunakan topeng bit, tetapi array set seperti digit yang tidak digunakan sebagai gantinya. Masukan melalui STDIN.

Ada versi alternatif yang digunakan whilealih-alih timestetapi apa pun yang saya coba, jumlah byte sama:

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
Martin Ender
sumber
3

CJam, 80 77 65 57 54 Karakter

Mungkin sama sekali tidak dioptimalkan, tetapi setelah banyak optimasi dan debugging di sini adalah konversi langsung dari jawaban ES6 saya di CJam:

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

Cobalah online di sini . Fungsi ini mengambil nomor sebagai STDIN dan menampilkan hitungan mundur daur ulang, berhenti di antara jika daur ulang selesai.

Saya akan mencoba untuk bermain golf lebih jauh.

Bagaimana itu bekerja:

Ide dasarnya adalah bahwa untuk setiap hitungan mundur C, periksa apakah digit H pertama sama dengan digit H terakhir dari string yang dihasilkan, di mana H beralih dari jumlah digit dalam C ke 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";
Pengoptimal
sumber
2

JavaScript ES6, 149 146 karakter

Seperti verbose, banyak karakter, wow.

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}

Jalankan di Konsol Web Firefox terbaru.

Setelah berjalan, itu menciptakan metode Cyang dapat Anda gunakan seperti

C(12)
12110987654321

UPDATE : Terkadang, plain old returnlebih pendek dari penutupan fungsi panah :)

Pengoptimal
sumber
Seharusnya tidak menampilkan angka apa yang didaur ulang, hanya urutan penghitungan mundur setelah daur ulang
haskeller bangga
Oh! Apakah itu ? Semua contohnya juga menghasilkan itu.
Pengoptimal
@proudhaskeller Oh, saya mengeluarkan karakter daur ulang juga. Terima kasih, itu akan menyelamatkan saya beberapa karakter.
PenutReaper