Чередование чисел от 1 до n с одинаковыми номерами в обратном порядке

34

Простой:

Возьмите положительное целое число n меньше 1000 и выведите целые числа от 1 до n, чередующиеся с целыми числами от n до 1 . Вы должны объединить числа так, чтобы они появлялись без разделителей между ними.

Тестовые случаи:

n = 1
11

n = 4
14233241

n = 26
12622532442352262172081991810171116121513141413151216111710189198207216225234243252261

n = 100
110029939849759669579489399210911190128913881487158616851784188319822081218022792378247725762675277428732972307131703269336834673566366537643863396240614160425943584457455646554754485349525051515052495348544755465645574458435942604161406239633864376536663567346833693270317130722973287427752676257724782379228021812082198318841785168615871488138912901191109299389479569659749839921001

Это поэтому выигрывает самая короткая подача в байтах на каждом языке. Пояснения приветствуются.

Стьюи Гриффин
источник

Ответы:

16

JavaScript (ES6), 30 байт

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

Как?

Это довольно просто, но стоит отметить, что нить построена от хвоста до головы. Пустая строка в начале добавляется последней и позволяет привести конечный результат к строке.

Ниже приведена деталь рекурсии для 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

Контрольные примеры

Arnauld
источник
10

Python 2 , 46 байт

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

Благодаря овам за 4 байта

Попробуйте онлайн!

Объяснение:

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:f'{x}{n-~-x}'
L3viathan
2
@ L3viathan Это новая функция, добавленная в 3.6.
Mego
1
Python 3.6 не является Python 3?
L3viathan
6
lambda n:''.join('x+1'+'n-x'for x in range(n))для 46 байт (замените. 'в списке понимании с обратными кавычками)
овс
6
@ovs эй, вы можете избежать backtick -> `\`x+1\``рендеринга`x+1`
Rod
8

-5 благодаря Орджану Йохансену

Haskell , 33 байта

f n=do a<-[1..n];[a,n-a+1]>>=show

Попробуйте онлайн!

bartavelle
источник
3
(1) doВыражение короче, чем >>=плюс лямбда. (2) Однако, showможно комбинировать с помощью >>=show.
Орджан Йохансен
7

Баш , 25 байт

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

Попробуйте онлайн!

Печатает убывающую последовательность, увеличивается число строк и printf соединяет строки

Разделенный пробелом, 20 байтов: seq $ 1 -1 1 | nl | xargs

marcosm
источник
если это не приемлемо, я могу изменить его на seq $1 -1 1|nl|tr -d ' \n\t'8 байтов больше
marcosm
1
20-байтовая отправка недействительна. Мой upvote для представления 25 байтов.
Цифровая травма
Как отмечает Digital Trauma, 20-байтовое решение недопустимо.
Эрик Outgolfer
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 байт

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

Попробуйте онлайн

rbind(1:n,n:1)создает матрицу из 2 строк с 1 до n в первой строке и от n до 1 во второй. catФункция коллапсирует эту матрицу, чтение каждой колонки.

user2390246
источник
1
Обратите внимание, что это работает только в интерактивном режиме и требует от пользователя ввода nв командной строке (вместо прохождения через стандартный ввод).
Shadowtalker
@ssdecontrol Да, я думаю, что это обычно разрешено, но я здесь новичок, могу ошибаться.
user2390246
Я думаю, что это в целом приемлемо, но NB, чтобы правильно запустить его в TIO, вы должны поместить входные данные в поле «Нижний колонтитул» (и всегда полезно добавить ссылку!) Tio.run/nexus/…
Giuseppe
6

05AB1E , 6 5 байт

Сохраненный байт с использованием нового встроенного чередования, как предложено rev

LÂ.ιJ

Попробуйте онлайн!

объяснение

L        # range [1 ... input]
 Â       # create a reversed copy
  .ι     # interleave the lists
    J    # join
Emigna
источник
Пользователь под именем ред предложил LÂ.ιJ.
Джонатан Фрех
@JonathanFrech: Я знаю, что сейчас все согласны с тем, что мы можем использовать функции, более новые, чем задача, но я обычно не решаюсь редактировать старые ответы, потому что новая встроенная система лучше справляется с задачей. Есть так много ответов на все, что может быть улучшено таким образом :)
Emigna
Ну, я был только посланником; возможно @rev должен опубликовать свой ответ.
Джонатан Фрех
@JonathanFrech: Я не имел в виду это как упрек. Rev сделал это правильно, когда предложил редактировать, так как лучше отредактировать существующий ответ, чем публиковать новый, когда создается новая встроенная функция. Я действительно должен поправиться в исправлении старых ответов, по крайней мере, когда предложения сделаны.
Эминья
4

