1'den n'ye serpiştirme sayıları, aynı sayılar tersine çevrilmiş


34

Basit bir tane:

Pozitif bir tamsayı al n arasında tamsayılardır az 1000 den, ve çıkış , 1 ile n arasındaki tamsayılar ile içiçe n için 1 . Numaraları, aralarında sınırlayıcı olmadan görünecek şekilde birleştirmelisiniz.

Test durumları:

n = 1
11

n = 4
14233241

n = 26
12622532442352262172081991810171116121513141413151216111710189198207216225234243252261

n = 100
110029939849759669579489399210911190128913881487158616851784188319822081218022792378247725762675277428732972307131703269336834673566366537643863396240614160425943584457455646554754485349525051515052495348544755465645574458435942604161406239633864376536663567346833693270317130722973287427752676257724782379228021812082198318841785168615871488138912901191109299389479569659749839921001

Bu olduğundan, her dilde en kısa bayt cinsinden gönderim kazanır. Açıklamalar teşvik edilir.

Yanıtlar:


16

JavaScript (ES6), 30 bayt

f=(n,k=1)=>n?f(n-1,k+1)+n+k:''

Nasıl?

Bu oldukça basittir ancak ipin kuyruktan başa yapıldığını belirtmek önemlidir. Başındaki boş bir dize en son eklenir ve son sonucun zorlanmasının bir dize olmasına izin verir.

Aşağıdakiler için özyinelemenin detayı f(4):

f(4) =                                            // initial call
f(4, 1) =                                         // applying the default value to k
f(3, 2) + 4 + 1 =                                 // recursive call #1
(f(2, 3) + 3 + 2) + 4 + 1 =                       // recursive call #2
((f(1, 4) + 2 + 3) + 3 + 2) + 4 + 1 =             // recursive call #3
(((f(0, 5) + 1 + 4) + 2 + 3) + 3 + 2) + 4 + 1 =   // recursive call #4
((('' + 1 + 4) + 2 + 3) + 3 + 2) + 4 + 1 =        // n = 0 --> end of recursion
'' + 1 + 4 + 2 + 3 + 3 + 2 + 4 + 1 =              // final sum
'14233241'                                        // final result

Test durumları


10

Python 2,46 bayt

lambda n:''.join(`x+1`+`n-x`for x in range(n))

4 bayt için ovs sayesinde

Çevrimiçi deneyin!

Açıklama:

lambda n:''.join(`x+1`+`n-x`for x in range(n))
lambda n:                                      # anonymous lambda taking one parameter n
                 `x+1`+`n-x`                   # `x` is repr(x) which is equivalent to str(x) for integers less than INT_MAX
                            for x in range(n)  # integers x in [0, n)

1
Python 3'te iki byte daha:f'{x}{n-~-x}'
L3viathan

2
@ L3viathan Bu, 3.6'da eklenen yeni bir özellik.
Mego

1
Python 3.6 Python 3 değil mi?
L3viathan

6
lambda n:''.join('x+1'+'n-x'for x in range(n))46 bayt için. ( 'listedeki kavrayışları tersine çevir)
ovs

6
@ovs hey, backtick kaçabilir -> `\`x+1\``işler`x+1`
Rod


7

Bash , 25 bayt

printf %s`seq $1 -1 1|nl`

Çevrimiçi deneyin!

Azalan diziyi yazdırır, sayı satırları artar ve printf satırları birleştirir

Sınırlandırılmış, 20 bayt: seq $ 1 -1 1 | nl | xargs


bu kabul edilebilir değilse seq $1 -1 1|nl|tr -d ' \n\t'8 bayt daha değiştirebilirim
marcosm

1
20 bayt gönderim geçersiz. Benim oyum 25 bayt gönderim için.
Dijital Travma

Digital Trauma'nın belirttiği gibi, 20 baytlık çözüm geçersiz.
Outgolfer Erik

time printf %s'seq 1000000 -1 1|nl'; grep name /proc/cpuinfo real 0m7.985s user 0m6.092s sys 0m0.392s model name : Intel(R) Pentium(R) D CPU 3.00GHz model name : Intel(R) Pentium(R) D CPU 3.00GHz
marcosm

7

R, 35 bayt

n=scan();cat(rbind(1:n,n:1),sep="")

Çevrimiçi deneyin

rbind(1:n,n:1)ilk satırda 1 ila n ve ikinci sırada n ila 1 olan 2 satırlık bir matris oluşturur. catİşlevi, her sütun aşağı okuma bu matris çöker.


1
Bunun sadece etkileşimli modda çalıştığını ve kullanıcının nkomut satırına girmesini (stdin yerine geçmek yerine) gerektirdiğini unutmayın.
shadowtalker

@ssdecontrol Evet, genellikle buna izin verildiğini düşünüyorum, ancak burada oldukça yeniyim, yanlış olabilir.
user2390246

Genel olarak kabul edilebilir olduğunu düşünüyorum, ancak NB, TIO'da düzgün bir şekilde çalıştırmak için girişleri Altbilgi alanına koymanız gerekir (ve bir bağlantı eklemek her zaman iyidir!) Tio.run/nexus/…
Giuseppe

6

05AB1E , 6 5 bayt

Rev tarafından önerildiği gibi yeni serpiştirme yerleşikini kullanarak bir bayt kaydedildi

LÂ.ιJ

Çevrimiçi deneyin!

açıklama

L        # range [1 ... input]
 Â       # create a reversed copy
  .ι     # interleave the lists
    J    # join

Rev adında bir kullanıcı önerdi LÂ.ιJ.
Jonathan Frech

@JonathanFrech: Şimdiki fikir birliğinin zorluklardan daha yeni özellikler kullanabileceğimiz olduğunu biliyorum, ancak genellikle eski cevapları düzenlemek için tereddüt ediyorum çünkü yeni bir yerleşik görev daha iyi bir şekilde tamamlanıyor. Tüm bu şekilde geliştirilebilecek çok fazla cevap var :)
Emigna

