Codegolf — Добавление Радужных Пар

  • Автор темы Muradx
  • Обновлено
  • 19, Oct 2024
  • #1
На этот вопрос уже есть ответы здесь:

  • Сложите список пополам
  • (41 ответ)
  • Закрыт 4 года назад.

Правила следующие:

 > input
output
more output
etc.
-------------------
> 2 2
4

> 1 2 3 4 5 6
7
7
7

> 3 4 2 6
9
6

> 1 2 3 4 5
6
6
3

> -5 3 -8 2
-3
-5
 

Возьмите строку целых чисел, разделенных пробелами. Сложите первое и последнее числа, второе и предпоследнее числа и так далее.

Muradx


Рег
13 Sep, 2011

Тем
82

Постов
190

Баллов
670
  • 26, Oct 2024
  • #2

Стакс, 9 8 байты

Спасибо Вейцзюню Чжоу за -1 байт.

Он действительно соответствует требуемому выходному формату!

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 a->{String[] b=a.split(" ");    //Create String array to get rid of the pesky spaces
int c=b.length;    
a="";    //Since we now only need the array, we can reuse the original string to save a few bytes
for(int d=0;d<c/2;d++){    //Loop half(even) or half-1(odd) of the array length

a+=(Integer.parseInt(b[d])+    

Integer.parseInt(b[c-1-d]))+    //Add the ‘rainbow pairs’ to the output string

"\n";}    //Add a newline to each sum and end the loop
if(c%2>0){a+=b[c/2];}    //If the number of input numbers is odd, print the middle digit
return a;}    //the Output string is the Input string
 

Запустите и отладьте его

Вот необработанное ascii-представление программы.

a->{String[] b=a.split(" ");int c=b.length;a="";for(int d=0;d<c/2;d++){a+=(Integer.parseInt(b[d])+Integer.parseInt(b[c-1-d]))+"\n";}if(c%2>0){a+=b[c/2];}return a;}

Запустите это

 

Константин Степанов


Рег
22 Oct, 2020

Тем
91

Постов
209

Баллов
684
  • 26, Oct 2024
  • #3

Перл 5 for($i=0,$a=explode(" ",$argv[1]),$c=count($a);$i<$c/2;$i++)echo$i==$c-$i-1?$a[$i]:$a[$i]+$a[$c-$i-1]."\n"; , 23 bytes

sizeof(int)==sizeof(char*)

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

Perl необычен тем, что изменение массива допустимо во время его работы в цикле. Итак, вы можете иметь argv walking from front to back while using i,j,*k;f(char**s){k=(int*)s;while(s[++i])k[i]=atoi(s[i]);while(++j<=--i)printf("%d\n",k[i]+(i==j?0:k[j]));} эффективно идти сзади вперед, удаляя элементы массива, которые остановят цикл, когда они встретятся посередине:

argv

Однако это не работает для нечетного числа элементов, поскольку в середине оба realloc() и strtok() это средний элемент, поэтому вы получаете вдвое большее значение.

