Malejące sekwencje cyfr

16

Wprowadzenie

Jako przykład weźmy liczbę 7 . Następnie powielamy to i umieszczamy między nimi 7 spacji. Otrzymujemy to:

7_______7

Następnie będziemy zmniejszać liczbę, dopóki nie pozostaną wolne miejsca. Otrzymujemy następujące liczby 7:

7_______7    
 6543210

Następnie po prostu łączymy oba z nich, więc:

7_______7    
 6543210  becomes

765432107

To będzie wyjście dla N = 7 .

Wygląda łatwo, prawda? Teraz weźmy N = 12 . Ponownie wstawiamy 12 spacji między dwiema liczbami, co daje nam:

12____________12

Następnie rozpoczynamy zmniejszanie:

12____________12
  111098765432

I to w końcu daje nam:

1211109876543212

Jak widać część opadająca kończy się na 2, a nie na 0 .

Zadanie

Biorąc pod uwagę liczbę całkowitą większą niż 1 , wypisz malejącą sekwencję, jak pokazano powyżej.

Przypadki testowe

Input   Output

2       2102
3       32103
4       432104
5       5432105
6       65432106
7       765432107
8       8765432108
9       98765432109
10      10987654321010
11      111098765432111
12      1211109876543212
13      13121110987654313
14      141312111098765414
15      1514131211109876515
20      201918171615141312111020
99      9998979695949392919089888786858483828180797877767574737271706968676665646362616059585756555453525150499
100     1009998979695949392919089888786858483828180797877767574737271706968676665646362616059585756555453525150100

To jest , więc wygrywa zgłoszenie z najmniejszą liczbą bajtów!

Adnan
źródło
Wewnętrzna przestrzeń musi być wypełniona liczbami całkowitymi, czy w razie potrzeby powinniśmy posiekać liczby? Nie ma na to przypadku testowego (na przykład 99)
edc65
@ edc65 W razie potrzeby posiekaj liczby. Dodałem 99 jako przypadek testowy.
Adnan

Odpowiedzi:

8

CJam, 11 10 bajtów

q4*~,W%s<\

Wypróbuj online.Zakłada, że ​​na wejściu znajduje się końcowy znak nowej linii. (Dzięki @ jimmy23013 za zapisanie bajtu.)

Wyjaśnienie

Na końcu każdej linii jest wygląd stosu w tym momencie ( 4na przykładzie).

q4*  e# Push input x 4 times, separated by newlines. ["4\n4\n4\n4\n"]
~    e# Evaluate, separating the 4's and converting them to numbers. [4 4 4 4]
,W%  e# Take the range of x and reverse it. [4 4 4 [3 2 1 0]]
s<   e# Cast to string and take the first x characters. [4 4 "3210"]
\    e# Swap the top two to get the final result. [4 "3210" 4]
NinjaBearMonkey
źródło
9

Julia, 30 bajtów

n->"$n"join(n-1:-1:0)[1:n]"$n"

Jest to anonimowa funkcja, która przyjmuje liczbę całkowitą i zwraca ciąg znaków. Aby go wywołać, przypisz go do zmiennej.

Konstruujemy i łączymy malejącą sekwencję od n -1 do 0 i bierzemy pierwszą n znaków z otrzymanego ciągu. Dołączamy i dołączamy to z wejściem jako ciąg.

Sprawdź wszystkie przypadki testowe online

Alex A.
źródło
5

Haskell, 44 bajty

s=show
f n=s n++take n(s=<<[n-1,n-2..])++s n

Przykład użycia: f 14-> "141312111098765414".

nimi
źródło
5

JavaScript (ES6), 55 52 bajtów

n=>n+[...Array(m=n)].map(_=>--m).join``.slice(0,n)+n

Edycja: Zapisano 3 bajty dzięki @WashingtonGuedes.

Neil
źródło
@WashingtonGuedes Bah, nigdy nie wydaje się, aby korzystać .keys().
Neil
.keys()jest jak .reduce. Odpowiednie narzędzie do pracy, ale zawsze znajdziesz coś, co da się lepiej w tym konkretnym przypadku
edc65
4

Python 2, 82 72 58 53 bajtów

lambda x:`x`+''.join(map(str,range(x)[::-1]))[:x]+`x`

Wypróbuj tutaj!

Dzięki @Alex za nauczenie mnie, że repr(x)= `x`oszczędza mi mnóstwo bajtów!

Denker
źródło
3

Pyth, 11 bajtów

++Q<jk_UQQQ

Dwie alternatywne wersje, z których wszystkie mają również 11 bajtów ( westchnienie ):

s[Q<jk_UQQQ
pQp<jk_UQQQ
  Q           the input
       UQ     [0, 1, ..., input-2, input-1]
      _       reverse
    jk        join on empty string
   <     Q    first (input) characters
          Q   the input again
++            concatenate everything so it prints on one line

Wypróbuj tutaj.

Klamka
źródło
3

Japt, 13 bajtów

U+Uo w ¬¯U +U

Przetestuj online!

Jak to działa

               // Implicit: U = input integer
  Uo           // Create the range [0..U).
     w         // Reverse.
       ¬       // Join.
        ¯U     // Slice to the first U chars.
U+         +U  // Append U on either end.
ETHprodukcje
źródło
3

Galaretka, 10 bajtów

Ȯ’r0DFḣ³Ḍ³

Wypróbuj online!

Jak to działa

Ȯ’r0DFḣ³Ḍ³  Main link. Input: n

Ȯ           Print n.
 ’          Decrement to yield n - 1.
  r0        Create a range from n - 1 to 0.
    D       Convert each integer to base 10 (array of decimal digits).
     F      Flatten the resulting array.
      ḣ³    Keep the first n elements.
        Ḍ   Convert from base 10 to integer.
         ³  Print the integer and set the return value to n.
            (implicit) Print the return value.
Dennis
źródło
2

Vitsy, 35 bajtów

Ponieważ Vitsy nie wie, jak tworzyć ciągi z liczb, zaimplementowałem wyszukiwanie długości liczby w miejscach dziesiętnych w drugim wierszu.

V0VVNHVv[XDN1mv$-DvD);]VN
1a/+aL_1+

Wyjaśnienie:

V0VVNHVv[XDN1mv$-DvD);]VN
V                          Save the input as a global final variable.
 0V                        Push 0, push input.
   VN                      Output the input.
     H                     Push the range 0...intput.
      Vv                   Push the input, then save it as a temp variable.
        [             ]    Do the stuff in brackets infinitely or until exited.
         X                 Remove the top item of the stack.
          DN               Duplicate, then pop as output.
            1m             Calls the first line index, retrieving length.
              v            Pop the temp var and push it to the stack.
               $           Switch the top two items of the stack. 
                -          Subtract them.
                 Dv        Duplicate, then pop one as a temp var.
                   D);     If it's zero, exit the loop.
                       VN  Output the global var.

1a/+aL_1+
1a/+       Add .1. This makes sure we don't throw errors on input 0.
    a      Push ten.
     L     Pop the top item as n, push the log base n of second to top.
      _    Make it an int.
       1+  Add 1.

Wypróbuj online!

Tryb pełny dla loli:

save top as permanent variable;
push 0;
save top as permanent variable;
save top as permanent variable;
output top as number;
push all ints between second to top and top;
save top as permanent variable;
save top as temporary variable;
begin recursive area;
remove top;
duplicate top item;
output top as number;
push 1;
goto top method;
save top as temporary variable;
switch the top two items;
subtract top two;
duplicate top item;
save top as temporary variable;
duplicate top item;
if (int) top is not 0;
generic exit;
end recursive area;
save top as permanent variable;
output top as number;
:push 1;
push 10;
divide top two;
add top two;
push 10;
push ln(top);
replace top with int(top);
push 1;
add top two;
Addison Crump
źródło
Wygląda na to, że tryb gadatliwy jest niepoprawny w definicji L, naprawiając to teraz (jednak nie zaktualizuje pytania).
Addison Crump
Ciekawe, jak można zapobiec wykonaniu tej metody na końcu programu? Czy znak nowej linii jest sygnałem do powrotu / wyjścia z programu?
LegionMammal978
@ LegionMammal978 Wyobraź sobie, że pierwszy wiersz każdego programu Vitsy jest metodą „główną”, a wszystkie pozostałe wiersze są public static voidmetodami. Główny kończy program po jego zakończeniu. Jeśli chodzi o to, jak to robi, instrukcje są przechowywane w rodzaju ArrayList<ArrayList<String[]>>, w którym każda linia to String[]. Każda metoda jest podzielona w nowym wierszu według sposobu ładowania pliku, co powoduje oddzielenie głównej metody od wszystkich innych metod.
Addison Crump
To wyjaśnia, dlaczego potrzebne są trzy poziomy. Więc Strings są instrukcjami, String[]s są metodami (pierwsza to metoda główna), a ArrayList<String[]>s są klasami (pierwsza to klasa główna), prawda?
LegionMammal978
@ LegionMammal978 To wszystko prawda. :)
Addison Crump
2

Pure Bash, 49

eval printf -va %s {$[$1-1]..0}
echo $1${a::$1}$1

Lub:

Bash + coreutils, 48

echo $1$(seq $[$1-1] -1 0|tr -d \\n|head -c$1)$1
Cyfrowa trauma
źródło
Nie jestem pewien, czy prawidłowo oceniają zasięg. Po przetestowaniu oba drukują tylko połowę zakresu. tj. dla 1 $ = 90, zakres jest tylko do 45. Mój wysiłek był "dla i w $ (eval echo {1..0}); wykonaj echo -n $ i; gotowe; echo 1 $"
rcjohnson
@rcjohnson Myślę, że jest to wymagane zachowanie. Jaka jest oczekiwana wartość wyjściowa dla N = 90?
Cyfrowa trauma
@rcjohnson np. dla N = 12, wynik powinien wynosić 12, następnie pierwsze 12 znaków 11..0(lub 111098765432), a następnie12
Digital Trauma
Po ponownym przeczytaniu opisu widzę, że masz rację. Problem mówi, że „spacje” nie są liczbami całkowitymi.
rcjohnson
@rcjohnson Tak, myślę, że część „spacje” dotyczy tylko kroków pośrednich. Końcowy wynik powinien być tylko ciągiem cyfr.
Cyfrowa trauma
2

Siatkówka, 63 bajty

.+
$0,y$0$*y$0$*x
x
$'_
(x)*_
$#1
+`(y+)y(.)
$2$1
,(\d+).*
$1$`

Jest jeszcze sporo miejsca na grę w golfa ...

Wypróbuj online!

randomra
źródło
Hm, ja biorąc pod uwagę, aby $0w $0$*opcjonalny, a także, gdy poprzedzający Token jest dosłowny, który nie jest liczbą (jak twoi ys są) ... widząc to mogę faktycznie realizować to.
Martin Ender
@ MartinBüttner Myślałem, że to nowa funkcja, ale okazało się, że nie bardzo. :)
randomra
Nie, obecnie działa to tylko na początku zamiany. To powiedziawszy, może możesz zmienić role pierwszego i ostatniego numeru, aby z tego skorzystać?
Martin Ender
2

MATL , 15 bajtów

VG:qPVXvG:)GVhh

EDYCJA (20 maja 2016 r.) Kod w linku używa Xzzamiast, z Xvpowodu ostatnich zmian w języku.

Wypróbuj online!

V                 % input n. Convert to string
 G:               % range [1,2,...,n]
   qP             % convert into [n-1,n-2,...,0]
     VXv          % convert to string, no spaces
        G:)       % take first n characters only
           GV     % push input as a string, again
             hh   % concat horizontally twice    
Luis Mendo
źródło
1

Java, 93 bajty

String x(int v){String o=""+v;for(int i=v-1,c=o.length();o.length()-c<v;i--)o+=i;return o+v;}
Addison Crump
źródło
1

Rubinowy, 41 bajtów

->n{[n]*2*(r=0...n).to_a.reverse.join[r]}
obolały
źródło
1

Droga Mleczna 1.6.5 , 27 25 bajtów

I'::%{K£BCH=}<ΩHG<+<;+!

Wyjaśnienie

I                        ` empty the stack
 '::                     ` push 3 copies of the input
    %{K£BCH=}            ` dump digits of reversed range(n) as strings [n-1...0]
             <ΩHG<+<;+   ` select the first nth digits and pad them with n
                      !  ` output

Stosowanie

$ ./mw <path-to-code> -i <input-integer>
Zach Gates
źródło
Jakiego kodowania używa Droga Mleczna?
Adnan
Uhhh .. UTF-8, myślę haha. @AandN
Zach Gates
Wystąpił ten błąd (tak, jestem scumbag systemu Windows: p) podczas próby uruchomienia tego. Wkleiłem to: I'::%{K£BCH=}<OHG<+<;+!do pliku zakodowanego w UTF-8, ale to nie działa.
Adnan
Oto link do pliku, którego używam. @AandN
Zach Gates
1

Perl 6 , 31 bajtów

{$_~([R~] ^$_).substr(0,$_)~$_}
{
  $_ # input
  ~  # string concatenated with
  ([R~] ^$_)    # all numbers up to and excluding the input concatenated in reverse
  .substr(0,$_) # but use only up to the input number of characters
  ~
  $_
}

Stosowanie:

for 2,3,7,12,100 {
  say {$_~([R~] ^$_).substr(0,$_)~$_}( $_ )
}
2102
32103
765432107
1211109876543212
1009998979695949392919089888786858483828180797877767574737271706968676665646362616059585756555453525150100
Brad Gilbert b2gills
źródło
1

Perl, 43 + 2 = 45 bajtów

Cieszę się, że nie użyłem reversei ani substr:

"@{[1-$_..0]}"=~s.\D..gr=~/.{$_}/;$_.=$&.$_

Wymaga -plflag.

$ perl -ple'"@{[1-$_..0]}"=~s.\D..gr=~/.{$_}/;$_.=$&.$_' <<< 12
1211109876543212

Jak to działa:

                                            # '-p' read first line into `$_` and
                                            # auto print at the end
"@{[1-$_..0]}"                              # Create a list from -1-n..0 and
                                            # join it on space. This becomes:
                                            #   "-11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0"
              =~s.\D..gr                    # Remove all but digits:
                                            #   "11109876543210"
                        =~/.{$_}/;          # Match the n first characters from
                                            # the generated string
                                  $_.=$&.$_ # Append the match and the input
andlrc
źródło
1

C, 130 125 bajtów

#define p(x) printf("%i",x);
i,y,h;f(x){for(i=y=x;(i-=h)>=0;){p(y--)h=floor(log10(y))+1;}if(i+=h)p(h=floor(y/pow(10,i)))p(x)}

Wersja bez golfa (z wyjaśnieniem):

#define p(x) printf("%i",x);     // alias to print an integer
i,y,h;                           // helper variables
f(x){                            // function takes an integer x as arg
    for(i=y=x;(i-=h)>=0;){       // i -> the remaining space
                                 // y -> the current descending number
        p(y--)                   // print y (at first y==x)
        h=floor(log10(y))+1;     // h -> the number of digits in y-1
    }                            // do it until there is no more empty space
    if(i+=h)                     // if needs to chop the last number
        p(h=floor(y/pow(10,i)))  // chop and print (implicitly cast of double to int)
    p(x)                         // print x at the end
}                                // end function

Pośrednie rzutowanie z double na int in h=floor(...)pozwalało na użycie #define p(x)5 bajtów.

Przetestuj na ideonie.

oddalony
źródło
1

R, 67 bajtów (jako funkcja)

# usage example : f(7)
f=function(i)cat(i,substr(paste((i-1):0,collapse=''),1,i),i,sep='')

R, 63 bajty (dane wejściowe z STDIN)

i=scan();cat(i,substr(paste((i-1):0,collapse=''),1,i),i,sep='')
digEmAll
źródło
1

Brainfuck, 265 bajtów

Działa to tylko z liczbami <10

Wypróbuj wersję golfową tutaj :

>,------------------------------------------------[->+>+<<]>>[-<<+>>]<[[->+>+<<]>>[-<<+>>]<-]<[<]>[>[>]>+<<[<]>-]>[++++++++++++++++++++++++++++++++++++++++++++++++.>]++++++++++++++++++++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++++++++++++++++++++.

Nie golfił. Wypróbuj tutaj :

>
,
---------- Convert to base 10
----------
----------
----------
-------- 


[->+>+<<]>>[-<<+>>]<

Fill up the grid
[
[->+>+<<]>>[-<<+>>] //duplicate number like [5][0] -> [5][5]
<-
]

<[<]> Go to cell 1
[

>[>] Scan for zero
> Move one more
+ Add one
<< Move two back
[<] Scan for zero
> Move one forward
- Subtract One
]

> Move one forward into actual numbers
[
++++++++++ Convert to ascii
++++++++++
++++++++++
++++++++++
++++++++
.
>
]
++++++++++ Convert to ascii
++++++++++
++++++++++
++++++++++
++++++++
.
>
++++++++++ Convert to ascii
++++++++++
++++++++++
++++++++++
++++++++
.
Keatinge
źródło
,>>++++++[<++++++++>-]<[-<->]<To może odjąć 48 z krótszą długością kodu
Leaky Nun