Ben sadece elçisiydim; possible @rev kendi cevabını göndermelidir.
Jonathan Frech

@JonathanFrech: Bunu bir suçlama olarak kastetmedim. Rev, düzenlemeyi önerdiğinde doğru bir şekilde yaptı; ne zaman yeni bir yerleşik yapılırsa, yeni bir cevap göndermek yerine mevcut bir yanıtı düzenlemek daha iyidir. En azından önerilerde bulunulduğunda eski cevapları düzelterek gerçekten daha iyi olmalıyım.
Emigna

4

CJam , 10 bayt

ri,:)_W%]z

Çevrimiçi deneyin!

açıklama

ri   e# Read input and convert to integer N.
,    e# Turn into range [0 1 ... N-1].
:)   e# Increment to get [1 2 ... N].
_W%  e# Duplicate and reverse the copy.
]    e# Wrap both in an array to get [[1 2 ... N] [N ... 2 1]]
z    e# Transpose to get [[1 N] [2 N-1] ... [N-1 2] [N 1]]
     e# This list is printed implicitly at the end of the program,
     e# but without any of the array structure (so it's essentially flattened,
     e# each number is converted to a string and then all the strings
     e# are joined together and printed).

4

Ruby , 29 bayt

->n{n.times{|x|$><<x+1<<n-x}}

Açıklama:

->n{n.times{|x|                # x in range [0..n-1]
               $><<            # output on console
                   x+1<<n-x}}  # x+1, then n-x

Çevrimiçi deneyin!


4

Boşluk , 71 bayt

   
 
 	
		 
 			
  
 
	   	
	    
 	
 	 
	 
 	
 	   	
	  	 
 
	 	

 


Çevrimiçi deneyin!

açıklama

sssn  ; push 0 - seed the stack with 0 (this will be our 1->n counter, a)
sns   ; dup
tntt  ; getnum - read n (stored on the heap)
sns   ; dup
ttt   ; retr - pull n onto the stack (this will be our n->1 counter, b)
nssn  ; label 'loop'
snt   ; swap - bring a to the top
ssstn ; push 1
tsss  ; add - increment a
sns   ; dup
tnst  ; putnum - output a as a number
snt   ; swap - bring b to the top
sns   ; dup
tnst  ; putnum - output b as a number
ssstn ; push 1
tsst  ; sub - decrement b
sns   ; dup
ntstn ; jez 'exit' if b is 0
nsnn  ; jmp 'loop'

Yığının doğru şekilde ayarlanması için ilk birkaç talimat gereklidir, Whitespace'in giriş komutları yığına yazılır, bu yüzden b (giriş değeri) yığına geri kopyalamamız gerekir. Bir = 0 ile başlıyoruz, çünkü 1 yerine 0 ilan etmek daha kısa (bayt tasarrufu sağlıyor) ve başa çıkabilmek için sadece artış komutunu yeniden düzenlemek zorundayız. Ondan sonra sadece a döngüsünü artırır ve arttırırız, a çıkışını, b çıkışını, b değerini düşürün, b 0 olana kadar (azalmadan sonra kontrol edilir).


tüm bu takip eden boşlukları kaldırırsanız, bu çok daha fazla golf oynayabilir: P
cat

4

Haskell, 65 48 47 bayt

Laikoni sayesinde 1 bayt kurtarıldı:

f n=show=<<(\(l,r)->[l,r])=<<zip[1..][n,n-1..1]