CJam , 10 байтов

ri,:)_W%]z

Попробуйте онлайн!

объяснение

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

Пробел , 71 байт

   
 
 	
		 
 			
  
 
	   	
	    
 	
 	 
	 
 	
 	   	
	  	 
 
	 	

 


Попробуйте онлайн!

объяснение

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'

Первая пара инструкций необходима для правильной настройки стека, входные команды Whitespace записывают в кучу, поэтому нам нужно скопировать b (входное значение) обратно в стек. Мы начинаем с a = 0, так как короче объявить 0 вместо 1 (сохраняет байт), и нам нужно только переупорядочить инструкцию приращения, чтобы справиться. После этого мы просто делаем цикл и увеличиваем a, выводим a, выводим b, уменьшаем b, пока b не достигнет 0 (проверяется после уменьшения).

Эфата
источник
это может быть гораздо более удачным, если вы удалите все эти пробелы: P
кот
4

Haskell, 65 48 47 байт

1 байт сохранен благодаря Laikoni:

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

6 байтов сохранено благодаря nimi:

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

Предыдущий ответ и объяснение:

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

Здесь уже есть лучший ответ на Haskell, но я новичок как в Haskell, так и в коде, поэтому я могу также опубликовать его :)

Эта функция упаковывает список [1..n] в обратном порядке, в результате получается список кортежей.

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

Затем он использует concatMapдля сопоставления лямбда с этим списком кортежей, который приводит к списку списков ...

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

... и объединяет это.

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

Затем финал concatMapотображается showв списке и объединяет его в одну строку.

f 26 "12622532442352262172081991810171116121513141413151216111710189198207216225234243252261"

Дэн Амброджио
источник
2
Функция инфикса =<<такой же ( в пределах списка монады) , как concatMap: f n=show=<<(\(l,r)->[l,r])=<<zip[1..n][n,n-1..1].
Ними
1
1) Ваше текущее решение - только 48 байтов. 2) Вы можете уронить nв систему [1..n]: Попробуйте его в Интернете!
Лайкони
1) Чертовы ошибки ... 2) Хороший звонок!
Дэн Амброджио
3

Pyth, 7 байт

jksC_BS

Попробуйте онлайн: демонстрация

Объяснение:

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
Jakube
источник
3

Perl 6 , 20 байт

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

Попробуй это

С входом 100000 это занимает примерно 10 секунд, включая компиляцию и вывод на печать.

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~потребности в~ потому что в противном случае он генерирует список списков, которые будут зачеркнуты пробелами.

Нет необходимости ограничивать диапазон, начиная с 1, потому что Zостанавливается, когда заканчивается любой из входных списков.
Это экономит два байта (после этого потребуется пробел $_)

Брэд Гилберт b2gills
источник
3

Java 61 байт

