Dadu Tertinggi

19

Tantangan:

Di sini kita memiliki 100 item pertama secara berurutan:

6,5,4,3,2,1,66,65,64,63,62,61,56,55,54,53,52,51,46,45,44,43,42,41,36,35,34,33,32,31,26,25,24,23,22,21,16,15,14,13,12,11,666,665,664,663,662,661,656,655,654,653,652,651,646,645,644,643,642,641,636,635,634,633,632,631,626,625,624,623,622,621,616,615,614,613,612,611,566,565,564,563,562,561,556,555,554,553,552,551,546,545,544,543,542,541,536,535,534,533,...

Bagaimana urutan ini terbentuk? Kami pertama-tama memiliki angka dalam kisaran [6, 1](semua nilai yang mungkin dari satu die dari tertinggi ke terendah). Kami kemudian memiliki angka-angka [66..61, 56..51, 46..41, 36..31, 26..21, 16..11](semua nilai yang memungkinkan dari dua dadu dari tertinggi ke terendah). Dll.
Ini terkait dengan urutan OEIS A057436: Berisi hanya angka 1 hingga 6 , tetapi dengan semua angka dengan jumlah angka yang sama diurutkan mundur dalam urutan.

Tantangannya adalah memilih salah satu dari tiga opsi ini untuk fungsi / program Anda dengan urutan di atas:

  1. Ambil input dan output nilai ke- dari urutan ini, yang dapat berupa indeks-0 atau indeks-1.nn
  2. Ambil input dan output nilai pertama atau dari urutan ini.nnn+1
  3. Keluarkan nilai dari urutan tanpa batas.

Tentu saja, format output apa pun yang wajar dapat digunakan. Bisa berupa string / integer / desimal / dll .; dapat berupa daftar (array) / aliran / etc / (tak terbatas); bisa berupa output dengan spasi / koma / baris baru / pembatas lainnya untuk STDOUT; dll. Silakan sebutkan apa yang saya / O dan opsi yang Anda gunakan dalam jawaban Anda!

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa saja'.
  • Aturan standar berlaku untuk jawaban Anda dengan aturan I / O default , sehingga Anda diizinkan untuk menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program penuh. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda (yaitu TIO ).
  • Juga, menambahkan penjelasan untuk jawaban Anda sangat dianjurkan.

Berikut beberapa kasus uji yang lebih besar jika Anda memilih opsi 1:

n         0-indexed output    1-indexed output

500       5624                5625
750       4526                4531
1000      3432                3433
9329      11111               11112
9330      666666              11111
9331      666665              666666
10000     663632              663633
100000    6131232             6131233
Kevin Cruijssen
sumber
1
Per edit yang disarankan, tag kompleksitas kolmogorov tidak berlaku untuk urutan, hanya untuk output yang konstan, terbatas, tetap. Urutan berlangsung selamanya.
mbomb007
Selain apa yang dikatakan @ mbomb007, saya juga mengizinkan menampilkan nilai ke-n atau nilai-nilai pertama n / n + 1 berdasarkan input, sedangkan tantangan KC tidak akan pernah memiliki input.
Kevin Cruijssen

Jawaban:

12

Perl 6 , 24 23 byte

-1 byte terima kasih kepada nwellnhof

{.put;.[]X~(6...1)}...*

Cobalah online!

Menghasilkan urutan yang terpisah jauh oleh spasi / baris baru. Atau, untuk beberapa byte lagi kita dapat memiliki daftar malas yang tak terbatas yang dapat kita indeks.

Perl 6 , 27 byte

{flat {@=.[]X~(6...1)}...*}

Cobalah online!

Penjelasan:

{                         }    # Anonymous code block
 flat                          # Return the flattened
                      ...*       # Infinite sequence
      {              }             # Defined as
         .[]                       # The previous element arrayified
            X~                     # Each concatenated with
              (6...1)              # All of 6 to 1
       @=                          # Arrayified
Jo King
sumber
6

R , 43 byte

p='';repeat cat(p<-sapply(p,paste0,6:1),'')

Cobalah online!

Mencetak urutan tanpa batas

  • -9 terima kasih kepada @ Kirill L.
menggali semua
sumber
1
@ tk3: tanpa parameter kedua akan menyatukan nilai terakhir dari sub-urutan elemen n-digit, dengan nilai pertama dari sub-urutan elemen n + 1 digit. misalnya6 5 4 3 2 166 65 64...
digEmAll
6

Bash, 31 byte

f()(x+={6..1};eval echo $x;f);f

TIO

pembaruan dari komentar, nilai ke-1 diindeks, + alat GNU + perl, 64 byte, 7 byte disimpan berkat @manatwork

dc<<<6o$1p|perl -pe 's/(.)0/($1-1).6/e?redo:s/0//'|tr 1-6 654321

64 byte

Nahuel Fouilleul
sumber
Tidak membantu banyak, tetapi dalam larutan 2 lebih pendek untuk melarikan diri dari koma dari dua kali lipat mengutip seluruh ekspresi: bc<<<obase=6\;$1. Tapi jika Anda beralih ke dc, tidak ada yang melarikan diri: dc<<<6o$1p.
manatwork
terima kasih memang menghemat 7bytes tetapi karena penomoran bijective itu masih tidak bekerja perl campuran bash (66bytes)dc<<<6o$1p|perl -pe '1while s/(.)0/($1-1).6/e;s/0//'|tr 1-6 654321
Nahuel Fouilleul
5

MATL , 11 byte

`6:P!V@Z^DT

Menghasilkan nilai tanpa batas.

Cobalah online!

Penjelasan

`      % Do...while
  6:   %   Push [1 2 3 4 5 6]
  P    %   Flip: gives [6 5 4 3 2 1]
  !    %   Transpose: turns the row vector into a column vector
  V    %   Convert the number in each row to the corresponding char
  @    %   Push current iteration index, starting from 1
  Z^   %   Cartesian power. Gives a matrix where each row is a Cartesian tuple
  D    %   Display immediately
  T    %   Push true. This is used as loop condition, to give an infinite loop
       % End (implicit)
Luis Mendo
sumber
5

Haskell, 38 34 byte

Daftar angka yang tak terbatas:

d=[6,5..1]
l=d++[10*m+n|m<-l,n<-d]

Cobalah online!

Dua solusi sebelumnya yang memberikan daftar string tanpa batas, masing-masing menggunakan 38 byte:

[1..]>>=sequence.(`replicate`"654321")

Cobalah online!

do n<-[1..];mapM id$[1..n]>>["654321"]

Cobalah online!

Sievers Kristen
sumber
A 36; versi byte , berdasarkan versi Anda replicate.
dfeuer
5

JavaScript (ES6), 26 byte

n

f=n=>n--&&[f(n/6|0)]+6-n%6

Cobalah online!

Arnauld
sumber
5

Haskell , 28 byte

l=(+).(10*)<$>0:l<*>[6,5..1]

Cobalah online!

Menghasilkan daftar angka yang tak terbatas l. Menggunakan <$>dan <*>memotong byte:

29 byte

l=[10*n+d|n<-0:l,d<-[6,5..1]]

Cobalah online!

Pendekatannya mirip dengan Haskell Output All String menjawab string input tetap "654321", dan melewatkan output string kosong dengan mengubah di mana ia ditempatkan.

30 byte

l=[n++[d]|n<-"":l,d<-"654321"]

Cobalah online!

Tidak
sumber
Itu keren! Saya melihat ini lebih pendek untuk memulai 0(atau ""), tetapi tidak menemukan cara yang murah untuk tidak memilikinya dalam hasilnya ...
Christian Sievers
4

05AB1E , 10 byte

Output urutan tanpa batas.

¸[6LRâJD»,

Cobalah online!

Penjelasan

¸           # initialize the stack with a list containing the empty string
 [          # loop
  6L        # push [1 ... 6]
    R       # reverse
     â      # cartesian product
      J     # join each inner list
       D    # duplicate (saving a copy for next iteration)
        »,  # join on newline and print
Emigna
sumber
1
Tidak pernah tahu ¸pada awalnya membuat daftar yang berisi string kosong. Dan 2 byte lebih pendek dari solusi yang saya gunakan untuk menghasilkan kasus uji, jadi tentu saja +1 dari saya. :)
Kevin Cruijssen
4

Perl 5, 40 37 byte

-3bytes terima kasih kepada @Xcali

map{say}<"$_">while s//{6,5,4,3,2,1}/

37 byte

40 byte

Nahuel Fouilleul
sumber
37 byte
Xcali
Penggunaan glob yang brilian. +1
msh210
3

Java (JDK) , 48 byte

String f(int n){return n-->0?f(n/6)+(6-n%6):"";}

Cobalah online!

Ini mengembalikan elemen ke -1 yang diindeks .

Rekursi tampaknya mengalahkan lambda iteratif.


Versi berulang, 49 byte

n->{var r="";for(;n-->0;n/=6)r=6-n%6+r;return r;}

Cobalah online!

Olivier Grégoire
sumber
3

Brachylog , 13 11 byte

Terima kasih untuk Fatalize selama 2 byte

6~d{⟧₁∋}ᵐẉ⊥

Output tanpa batas. Cobalah online!

n

Penjelasan

6~d           Start with a number, all of whose digits are 6's
              Brachylog considers these in the order 6, 66, 666, 6666...
   {   }ᵐ     Map this predicate to each of those digits:
    ⟧₁         1-based reverse range: [6,5,4,3,2,1]
      ∋        The output digit must be a number in that range
              Brachylog considers possible outputs in this order: 6, 5, 4, 3, 2, 1, 66, 65...
         ẉ    Write a possible output with newline
          ⊥   Force the predicate to fail and backtrack to the next possibility
DLosc
sumber
Anda berada di daftar Brachylog!
Fatalkan
1
Anda dapat menyimpan 2 byte dengan menggunakan loop kegagalan-didorong, seperti yang disebut dalam Prolog: 6~d{⟧₁∋}ᵐẉ⊥. Anda pada dasarnya mengakhiri program Anda dengan "false" yang akan memaksanya untuk mencetak semua solusi.
Fatalkan
Ooh bagus Ya, saya sangat menikmatinya!
DLosc
3

C # (.NET Core) , 38 byte

int f(int n)=>n-->0?f(n/6)*10+6-n%6:0;

Cobalah online!

Menghasilkan nilai ke-n (berbasis 1).

dana
sumber
Yang mana pemecahan ini?
Stackstuck
@Stackstuck - Sekarang saya telah menentukan ini dalam jawaban saya.
dana
1
Oh bagus! Kami tidak tumpang tindih. Saya baru saja menulis printer tanpa batas.
Stackstuck
2

Japt, 14 byte

Pasti ada solusi yang lebih pendek menggunakan metode fungsi dan / atau produk Cartesian tapi (untuk saat ini?) Yang terbaik yang bisa saya kelola adalah port dari solusi JS Arnauld jadi pastikan untuk membesarkannya juga.

©ß´Uz6)s+6-Uu6

Cobalah atau uji persyaratan0-1000

Shaggy
sumber
2

Bahasa Wolfram (Mathematica) , 88 78 byte

(l=d=c=7-Range@6;While[Length@c<#,d=Flatten[(10#+l)&/@d];c=c~Join~d;];c[[#]])&

Cobalah online!

disimpan 4 + 6 byte berkat @IanMiller

Daftar diindeks 1, menampilkan nomor kesembilan.

Kai
sumber
1
Anda dapat mengganti Rentang [6,1, -1] dengan 7-Rentang @ 6 untuk menyimpan 4 karakter
Ian Miller
1
Untuk aturan codegolf Anda juga dapat menuliskannya sebagai fungsi anonim: (l = d = c = 7-Range @ 6; Sementara [Panjang @ c <#, d = Meratakan [(10 # + l) & / @ d]; c = c ~ Bergabunglah ~ d;]; c [[#]]) &
Ian Miller
@IanMiller terima kasih! Saya tidak yakin apa aturannya tentang format.
Kai
2

Mathematica, 56 byte

Flatten[FromDigits/@Tuples[7-Range@6,#]&/@Range@#][[#]]&

Membutuhkan jumlah memori yang berlebihan untuk benar-benar berjalan karena ia menciptakan semua angka dalam urutan yang memiliki panjang sama dengan atau kurang dari input (yaitu ia menciptakan 65(6n1) istilah) kemudian mengambil nilai yang diperlukan dari daftar. Untuk praktik, gunakan ganti # terakhir kedua dengan nilai spesifik untuk panjangnya Anda ingin menggunakannya.

Ian Miller
sumber
+1, itu berlebihan berlebihan tetapi bekerja dengan sempurna untuk singkatnya!
Kai
@JonathanFrech Terima kasih telah memperbaiki mathjax saya. Saya tidak yakin bagaimana mengaktifkannya di sini karena matematika itu sedikit berbeda.se
Ian Miller
Harap perhatikan bahwa hasil edit asli adalah oleh pengguna ini .
Jonathan Frech
Aduh, salahku. Terima kasih kepada @ geza-kerecsenyi juga.
Ian Miller
1

Pip -l , 16 byte

x:YP6-,6W1PxCP:y

Output urutan tanpa batas. Cobalah online!

Penjelasan

The -lbendera berarti bahwa daftar dicetak dengan setiap item pada baris sendiri; jika suatu item adalah daftar, elemen-elemennya digabungkan tanpa pemisah. Misalnya daftar [1 [2 3] [4 [5 6]]]akan dicetak sebagai

1
23
456

Dengan itu dibersihkan:

x:YP6-,6W1PxCP:y
      ,6          Range(6): [0 1 2 3 4 5]
    6-            Subtract each element from 6: [6 5 4 3 2 1]
  YP              Yank that value into the y variable, and also print it
x:                Assign that value also to x
        W1        While 1 (infinite loop):
           xCP:    Assign to x the cartesian product of x with
               y   the list [6 5 4 3 2 1]
          P        Print it

Setelah iterasi loop pertama, xterlihat seperti [[6;6];[6;5];[6;4];...;[1;1]]; setelah iterasi kedua, [[[6;6];6];[[6;6];5];[[6;6];4];...;[[1;1];1]]; dan seterusnya. Kita tidak perlu khawatir tentang meratakan sublists, karena -lsecara efektif melakukannya untuk kita.

DLosc
sumber
1

Arang , 18 byte

NθWθ«←I⊕﹪±θ⁶≔÷⊖θ⁶θ

Cobalah online! Tautan adalah untuk mengucapkan versi kode. 1-diindeks. Penjelasan:

Nθ

Memasukkan n

Wθ«

Ulangi sampai nnol.

←I⊕﹪±θ⁶

Kurangi -nmodulo 6, lalu tambahkan hasilnya dan output dari kanan ke kiri.

≔÷⊖θ⁶θ

Decrement ndan integer membaginya dengan 6.

Neil
sumber
1

Retina 0.8.2 , 36 byte

.+
$*_
+`(_*)\1{5}(_+)
$1$.2
T`7-1`d

Cobalah online! Tautan termasuk kasus uji. 1-diindeks. Penjelasan:

.+
$*_

Konversikan ke unary. (Retina 1 akan menghemat 2 byte di sini.)

+`(_*)\1{5}(_+)
$1$.2

Konversikan ke basis 6 kata demi kata dengan divmod berulang. Perhatikan bahwa penggunaan +berarti bahwa digit yang diekstraksi selalu berupa angka dari 1 hingga 6 bukannya 0 hingga 5 untuk konversi basis 6 biasa. ( (_{6})*lebih cepat tetapi biaya byte mengekstraksi hasil bagi.)

T`7-1`d

Atur ulang digit sehingga 6s menjadi yang pertama dan yang terakhir. (Tidak ada 7 atau 0 tetapi ini memungkinkan saya untuk menggunakan jalan dpintas.

Neil
sumber
1

Cubix , 22 byte

Ini akan menampilkan urutan tanpa batas. Gagasan umum adalah bahwa ia memiliki nomor dasar yang ditambahkan 6-1. Untuk setiap penambahan hasilnya adalah keluaran dikalikan dengan 10, yang didorong ke bagian bawah tumpukan untuk digunakan kemudian dalam urutan. Basis kemudian muncul dan basis berikutnya dimulai.

..w.06+ONo*w;|uW!(pq;;

Cobalah online!

    . .
    w .
0 6 + O N o * w
; | u W ! ( p q
    ; ;
    . .

Tonton Jalankan

MickyT
sumber
1

C # (.NET Core) , pencetakan tanpa batas, 181 180 88 byte.

string[] s=new string[]{" "},t;int i,j,k,l=1;while(true){j=l;t=new string[l=6*j];for(i=6;i>0;i--)for(k=(6-i)*j;k<l;)t[k]=i+s[k++%j];
for(k=0;k<l;)System.Console.Write(t[k++]);s=t;}

Sayangnya itu membeku repl.it bukannya menghasilkan dengan benar dalam versi tak terbatas seperti yang ditulis (saya percaya itu menjadi kesalahan di repl.it, karena tidak menghasilkan seperti program loop seperti seharusnya), jadi siapa pun yang berharap untuk menguji perlu sebuah komputer. Jika Anda menambahkan bacaan di bagian depan loop, itu juga berfungsi di repl.it.

Keluaran ke konsol, jelas.

Pada sistem apa pun yang terbatas kode kemungkinan besar pada akhirnya akan crash dengan kesalahan kehabisan memori.

Mengolah kode untuk menggunakan lambda @dana.

int f(int n)=>n-->0?f(n/6)*10+6-n%6:0;for(int i=0;++i>0;)System.Console.Write(f(i)+" ");

Cobalah online!

Stackstuck
sumber
Saya tidak tahu apakah saya bermain golf dengan baik atau tidak.
Stackstuck
Disimpan satu byte dengan menghapus k ++ yang tidak perlu.
Stackstuck
(juga, saya sangat menyambut bantuan golf, saya sangat baru dalam hal ini.)
Stackstuck
2
Selamat datang :) Jika Anda tertarik untuk bermain golf di C #, Anda mungkin ingin memeriksa posting ini untuk beberapa tips: codegolf.stackexchange.com/q/173/8340
dana
1

Keempat (gforth) , 63 byte

: f recursive dup 6 < if 6 - abs 1 .r else 6 /mod 1- f f then ;

Cobalah online!

0-indexed menghasilkan nilai n

Penjelasan

Jika N kurang dari 6, hasilkan nilai absolut N - 6. Jika tidak, dapatkan hasil bagi dan sisa pembagian N dengan 6. Panggil fungsi secara berulang pada hasil bagi, kemudian panggil di sisanya.

Penjelasan Kode

: f                 \ start a new word definition
  recursive         \ declare that this word is recursive so we can call it from itself
  dup 6 <           \ check if n is less than 6
  if                \ if it is:
    6 - abs 1 .r    \ subtract 6, get the absolute value, then print with no appended space
  else              \ else if it's greater than 6:
    6 /mod          \ get the quotient and remainder of dividing n by 6
    1-              \ subtract 1 from the quotient (because we're 0-indexed)
    f               \ call f on the result
    f               \ call f on the remainder (shortcut to format and print, it's always < 6)
  then              \ end the if/else
;                   \ end the word definition
reffu
sumber
1

APL (NARS), 27 karakter, 54 byte

{0>⍵-←1:0⋄(6-6∣⍵)+10×∇⌊⍵÷6}

traslate solusinya dengan dana /codegolf//a/179980 di APL ... test:

  f←{0>⍵-←1:0⋄(6-6∣⍵)+10×∇⌊⍵÷6}
  f 500
5625
  f¨750 1000 9329 9331 10000 100000
4531 3433 11112 666666 663633 6131233 
  f¨⍳9
6 5 4 3 2 1 66 65 64 
RosLuP
sumber
0

C #, cetak dari awal ke n, ??? byte

Kredit ke @dana untuk ekspresi lambda.

int f(int n)=>n-->0?f(n/6)*10+6-n%6:0;for(int i=0;i<int.Parse(a[0]);)System.Console.Write(f(++i)+" ");

Operasi: Jalankan dengan argumen baris perintah 0 sama dengan bilangan bulat yang ingin Anda hitung. (Perlu dicatat bahwa a[0]ini adalah referensi ke array args baris perintah yang tidak disebutkan, dan saya tidak tahu bagaimana cara menghitungnya.)

Stackstuck
sumber
Karena bagian dari kode adalah snipper alih-alih program atau fungsi lengkap, saya menganggap Anda menggunakan Visual C # Interactive Compiler? Bisakah Anda menambahkan tautan Coba online dengan kode tes? NB: Penghitungan byte Anda saat ini adalah 102
Kevin Cruijssen
ah sial itu tidak bekerja apa- apaan ini .
Stackstuck