Nimi sayesinde 6 bayt kaydedildi:

f n=show=<<(\(l,r)->[l,r])=<<zip[1..n][n,n-1..1]

Önceki cevap ve açıklama:

f n=concatMap show$concatMap(\(l,r)->[l,r])(zip[1..n][n,n-1..1])

Burada zaten daha iyi bir Haskell cevabı var, ama hem Haskell hem de kod golfü konusunda yeniyim, bu yüzden gönderebilirim :)

Bu işlev, [1..n] listesini tersten çevirir ve sonuçta bir kayıt listesi ortaya çıkar.

[(1,n),(2,n-1),(3,n-2)..(n,1)]

Sonra concatMapbir lambda ile bir liste halinde sonuçlanan bu listeye tuples eşlemek için kullanılır ...

[[1,n],[2,n-1],[3,n-2]..[n,1]]

... ve birleştirir.

[1,n,2,n-1,3,n-2..n,1]

Sonra bir final listeye concatMapeşlenir showve onu tek bir dizgeyle birleştirir.

f 26 "12622532442352262172081991810171116121513141413151216111710189198207216225234243252261"


2
İnfix fonksiyonu =<<olarak (liste monadın içinde) aynıdır concatMap: f n=show=<<(\(l,r)->[l,r])=<<zip[1..n][n,n-1..1].
nimi

1
1) Mevcut çözümünüz sadece 48 bayttır. 2) bırakabilirsiniz nin [1..n]: Online deneyin!
Laikoni

1) Off-by-one hataları Dang.
Dan Ambrogio

3

Pyth, 7 bayt

jksC_BS

Çevrimiçi deneyin: Gösteri

Açıklama:

jksC_BSQ   implicit Q (=input number) at the end
      SQ   create the range [1, ..., Q]
    _B     bifurcate by inversion, this gives [[1, ..., Q], [Q, ..., 1]]
  sC       zip and flatten result
jk         join to a string


3

Perl 6 , 20 bayt

{[~] 1..*Z~($_...1)}

Dene

100000 girişle bu, derleme ve çıktının yazdırılması dahil olmak üzere yaklaşık 10 saniye sürer.

Expanded:

{                # bare block lambda with implicit parameter 「$_」

  [~]            # reduce using concatenation operator 「&infix:«~»」
                 # (shorter than 「join '',」)

    1 .. *       # Range from 1 to infinity

    Z~           # zip using concatenation operator

    ( $_ ... 1 ) # deduced sequence starting at the input
                 # going down to 1
}

Z~İhtiyacı ~aksi takdirde boşluklu stringify olacak listelerin bir listesini oluşturur, çünkü.

Aralığı 1'den başlayarak sınırlamaya gerek yoktur, çünkü Zgiriş listelerinden herhangi biri bittiğinde durur.
Bu, iki bayttan tasarruf sağlar (daha sonra bir alana ihtiyaç duyulur $_)


3

Java 61 bayt

(int n)->{for(int i=0;i<n;System.out.print(i+1+""+(n-i++)));}

2
Ayrıca, PPCG'ye hoş geldiniz! :)
Stewie Griffin 15

İsimsiz fonksiyonlara izin veriyoruz, (int n)->{//for loop}burada çalışmalıyız.
Nathan Merrill

Bu daha iyi mi?
cheemcheem

2
Evet! Potansiyel System.out.print()olarak for döngüsünün son ifadesine girebilirsiniz , ancak iiki kez kullandığınız için karmaşık hale gelir (ve ifadede onu artırmanız gerekir).
Nathan Merrill

Baskıyı döngünün içine koydum ve mümkün olan en son yere i artırdım, sonra çalıştığından emin olmak için Test durumları ile kontrol ettim, teşekkürler @NathanMerrill
cheemcheem

3

Jöle , 5 bayt

RṚĖVV

Çevrimiçi deneyin!

Nasıl çalışır

RṚĖVV  Main link. Argument: n

R      Range; yield [1, ..., n].
 Ṛ     Reverse; yield [n, ..., 1].
  Ė    Enumerate; yield [[1, n], ..., [n, 1]].
   V   Eval; convert each flat array to a string, interpret it as a Jelly program,
       and yield the output. This concatenates the integers in each pair, yielding
       a flat array of integers
    V  Repeat the previous step, concatenating the intgegers from before.

3

Röda , 21 19 bayt

{seq 1,_<>seq _1,1}

Çevrimiçi deneyin!

Bu, akıştan girdi alan adsız bir işlevdir.

açıklama

{seq 1,_<>seq _1,1}               Anonymous function, takes integer n from the stream
        <>                        Interleave
 seq 1,_                            the range 1 .. n with
          seq _1,1                  the range n .. 1

2

Clojure, 61 bayt

#(let[a(range 1(+ 1 %))](apply str(interleave a(reverse a))))

Kelimenin tam anlamıyla sorulan şeyi yapar. Daha az önemsiz bir çözümle aşılabileceğine inanıyorum.

Çevrimiçi görün


2

Aseto , 25 22 bayt

)&
pX`=
(pl0
id@z
r}Z)

Açıklama:

Bir tamsayı okuduk ve iki yığına koyduk.

id
r}

Birinde, range_up ( Z) işlevini , diğer range_down ( z) işlevini çağırır , daha sonra bu yere geri dönebilmek için bir toplama işareti koyarız:

  @z
  Z)

Daha sonra mevcut yığının boş olup olmadığını kontrol ederiz ve öyleyse çıkar:

 X`=
  l0