(int n)->{for(int i=0;i<n;System.out.print(i+1+""+(n-i++)));}
cheemcheem
источник
2
Кроме того, добро пожаловать в PPCG! :)
Стьюи Гриффин
Мы разрешаем анонимные функции, поэтому (int n)->{//for loop}должны работать здесь.
Натан Меррилл
Это лучше?
Чемеем
2
Ага! Вы можете поместить свой System.out.print()последний оператор в цикл for, но это усложняется, потому что вы используете iдважды (и вам нужно увеличить его в выражении).
Натан Меррилл
Я поместил печать в цикл и увеличил i в последнем возможном месте, затем проверил его с помощью контрольных примеров, чтобы убедиться, что он работает, спасибо @NathanMerrill
cheemcheem
3

Желе , 5 байт

RṚĖVV

Попробуйте онлайн!

Как это работает

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

Рёда , 21 19 байт

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

Попробуйте онлайн!

Это анонимная функция, которая принимает данные из потока.

объяснение

{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
Kritixi Lithos
источник
2

Clojure, 61 байт

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

Буквально делает то, что просят. Я считаю, что это может быть обойдено менее тривиальным решением.

Посмотри это онлайн

cliffroot
источник
2

Ацето , 25 22 байта

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

Объяснение:

Мы читаем целое число и помещаем его в два стека.

id
r}

С одной стороны, мы вызываем range_up ( Z), с другой range_down ( z), затем устанавливаем метку, чтобы иметь возможность вернуться к этому месту позже:

  @z
  Z)

Затем мы проверяем, пустой ли текущий стек, и завершаем работу, если так:

 X`=
  l0

В противном случае мы печатаем из обоих стеков и возвращаемся к метке:

)&
p
(p
L3viathan
источник
2

R, 41 байт

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

pryr::f()создает функцию, которая принимает один вход. Зацикливается 1:xи печатает каждый элемент 1:xвместе с каждым элементом x:1. Печатает на STDOUT.

JAD
источник
+1, хорошее использованиеpryr
shadowtalker
@ssdecontrol его довольно большая замена function(x):)
JAD
2

МАТЛ, 13 11 9 байт

2 байта сохранены благодаря @Luis

:tPv1eVXz

Попробуйте это на MATL Online

объяснение

        % 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
Suever
источник
@ LuisMendo Ах! Я думал, что есть функция, которая удаляет пробелы, но не может ее найти. Благодарность!
Suever
2

PHP, 36 35 29 байт

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

Сохранение одного байта благодаря Jörg Hülsermann.
Сохранено шесть байтов благодаря Кристофу.

user63956
источник
3
Хм ... for(;$argn;)echo++$i,$argn--;?
Кристоф
2

Скала, 43 байта

Это не самый лучший, но это мой первый гольф-код.

n=>1.to(n).foldLeft("")((s,x)=>s+x+(n-x+1))
Феникс
источник
2

V , 20 байтов

ywo1@"­ñykPjñkògJ

Попробуйте онлайн!

Объясните:

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
nmjcman101
источник
2

Cubix , 17 байтов

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

Попробуйте онлайн!

cubified:

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

Pushes 1, читает в input ( I), затем входит в цикл, который меняет вершину стека, выводит его, увеличивает, меняет, выводит верх стека, уменьшает и останавливает, если вершина стека равна 0.

Giuseppe
источник
2

MathGolf , 5 байтов

{îkï-

Попробуйте онлайн!

Объяснение:

{      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
Я был в состоянии найти 13 программ длины 5 , которые дают тот же результат: ╒{ïí,, ╒{ïk,, ╒{íï-, ╒{kï-, ╒{┐í,, ╒{┐k,, ╒x{î\ , {îïí,, {îïk,, {îíï-, {îkï-, {î┐í,, {î┐k,. Однако я не смог найти ни одной программы длиной 4 или меньше. Я не сделал полный поиск, но очень вероятно, что 5 байтов является оптимальным для MathGolf.
максимум
2

Мышь-2002 , 32 30 байт

-2 (z.^ ... )вместо условного начала цикла вместо(... z.0>^)

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

Попробуйте онлайн!

Объяснение:

?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
MooseOnTheRocks
источник