Azalan basamak dizileri


16

Giriş

Örnek olarak, numarayı alalım 7. Daha sonra bunu çoğaltır ve arasına 7 boşluk yerleştiririz. Bunu elde ederiz:

7_______7

Bundan sonra, boşluk kalmayıncaya kadar sayıyı azaltacağız. 7 sayısı için aşağıdakileri alıyoruz:

7_______7    
 6543210

Sonra ikisini birleştiriyoruz, yani:

7_______7    
 6543210  becomes

765432107

Bu N = 7 için çıkış olacaktır .

Kolay görünüyor, değil mi? Şimdi N = 12'yi alalım . İki sayı arasına tekrar 12 boşluk ekliyoruz, bu da bize şunu veriyor:

12____________12

Sonra azalmaya başlarız:

12____________12
  111098765432

Ve bu nihayet bize:

1211109876543212

Gördüğünüz gibi, inen kısım 0'da değil 2'de bitiyor .

Görev

1'den büyük bir tam sayı verildiğinde, yukarıda gösterildiği gibi azalan sekansı çıktılar.

Test senaryoları

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

Bu , bu yüzden en az bayt ile gönderme kazanır!


İç boşluk tam sayılarla doldurulmalı veya gerekirse sayılar kesilmeli mi? Bununla ilgili bir test örneği yok (örneğin 99)
edc65

@ edc65 Gerekirse sayıları doğramalısınız. Test senaryosu olarak 99 ekledim.
Adnan

Yanıtlar:


8

CJam, 11 10 bayt

q4*~,W%s<\

Çevrimiçi deneyin. Girdide bir satırsonu olduğunu varsayar. (@ Jimmy23013'e bir bayt kaydettiği için teşekkürler.)

açıklama

Her satırın sonunda yığının o noktada nasıl göründüğü ( 4örnek olarak kullanarak ).

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]

9

Julia, 30 bayt

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

Bu, bir tamsayıyı kabul eden ve bir dize döndüren anonim bir işlevdir. Bunu çağırmak için bir değişkene atayın.

N -1'den 0'a inen diziyi oluşturup birleştiririz ve sonuçtaki dizeden ilk n karakteri alırız. Bunu girişin başına dize olarak ekleriz.

Tüm test senaryolarını çevrimiçi doğrulayın


5

Haskell, 44 bayt

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

Kullanım örneği: f 14-> "141312111098765414".


5

JavaScript (ES6), 55 52 bayt

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

Düzenleme: @WashingtonGuedes sayesinde 3 bayt kaydedildi.


@WashingtonGuedes Bah, hiç kullanmadım .keys().
Neil

.keys()gibidir .reduce. İş için doğru araç, ancak her zaman bu durumda daha iyisini yapabilecek bir şey bulursunuz
edc65

4

Python 2, 82 72 58 53 bayt

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

Burada deneyin!

Bana bunu öğrettiği için @Alex sayesinde repr(x)= `x`bir sürü bayt kurtardı!


3

Pyth, 11 bayt

++Q<jk_UQQQ

Hepsi 11 bayt ( iç çekme ) olan iki alternatif sürüm :

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

Burada deneyin.


3

Japt, 13 bayt

U+Uo w ¬¯U +U

Çevrimiçi test edin!

Nasıl çalışır

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

3

Jöle, 10 bayt

Ȯ’r0DFḣ³Ḍ³

Çevrimiçi deneyin!

Nasıl çalışır

Ȯ’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.


2

Vitsy, 35 bayt

Vitsy sayıları dizelerden nasıl çıkaracağının farkında olmadığından, ikinci satırda ondalık basamaklarda sayının uzunluğunu bulmayı uyguladım.

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

Açıklama:

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.

Çevrimiçi deneyin!

Lols için ayrıntılı mod:

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;

Görünüşe göre ayrıntılı modun tanımında yanlış olduğu Lanlaşılıyor, şimdi düzeltiliyor (soruyu güncellemeyeceğiz).
Addison Crump

Sadece merak ediyorum, programın sonunda yöntemin yürütülmesini nasıl önlersiniz? Yeni satır karakteri programa dönmek / programdan çıkmak için bir sinyal mi?
LegionMammal978

@ LegionMammal978 Her Vitsy programının ilk satırının "ana" yöntem olduğunu ve diğer tüm satırların yöntem olduğunu hayal edin public static void. Ana program tamamlandığında programı sonlandırır. Bunu nasıl yapacağına gelince, talimatlar ArrayList<ArrayList<String[]>>her satırın bir olduğu bir tipte tutulur String[]. Her yöntem, yeni satırda dosyanın nasıl yüklendiğine göre bölünür ve ana yöntemin diğer tüm yöntemlerden ayrılmasına neden olur.
Addison Crump