Aksi takdirde, her iki yığından da yazdırır ve geri yakalama işaretine geri atlarız:

)&
p
(p

2

R, 41 bayt

pryr::f(for(i in 1:x){cat(i);cat(x-i+1)})

pryr::f()bir girdi alan bir fonksiyon yaratır. Üzerindeki ilmekleri 1:xve her bir elemanın her bir elemanını 1:xbirlikte basar x:1. STDOUT'a yazdırır.


+1, güzel kullanımpryr
shadowtalker

@ssdecontrol onun hemen hemen zımba yerine function(x):)
JAD


2

MATL, 13 11 9 bayt

@Luis sayesinde 2 bayt kaydedildi

:tPv1eVXz

MATL Online'da deneyin

açıklama

        % Implicitly grab input as a number, N
:       % Create an array from 1..N
tP      % Create a reversed copy
v       % Vertically concatenate the two
1e      % Reshape it into a row vector
V       % Convert to a string
Xz      % Remove whitespace and implicitly display

@LuisMendo Ah! Boşluk alanını kaldıran ancak bulamayan bir işlev olduğunu düşündüm. Teşekkürler!
Suever

2

PHP, 36 35 29 bayt

for(;$argn;)echo++$i,$argn--;

Jörg Hülsermann sayesinde bir bayt kurtarıldı.
Christoph sayesinde altı bayt kurtarıldı.


3
Uhm ... for(;$argn;)echo++$i,$argn--;?
Christoph

2

Scala, 43 bayt

En iyi değil ama benim ilk kod golf.

n=>1.to(n).foldLeft("")((s,x)=>s+x+(n-x+1))

2

V , 20 bayt

ywo1@"­ñykPjñkògJ

Çevrimiçi deneyin!

Açıklamak:

yw                    ' Copy the input number (for looping later)
  o1                 ' Insert a 1 under the input (on a newline)
     @"               ' [Copy register] number of times
       ­ñ      ñ       ' Do the thing inside of this loop
        ykP           ' Copy the current line and line above it, and paste above both
           j        ' decrement the current (top) number, and increment the one below
               k      ' Go to the top line
                ògJ   ' recursively join all of the lines

2

Cubix , 17 bayt

....1I>sO)su.@?(O

Çevrimiçi deneyin!

cubified:

    . .
    . .
1 I > s O ) s u
. @ ? ( O . . .
    . .
    . .

İter 1, giriş (okur I, daha sonra, artışlarla, swap verir, yığının üst değiştirir döngüye girer), yığın, azalmasına üst çıkışları ve istifin en üst 0 ise durur.



2

MathGolf , 5 bayt

{îkï-

Çevrimiçi deneyin!

Açıklama:

{      Run a for loop over implicit input
 î     Push 1 based index of loop
  k    Push inputted number
   ï-  Subtract 0 based index of loop
       Implicitly output all this joined together

1
Ben aynı sonucu verir uzunluğu 5 13 programlarını bulmak mümkün oldum: ╒{ïí,, ╒{ïk,, ╒{íï-, ╒{kï-, ╒{┐í,, ╒{┐k,, ╒x{î\ , {îïí,, {îïk,, {îíï-, {îkï-, {î┐í,, {î┐k,. Ancak 4 ya da daha az uzunlukta hiçbir program bulamadım. Tam bir arama yapmadım, ancak 5 bayt MathGolf için en uygunudur.
9'da max


2

Fare-2002 , 32 30 bayt

-2 (z.^ ... )yerine döngünün başına koşullu taşındı(... z.0>^)

?n:n.z:(z.^a.1+a:a.!z.!z.1-z:)

Çevrimiçi deneyin!

Açıklama:

?n:                                 ~ get input and store in n
   n.z:                             ~ copy n into z
       (z.^                         ~ stop if z equals 0
           a.1+a:                   ~ add 1 to a
                 a.!                ~ print a
                    z.!             ~ print z
                       z.1-z:)      ~ substract 1 from z

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.