Najwyższe kości

19

Wyzwanie:

Oto pierwsze 100 pozycji w sekwencji:

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

Jak powstaje ta sekwencja? Najpierw mamy liczbę w zakresie [6, 1](wszystkie możliwe wartości jednej kości od najwyższej do najniższej). Następnie mamy liczby [66..61, 56..51, 46..41, 36..31, 26..21, 16..11](wszystkie możliwe skonkatowane wartości dwóch kości od najwyższej do najniższej). Itd.
Jest to związane z sekwencją OEIS A057436: Zawiera tylko cyfry od 1 do 6 , ale wszystkie liczby z jednakową liczbą cyfr posortowane są w kolejności w kolejności.

Wyzwanie polega na wybraniu jednej z tych trzech opcji dla funkcji / programu w powyższej kolejności:

  1. Weź wejściową wartość i wyślij -tą wartość tej sekwencji, gdzie może ona być indeksowana 0 lub indeksowana 1.nn
  2. Weź wejście i wyślij pierwsze lub wartości z tej sekwencji.nnn+1
  3. Wyjście wartości z sekwencji na czas nieokreślony.

Oczywiście można zastosować dowolny rozsądny format wyjściowy. Mogą być ciągami / liczbami całkowitymi / dziesiętnymi / itd .; może być jako (nieskończona) lista / tablica / strumień / itp .; może być wyprowadzany za pomocą spacji / przecinka / nowej linii / innego ogranicznika do STDOUT; itd. itd. Podaj w odpowiedzi, jakie I / O i opcję używasz!

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Do odpowiedzi mają zastosowanie standardowe reguły z domyślnymi regułami We / Wy , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i typem zwracanych, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione.
  • Jeśli to możliwe, dodaj link z testem kodu (tj. TIO ).
  • Zalecane jest również dodanie wyjaśnienia do odpowiedzi.

Oto kilka większych przypadków testowych, jeśli wybierzesz opcję 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
źródło
1
Zgodnie z sugerowaną edycją znacznik złożoności Kołmogorowa nie ma zastosowania do sekwencji, a jedynie do stałej, skończonej, stałej mocy wyjściowej. Sekwencja trwa wiecznie.
mbomb007
Oprócz tego, co powiedział @ mbomb007, zezwalam również na wyprowadzanie n-tej wartości lub pierwszych n / n + 1 wartości na podstawie danych wejściowych, podczas gdy wyzwania KC nigdy nie będą miały danych wejściowych.
Kevin Cruijssen

Odpowiedzi:

12

Perl 6 , 24 23 bajtów

-1 bajt dzięki nwellnhof

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

Wypróbuj online!

Zwraca ciąg nieskończenie oddzielony spacjami / znakami nowej linii. Lub, dla kilku kolejnych bajtów, możemy mieć leniwą nieskończoną listę, do której możemy indeksować zamiast tego.

Perl 6 , 27 bajtów

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

Wypróbuj online!

Wyjaśnienie:

{                         }    # 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
źródło
6

R , 43 bajty

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

Wypróbuj online!

Drukuje sekwencję w nieskończoność

  • -9 dzięki @Kirill L.
digEmAll
źródło
1
@ tk3: bez drugiego parametru połączy ostatnią wartość podsekwencji n-cyfrowych elementów, z pierwszą wartością podsekwencji n + 1 cyfrowych elementów. np.6 5 4 3 2 166 65 64...
digEmAll
6

Bash, 31 bajtów

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

TIO

aktualizacja z komentarzy, n-ta wartość 1-indeksowana, + narzędzia GNU + perl, 64 bajty, 7 bajtów zapisanych dzięki @manatwork

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

64 bajty

Nahuel Fouilleul
źródło
Nie pomaga wiele, ale w 2. rozwiązania jest krótszy uciec średnik ponad dwukrotnie powołując całego wyrażenia: bc<<<obase=6\;$1. Ale jeśli przełączy się dc, nie ma nic do ucieczki: dc<<<6o$1p.
manatwork
dzięki, rzeczywiście oszczędza 7 bajtów, ale z powodu numeracji bijective wciąż nie działa mix perl bash (66 bajtów)dc<<<6o$1p|perl -pe '1while s/(.)0/($1-1).6/e;s/0//'|tr 1-6 654321
Nahuel Fouilleul
5

MATL , 11 bajtów

`6:P!V@Z^DT

Podaje wartości w nieskończoność.

Wypróbuj online!

Wyjaśnienie

`      % 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
źródło
5

Haskell, 38 34 bajtów

Nieskończona lista liczb:

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

Wypróbuj online!

Dwa wcześniejsze rozwiązania, które dają nieskończone listy ciągów, każde zawierające 38 bajtów:

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

Wypróbuj online!

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

Wypróbuj online!

Christian Sievers
źródło
A 36; wersja bajtowa , oparta na twojej replicate.
dfeuer
5

JavaScript (ES6), 26 bajtów

n

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

Wypróbuj online!

Arnauld
źródło
5

Haskell , 28 bajtów

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

Wypróbuj online!

Tworzy nieskończoną listę liczb l. Używanie <$>i <*>odcięcie bajtu:

29 bajtów

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

Wypróbuj online!

Podejście jest podobne do stałego ciągu wejściowego „654321” odpowiedzi Haskell Output All String i pomijanie pustego ciągu wyjściowego poprzez zmianę miejsca, w którym jest poprzedzony.

30 bajtów

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

Wypróbuj online!

xnor
źródło
To wspaniale! Widziałem, że krócej jest zacząć od 0(lub ""), ale nie znalazłem taniego sposobu, aby nie uzyskać go w wyniku ...
Christian Sievers
4

05AB1E , 10 bajtów

Wysyła sekwencję w nieskończoność.

¸[6LRâJD»,

Wypróbuj online!

Wyjaśnienie

¸           # 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
źródło
1
Nigdy nie wiadomo ¸na początku tworzy listę zawierającą pusty ciąg znaków. I 2 bajty krótsze niż rozwiązanie, którego użyłem do wygenerowania przypadków testowych, więc oczywiście +1 ode mnie. :)
Kevin Cruijssen
3

Java (JDK) , 48 bajtów

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

Wypróbuj online!

To powoduje powrót 1 indeksowanych n ty element.

Wydaje się, że rekurencja pokonała iteracyjną lambda.


Wersja iteracyjna, 49 bajtów

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

Wypróbuj online!

Olivier Grégoire
źródło
3

Brachylog , 13 11 bajtów

Dzięki Fatalize za 2 bajty

6~d{⟧₁∋}ᵐẉ⊥

Wydaje na czas nieokreślony. Wypróbuj online!

n

Wyjaśnienie

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
źródło
Jesteś na liście Brachylog!
Fatalize
1
Można zapisać 2 bajty za pomocą pętli awarii napędzane, jak się je nazywa w Prologu: 6~d{⟧₁∋}ᵐẉ⊥. Zasadniczo kończysz swój program na „false”, co zmusi go do wydrukowania wszystkich rozwiązań.
Fatalize
OOH nieźle. Tak, bardzo mi się podobało!
DLosc
3

C # (.NET Core) , 38 bajtów

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

Wypróbuj online!

Zwraca n-tą wartość (na podstawie 1).

dana
źródło
Który to rozwiązuje?
Stackstuck
@Stackstuck - Podałem to w mojej odpowiedzi.
dana
1
O Boże! Nie pokrywamy się. Właśnie napisałem nieskończoną drukarkę.
Stackstuck
2

Japt, 14 bajtów

Musi istnieć krótsze rozwiązanie wykorzystujące metody funkcyjne i / lub produkt kartezjański, ale (na razie?) Najlepszym, którym mogę zarządzać, jest port rozwiązania JS Arnaulda, więc też go oceń.

©ß´Uz6)s+6-Uu6

Wypróbuj lub przetestuj warunki0-1000

Kudłaty
źródło
2

Wolfram Language (Mathematica) , 88 78 bajtów

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

Wypróbuj online!

zaoszczędzono 4 + 6 bajtów dzięki @IanMiller

Lista jest indeksowana 1, zwraca numer n-ty.

Kai
źródło
1
Możesz zastąpić Zasięg [6,1, -1] 7-Zasięg @ 6, aby zapisać 4 znaki
Ian Miller
1
W przypadku reguł codegolf możesz również napisać go jako funkcję anonimową: (l = d = c = 7-zakres @ 6; Podczas gdy [Długość @ c <#, d = Spłaszcz [(10 # + l) & / @ d]; c = c ~ Dołącz ~ d;]; c [[#]]) &
Ian Miller
@IanMiller dzięki! Nie byłem pewien, jakie są zasady dotyczące formatu.
Kai
2

Mathematica, 56 bajtów

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

65(6n1)

Ian Miller
źródło
+1, to monstrualna przesada, ale działa doskonale dla zwięzłości!
Kai
@JonathanFrech Dzięki za naprawienie mojego mathjaxa. Nie byłem pewien, jak go aktywować tutaj jak jego nieco inna, że math.se
Ian Miller
Pamiętaj, że oryginalna edycja została wykonana przez tego użytkownika .
Jonathan Frech
Ups, mój zły. Dzięki również @ geza-kerecsenyi.
Ian Miller
1

Pip -l , 16 bajtów

x:YP6-,6W1PxCP:y

Wysyła sekwencję bez końca. Wypróbuj online!

Wyjaśnienie

Te -lśrodki flag że listy są drukowane z każdej pozycji z własnej linii; jeśli element sam jest listą, jego elementy są łączone bez separatora. Np. Lista [1 [2 3] [4 [5 6]]]zostanie wydrukowana jako

1
23
456

Po wyjaśnieniu:

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

Po pierwszej iteracji pętli xwygląda następująco [[6;6];[6;5];[6;4];...;[1;1]]; po drugiej iteracji [[[6;6];6];[[6;6];5];[[6;6];4];...;[[1;1];1]]; i tak dalej. Nie musimy się martwić spłaszczeniem list odtwarzania, ponieważ -lskutecznie robi to za nas.

DLosc
źródło
1

Węgiel drzewny , 18 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. 1-indeksowany. Wyjaśnienie:

Nθ

Wejście n

Wθ«

Powtarzaj aż do nzera.

←I⊕﹪±θ⁶

Zmniejsz -nmodulo 6, a następnie zwiększ wynik i wynik od prawej do lewej.

≔÷⊖θ⁶θ

Zmniejszenie ni liczba całkowita dzielą go przez 6.

Neil
źródło
1

Retina 0.8.2 , 36 bajtów

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

Wypróbuj online! Link zawiera przypadki testowe. 1-indeksowany. Wyjaśnienie:

.+
$*_

Konwertuj na unary. (Retina 1 zapisałaby tutaj 2 bajty.)

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

Konwertuj na bijective base 6 powtarzając divmod. Zauważ, że użycie +oznacza, że ​​wyodrębniona cyfra jest zawsze liczbą od 1 do 6 zamiast 0 do 5 dla zwykłej konwersji podstawy 6. ( (_{6})*jest szybszy, ale kosztuje wyodrębnienie ilorazu).

T`7-1`d

Transponuj cyfry, aby szóste były pierwsze, a jedne ostatnie. (Nie ma 7 lub 0, ale pozwala mi to użyć dskrótu.

Neil
źródło
1

Cubix , 22 bajty

Spowoduje to wygenerowanie sekwencji w nieskończoność. Ogólna idea jest taka, że ​​ma numer bazowy, do którego dodaje się 6-1. Dla każdego dodania wynik jest mnożony przez 10, który jest wypychany na dół stosu i używany później w sekwencji. Baza jest następnie otwierana i rozpoczyna się kolejna baza.

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

Wypróbuj online!

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

Watch It Run

MickyT
źródło
1

C # (.NET Core) , nieskończone drukowanie, 181 180 88 bajtów.

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;}

Niestety zawiesza repl.it zamiast poprawnie wyświetlać dane w nieskończonej wersji, tak jak napisano (uważam, że jest to błąd w repl.it, ponieważ nie wyświetla się tak, jak program zapętla się tak, jak powinien), więc każdy, kto chce przetestować, potrzebuje komputer. Jeśli dodasz odczyt z przodu pętli, działa to również w repl.it.

Oczywiście dane wyjściowe do konsoli.

W każdym skończonym systemie kod najprawdopodobniej ostatecznie się zawiesi z błędem braku pamięci.

Przerobiono kod, aby używał 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)+" ");

Wypróbuj online!

Stackstuck
źródło
Nie mam pojęcia, czy dobrze grałem w golfa, czy nie.
Stackstuck
Zapisano jeden bajt, usuwając niepotrzebne k ++.
Stackstuck
(również bardzo się cieszę z gry w golfa, jestem zupełnie nowy).
Stackstuck
2
Witamy :) Jeśli jesteś zainteresowany grą w golfa w C #, możesz sprawdzić ten post, aby uzyskać kilka wskazówek: codegolf.stackexchange.com/q/173/8340
dana
1

Naprzód (gforth) , 63 bajty

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

Wypróbuj online!

Wyjścia indeksowane 0, n-ta wartość

Wyjaśnienie

Jeśli N jest mniejsze niż 6, wypisz wartość bezwzględną N - 6. W przeciwnym razie uzyskaj iloraz i pozostałą część dzielenia N przez 6. Wywołaj funkcję rekurencyjnie na ilorazie, a następnie wywołaj ją na pozostałej części.

Objaśnienie kodu

: 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
źródło
1

APL (NARS), 27 znaków, 54 bajty

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

rozwiń rozwiązanie przez dana /codegolf//a/179980 w 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
źródło
0

C #, drukuj od początku do n, ??? bajty

Podziękowania dla @dana za wyrażenie 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)+" ");

Operacja: Uruchom z 0 argumentem wiersza poleceń równym liczbie całkowitej, do której chcesz policzyć. (Należy zauważyć, że a[0]jest to odwołanie do niewymienionej tablicy wierszy poleceń i nie wiem, jak ją policzyć).

Stackstuck
źródło
Ponieważ część kodu jest snajperem zamiast pełnego programu lub funkcji, zakładam, że używasz kompilatora Visual C # Interactive? Czy możesz dodać link Wypróbuj online z kodem testowym? PS: Twój aktualny licznik bajtów to 102
Kevin Cruijssen
Cholera, to nie działa, do cholery .
Stackstuck