Bu, neden üç seviyeye ihtiyaç duyulduğunu açıklar. Yani Strings komutlar, String[]s yöntemler (ilki ana yöntem) ve ArrayList<String[]>s sınıflar (ilki ana sınıf), doğru mu?
LegionMammal978

@ LegionMammal978 Hepsi doğru. :)
Addison Crump

2

Saf Bash, 49

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

Veya:

Bash + coreutils, 48

echo $1$(seq $[$1-1] -1 0|tr -d \\n|head -c$1)$1

Bunların aralığı doğru değerlendirdiğinden emin değilim. Test sonrasında her ikisi de aralığın sadece yarısını yazdırır. yani $ 1 = 90 için aralık sadece 45'e düştü. Çabalarım "$ i için (eval echo {$ 1..0}); echo -n $ i; bitti; echo $ 1" idi
rcjohnson

@rcjohnson Bence bu gerekli davranış. N = 90 için çıktının ne olmasını bekliyorsunuz?
Dijital Travma

@rcjohnson örneğin N = 12 için, çıktı 12, daha sonra ilk 12 karakter 11..0(veya 111098765432) olmalı ve son olarak12
Digital Trauma

Açıklamayı yeniden okuduktan sonra doğru olduğunu görüyorum. Sorun tam sayıları değil "boşlukları" belirtir.
rcjohnson

@rcjohnson Evet, "boşluklar" kısmının yalnızca ara adımlar için geçerli olduğunu düşünüyorum. Son çıktı sadece bir rakam dizisi olmalıdır.
Dijital Travma

2

Retina, 63 bayt

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

Hala golf için oldukça yer var ...

Çevrimiçi deneyin!


Hımm, ben yapmak düşünüyorum $0yılında $0$*belirteç is bir değişmez bir numarası (gibi olmadığı hangi önceki zaman, hem de isteğe bağlı yler vardır) ... Bu görme Aslında o uygulayabilir.
Martin Ender

@ MartinBüttner Bunun yeni özellik olduğunu düşündüm ama gerçekte ortaya çıkmadı. :)
randomra

Hayır, şu anda bu sadece oyuncu değişikliğinin başlangıcında çalışıyor. Bununla birlikte, belki de bundan yararlanmak için ilk ve son sayının rollerini değiştirebilirsiniz?
Martin Ender

2

MATL , 15 bayt

VG:qPVXvG:)GVhh

EDIT (20 Mayıs 2016) Bağlantıdaki kod, XzXv Dildeki son değişiklikler nedeniyle yerine .

Çevrimiçi deneyin!

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    

1

Java, 93 bayt

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

1

Ruby, 41 bayt

->n{[n]*2*(r=0...n).to_a.reverse.join[r]}

1

Samanyolu 1.6.5 , 27 25 bayt

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

açıklama

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

kullanım

$ ./mw <path-to-code> -i <input-integer>

Samanyolu hangi kodlamayı kullanır?
Adnan

Uhhh .. UTF-8, sanırım haha. @AandN
Zach Gates

Bunu çalıştırmaya çalışırken bu hatayı aldım (evet, Windows scumbag: p). Bunu yapıştırdım: I'::%{K£BCH=}<OHG<+<;+!UTF-8 kodlu bir dosyaya, ama çalışmıyor.
Adnan

İşte kullandığım dosyanın bağlantısı . @AandN
Zach Gates

1

Perl 6 , 31 bayt

{$_~([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
  ~
  $_
}

Kullanımı:

for 2,3,7,12,100 {
  say {$_~([R~] ^$_).substr(0,$_)~$_}( $_ )
}
2102
32103
765432107
1211109876543212
1009998979695949392919089888786858483828180797877767574737271706968676665646362616059585756555453525150100

1

Perl, 43 + 2 = 45 bayt

Kullanmadığım için mutluyum reverseve hiçbiri substr:

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

-plBayrak gerektirir .

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

Nasıl çalışır:

                                            # '-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

1

Cı, 130 125 bayt

#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)}

Ungolfed sürümü (açıklama ile):

#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

Örtük olarak çiftten int'e döküm, 5 bayt tasarruf h=floor(...)edilmesine izin verdi #define p(x).

İdeone üzerinde test.


1

R, 67 bayt (işlev olarak)

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

R, 63 bayt (STDIN'den giriş)

i=scan();cat(i,substr(paste((i-1):0,collapse=''),1,i),i,sep='')

1

Brainfuck, 265 Bayt

Bu sadece <10 rakamlarıyla çalışacaktır

Golfçülen sürümü burada deneyin :

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

Ungolfed. Burada deneyin :

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

,>>++++++[<++++++++>-]<[-<->]<Bu, daha kısa kod uzunluğuyla 48 çıkarabilir
Leaky Nun


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.