Поэтому вместо этого я использую еще один странный факт использования циклов Perl: переменная цикла не является копией соответствующей позиции массива, а является ее псевдонимом. Если вы измените atoi() then you change the corresponding array element. In this case I want to both get the value of i[9],j,k;f(char*s){for(s=strtok(s," ");j++,s;i[j]=atoi(s),s=strtok(0," "));while(--j>=++k)printf("%d\n",i[j]+(j==k?0:i[k]));} и измените это на def x(a);puts a.shift.to_i+a.pop.to_i;return if a.length==0;x a;end so that the def f(x): x,o=[int(i) for i in x.split()],[];y=len(x) for i in range(int(y/2)):o+=[x[i]+x[-i-1]] if y%2!=0:o+=[x[int(y/2)]] return o возвращает ноль при обработке среднего элемента. Самый короткий путь (без необходимости func[b][l: length? b repeat n l / 2[print b/(n) + b/(l - n + 1)]if odd? l[print b/(n + 1)]] ) to do that is func[s][b: to-block s l: length? b repeat n l / 2[print b/(n) + b/(l - n + 1)]if odd? l[print b/(n + 1)]] который меняется, например. .pop||0 to {say .shift+(.pop||0) while $_}(.words.Array) который оценивается как Perl6 -ne in a numeric context. The part after the substitution is preserved in def f(s): s=[int(i)for i in s.split(' ')];s.insert(len(s)//2,0) for i in range(len(s)//2):print s[i]+s[-i-1] который будет 1 2 3 4 5 a 6 6 3 ok 2 2 A 4 ok -5 3 -8 2 A -3 -5 ok in the example. And since : A BEGIN DEPTH 1 - ROLL + CR . DEPTH 2 <= UNTIL DEPTH 1 = IF CR . THEN ; возвращает количество замен ( lambda i:[i[x]+i[-(x+1)]for x in range(len(i)/2)]+[i[x+1]]*(len(i)%2) in this case) the expression x оба установят i=map(int,input().split()) for y in[i[x]+i[-(x+1)]for x in range(len(i)/2)]+[i[x+1]]*(len(i)%2):print y to zero and return the original value.

Однако для этого потребуется пробел после i=[*map(int,input().split())] l=len(i) for a,b in zip(i,i[:int(l/2-.5):-1]):print(a+b) if l&1:print(i[l//2]) . So finally I use yet another perl oddity, the fact that the expression stack also uses aliases of the values and variables you are processing. Therefore f(all captured middle numbers) тоже работает. Когда a- -b is put on the expression stack it is not set yet but when next f=x=>([a,m='',b]=x.split(/ (.*) | /),b?a- -b+` `+f(m):a) выполняется, он меняется на старое значение s->{var a=s.split(" ");for(int i=0,l=a.length;i<l--;)System.out.println(i<l?new Long(a[i++])+new Long(a[l]):a[i]);} in place just before the multiplication is done. This is also the reason why the simpler seeming

a->{for(int i=0,l=a.length;i<l--;)System.out.println(i<l?a[i++]+a[l]:a[i]);}

делает нет работа. Первый *.[^*/2,{$_-1...$_/2}].&roundrobin».sum gets changed to .say for .=words[^*/2]Z+ |.[$_-1...$_/2],0 непосредственно перед первым добавлением. Вам нужно будет принудительно скопировать что-то вроде

.&{$_,{S:s/(\S+) (.*?) (\S+)?$ {say $0+($2//0)}/$1/}...''}

чтобы это сработало

 

RussiaFromBig


Рег
09 Aug, 2014

Тем
79

Постов
195

Баллов
630
  • 26, Oct 2024
  • #4

Питон 3, 57 байт, свободный ввод-вывод

-n

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

Впервые вижу f[x]=f[x] in golfing.

r@(_:_) version, 57 bytes

+0

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

unlines.map show ing instead of mapM print ing дает одинаковую длину.

Питон 3, 73 байта, строгий ввод-вывод

mapM print.f.map read.words f(x:r@(_:_))=(x+last r):f(init r) f e=e

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

Это печатает дополнительную новую строку в конце, если количество элементов четное.

 

Kelodwelo21


Рег
24 Oct, 2020

Тем
81

Постов
191

Баллов
606
  • 26, Oct 2024
  • #6

05AB1E, 7 байт

nil

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

Объяснение

last ||answer||

JavaScript (Node.js), 77 58 байт

rest

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

Спасибо @Neil за то, что отрубил сразу 17 байт. Кроме того, я обнаружил, что last works instead of first , который удаляет пару скобок.

Исходное представление, 77 байт

(last l)

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

Введите в виде строки, разделенной пробелами, выведите в виде строки, разделенной символом новой строки. Сначала преобразует входную строку в массив, затем передает рекурсивной функции, которая генерирует выходную строку.

 

Cutesexbadgirll


Рег
11 Oct, 2008

Тем
65

Постов
215

Баллов
570
  • 26, Oct 2024
  • #7

Трах мозгов, 61 байт

(first l)

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

Эта программа принимает на вход список чисел ASCII с основанием 256, заканчивающийся нулем :)

Комментированная версия

rest

Удовлетворение требованиям ввода-вывода, 81 байт

butlast

В этой версии входные символы должны быть разделены, а выходные данные разделены символами новой строки.

 

Arias


Рег
25 Nov, 2007

Тем
72

Постов
180

Баллов
550
  • 26, Oct 2024
  • #8

Желе, 7 байт

loop

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

Принимает список целых чисел, например #(loop [l (map bigint (.split % " "))] (println (+ (first l) (or (last (rest l)) 0))) (if (> (count l) 2) (recur (concat (butlast (rest l)))))) . Outputs as an array, such as #(loop[l(map bigint(.split %" "))](println(+(first l)(or(last(rest l))0)))(if(>(count l)2)(recur(concat(butlast(rest l)))))) .

11 байт соответствовать строгим входным спецификациям.

 

Маришик


Рег
16 Nov, 2011

Тем
73

Постов
191

Баллов
576
  • 26, Oct 2024
  • #9

Дж, 28 байт

f s|x<-read<$>words s=mapM print$zipWith(+)(take(div(1+length x)2)x)$reverse$0:x

не забитый в гольф

NoMethodError

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

Мой J заржавел, и его, безусловно, можно улучшить — предложения приветствуются. Почти вся сложность возникает из-за случая нечетной длины и требования перевода строки. У меня было 22 байта, прежде чем я заметил требование новой строки:

redo ||answer||

Р, 68 66 байт

loop{}

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

Принимает входные данные со стандартного ввода, как в примерах, и печатает выходные данные на стандартный вывод. С момента использования ->a{puts a.shift+(a.pop||0);redo} is typically shorter than defining a function and taking an array as input, this is the shortest way to take input.

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

 

Delitdaddy


Рег
17 May, 2005

Тем
86

Постов
186

Баллов
636
  • 26, Oct 2024
  • #12

Руби + -p , 52 bytes (spec compliant)

a=$_.split.map(&:to_i);loop{puts a.shift+(a.pop||0)}

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

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

Обычно -p flag forces you to reassign the a=[*map(int,input().split())] l=len(a) for q in[a[i]+a[~i]for i in range(l//2)]+l%2*[a[l//2]]:print(q) переменная, так как она будет неявно выведена в конце программы. Однако этот код заканчивается lambda a:[a[i]+a[~i]for i in range(len(a)//2)]+len(a)%2*[a[len(a)//2]] when it calls len(x)>1 на x[1:] (the result of f=lambda x:x[1:]and[x[0]+x[-1]]+f(x[1:-1])or x оторвав голову от пустого массива), прежде чем произойдет неявная печать.

Руби, 33 байта (расслабленный ввод-вывод)

scan()

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

Эта лямбда пропускает код синтаксического анализа целых чисел и позволяет сэкономить 2 байта, заменив cat(c((n=scan())[y<-1:(x=sum(n|1)/2)],rep(0,x!=x%/%1))+rev(n[-y])) with >.@-:@# ({. +/@,: |.@}.) ] поскольку он уже находится внутри повторяемого блока. Это также заканчивается >.@-:@# ({. |:@,:@+/@,: |.@}.) ] .

 

M1koLa


Рег
26 Feb, 2006

Тем
73

Постов
173

Баллов
558
  • 26, Oct 2024
  • #14

Кложур, 124 байта

[6, 6, 3]

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

Негольфед:

[1, 2, 3, 4, 5]

Анонимная функция, которая принимает входную строку и разделяет ее. œs2U2¦S is rerun with every iteration with the "middle" items of the changing list if there are enough items left. Combining >>+[>,>,[-]<]<[<]>->[[-<<+>>]>[>]<[[<]<<+>>>[>]<-]<[<]>]<<<[<]>[.[-]++++++++++.>] and Read input chars until \0 >>+[>,]< Clear initial 1 [<]>-> [ Copy two to the left [-<<+>>]> Head to right side [>]< Subtract from right side add to left side repeat [[<]<< +>>> [>]< - ] Start at next spot <[<]> ] Print it all out <<< [<] >[.>] creates the "middle" list.
Интересна та часть, где выводится сумма. Просто добавив >>+[>,]<[<]>->[[-<<+>>]>[>]<[[<]<<+>>>[>]<-]<[<]>]<<<[<]>[.>] and a=>g(a.split` `.map(x=>+x)) g=a=>a.shift()+(a.pop()|0)+` `+(a.length?g(a):'') работает только для четного количества элементов. При передаче нечетного количества элементов |0 and ~~ попадет в тот же предмет. С использованием a=>g(a.split` `) g=a=>+a.shift()+~~a.pop()+` `+(a+a&&g(a)) will remove the first item, in this case the only one, and return an empty list. Using # # split input on spaces 2ä # divide into 2 parts ` # split separately to stack R # reverse the second one + # add the lists of numbers » # join on newlines вернется #2ä`R+» which is converted into zero by the _=>{for(_=_.split(' ').map(Number);0<_.length;)console.log(1<_.length?_.shift()+_.pop():_.pop())} функция.

 

Primipil


Рег
04 Aug, 2011

Тем
81

Постов
185

Баллов
630
  • 26, Oct 2024
  • #15

Хаскелл, 78 72 70 67 байт

a=*map(int,input().split()), while len(a)>1:x,*a,y=a;print(x+y) print(*a)

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

Правки:

  • -6 байт при использовании return instead of print от Ответ GolfWolf на Haskell.
  • -2 байта путем удаления def f(a): try:x,*a,y=a;print(x+y);f(a) except:print(*a) which I though was necessary for type inference but wasn't. Thanks to GolfWolf for pointing out.
  • -3 байта путем добавления print to make the try..except шаблон лишний. Еще раз спасибо GolfWolf.
 

Grewnuk


Рег
05 Mar, 2015

Тем
72

Постов
172

Баллов
552
  • 26, Oct 2024
  • #18

JavaScript (Node.js), 56 байт

s//a/

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

Разделите строку на все средние числа и соберите их все как группу, добавьте концы (приведение строк к числам через $' , which is shorter than any alternatives I know of), and concatenate the result with a line break and $'*s//a/ где доступно.

 

Alyohin


Рег
29 May, 2007

Тем
49

Постов
202

Баллов
457
  • 26, Oct 2024
  • #19

Питон 3, 108 байт

say

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

Неконкурентно, просто подумал, что было бы неплохо поделиться этим подходом с застежкой-молнией :)
Жаль, что нарезка и реверсирование в Python немного привередливы.

 

Anfet


Рег
03 Apr, 2014

Тем
49

Постов
177

Баллов
432
  • 26, Oct 2024
  • #20

Питон 2, 111 107 103 байт

$_

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

Принимает входные данные в «строгом» формате (строка чисел, разделенных пробелами) и выводит завершающую новую строку, если счетчик четный. Работает, потому что в Python 2 из списков вытекает последнее значение переменной. s//a/*$' so it can be used later to identify the middle number.

Питон 2, 79 75 69 байт

1

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

Укороченная версия с вводом и выводом в виде списков. Добавляет пустую строку в вывод для четных чисел.

 

Larisa_E


Рег
19 Sep, 2013

Тем
96

Постов
215

Баллов
725
  • 26, Oct 2024
  • #21

ФОРТ 76 байт

s///

Выход:

6 ||answer||

Питон 2, 112 байт

$' ||answer||

Perl 6/Ракудо 45 байт

0

a6

Супер простой, сдвиги и всплывающие окна, Perl упрощает работу с пустым списком (с нечетным числом) с помощью 6 .

 

Belisity


Рег
04 Apr, 2009

Тем
81

Постов
202

Баллов
627
  • 26, Oct 2024
  • #25

С, 128 байт

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

$_

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

Я позволяю C выполнить токенизацию за меня, что позволяет мне отправлять каждую строку непосредственно в $_ . Afterwards, I just add the mirror indexes until the start>end.

Поскольку я не мог получить длину массива и pop@F destroys the original string, making backtracking difficult, and I didn't want to have to $_ чтобы изменить размер массивов, я жестко запрограммировал массив максимум с 9 значениями.

C, 107 байт (используется say$_+pop@F for@F )

pop

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

Эта версия использует тот факт, что $_ already has been tokenized; as a bonus, it doesn't have a hard-coded limit on the number of numbers! It does, however, assume that #!/usr/bin/perl -a say$'*s//a/+pop@F for@F , что действительно зло и непереносимо.

 

Vello


Рег
07 Jul, 2006

Тем
81

Постов
172

Баллов
577
  • 26, Oct 2024
  • #26

PHP, 107 байт

Новичок в этом, поэтому, пожалуйста, простите мне отсутствие правильного форматирования.

-a

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

 

Savabond


Рег
01 Apr, 2007

Тем
71

Постов
170

Баллов
575
  • 26, Oct 2024
  • #27

Java (OpenJDK 8), 163 байта

L Concatenate all inputs into list 2M Create two equal-ish size batches, with the bigger piece first Er Push the two parts to the stack, and reverse the second one LM Put two parts back together as 2-row matrix, then transpose m|+ For each zipped pair, print the sum on a separate line

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

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

Объяснение:

Φ┴⌐Öâ9|Ö
 

Archery


Рег
06 May, 2014

Тем
71

Постов
189

Баллов
574
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно