Стрелка этих переменных!


29

Вызов

Робину нравится иметь объявление переменных в форме стрелки. Вот как он это делает:

  • Введите любое количество строк
  • Упорядочить их по возрастанию
  • Выведите их, упорядоченные по середине, чтобы примерно сформировать отрицательный наконечник стрелки, вот так (в зависимости от того, какой порядок в гольфе лучший):

    5  or  4
    3      2
    1      1
    2      3
    4      5
    

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

Входные данные:

bow
arrows
sheriffOfNottingham
kingRichard
maidMarian
princeJohn
sherwoodForest

Выход:

sheriffOfNottingham
kingRichard
maidMarian
bow
arrows
princeJohn
sherwoodForest

Входные данные:

a
bb
cc

Вывод (оба действительны):

bb
a
cc

cc
a
bb

Входные данные:

one
four
seven
fifteen

Возможный вывод (единственный другой допустимый вывод - его вертикальное зеркало):

seven
one
four
fifteen

Заметки

  • Строки находятся в camelCase и не имеют цифр или специальных символов, только строчные и прописные буквы.

  • Входными данными могут быть все что угодно: через запятую как одна строка, массив, ... Разрешен любой формат ввода / вывода.

  • Между строками одинаковой длины принимается любой заказ.

Я чувствую, что раньше был очень похожий вызов ... но добро пожаловать в PPCG!
Джузеппе

@ Giuseppe Да, это то, что я подумал после публикации, нет способа, которым это не было сделано раньше. Не могли бы вы удалить меня сейчас, когда вы ответили?
Телепортирующаяся коза

1
ну, я искал обман, но я не очень хорош в поиске ... у нас есть песочница для публикации заданий, которые часто могут поймать такие вещи. Я в порядке, если вы удалите его, если вы беспокоитесь, что это обман.
Джузеппе

1
Все в порядке, мы все начинаем с самого начала :-)
Джузеппе

1
Не могли бы вы добавить контрольный пример с четным числом строк?
Sherlock9

Ответы:


15

Python 2 , 47 байт

lambda l:l.sort(key=len)or l[1::2][::-1]+l[::2]

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


Вам нужно переставить некоторые вещи, но вы можете использовать [::-2]непосредственно, чтобы сохранить 5 байтов.
Sherlock9

@ Sherlock9 Я попробовал это, но потом мне пришлось проверить длину, так как списки с четной / неравной длиной должны обрабатываться по-разному.
овс

Также работает для Python 3. Будет ли приемлемым удаление "lambda l:" и "or" и сделать его в 2 строки для сохранения 11 байтов, поскольку "Любой формат ввода / вывода разрешен"?
картофель

9

R , 63 48 байт

function(L)c(rev(o<-L[order(nchar(L))]),o)[!0:1]

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

Сортируйте по длине строки, затем объедините перевернутый список с отсортированным списком, наконец, возьмите каждый 2-й элемент, начиная с 1 на основе индекса 1.


1
o<-L[...Другой способ «стрелочные переменные». Менее важный в стороне, pryr::f(...)работает здесь за 46. Попробуйте онлайн!
Преступно-

@CriminallyVulgar, используя дополнительные библиотеки, превращает это в отдельный язык, R + pryrпоэтому я обычно избегаю этого, если нет веской причины - как и в вопросах теории чисел, numbers- это необходимо.
Джузеппе

7

JavaScript 77 байт

Принимает ввод как массив строк, выводит отсортированный по стрелкам массив строк.

s=>s.sort((a,b)=>a.length-b.length).reduce((m,x,i)=>i%2?[...m,x]:[x,...m],[])

объяснение

s =>                                 // take input as an array of strings s
  s.sort((a,b)=>a.length-b.length)   // sort input by string length
  .reduce(                           // reduce
    (m,x,i)=>i%2?[...m,x]:[x,...m],  // if index is even, stick string x at the end of the memo
                                     // array, else at the beginning
    []                               // memo initialized to empty array
  )

1
Я не думаю, что вы должны считать f=. 77
Дана

Это несовместимо с представлениями гольфа js code из того, что я видел. Я рад исключить это, если это не считается.
asgallant

2
Я думаю, это зависит от того, использует ли ваша функция рекурсию. то есть f=x=>x?f(x-1). Если это так, вам нужно включить его, fтак как вы вызываете его в своей функции. Однако, поскольку вы не используете рекурсию, вам не нужно включать ее f. В Meta есть несколько постов, этот, кажется, объясняет это немного лучше. codegolf.meta.stackexchange.com/a/9032/8340
дана

Это объяснило бы несоответствия, которые я видел.
asgallant


5

K (ок) , 24 байта

Решение:

x(<#:'x)(|&~w),&w:2!!#x:

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

Объяснение:

Создайте 6 4 2 0 1 3 5последовательность, используйте ее для индексации входных длин по возрастанию и используйте ее для индексации исходного массива:

x(<#:'x)(|&~w),&w:2!!#x: / the solution
                      x: / save input as x
                     #   / count (#) of x
                    !    / range 0 to ...
                  2!     / modulo 2
                w:       / save as w
               &         / indices where true
              ,          / join with
        (    )           / do this together
           ~w            / not (~) w
          &              / indices where true
         |               / reverse
 (     )                 / do this together
   #:'x                  / count (#:) of each (') x
  <                      / indices to sort ascending
x                        / index into x



5

05AB1E , 6 5 байт

Сохранено 1 байт благодаря Кевину Круйссену

I / O - это список строк.
Ссылка изменена для ввода / вывода с разделением новой строки для упрощения тестирования.

éι`Rì

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

объяснение

é       # sort by length ascending
 ι      # uninterleave into 2 parts, both sorted ascending
   `    # push the 2 parts separately to the stack
    R   # reverse the second part
     ì  # and append it to the first

Вы можете удалить первое Rи заменить «на, iчтобы сохранить байт, так как третье правило маркированного пункта допускает обе версии не чередования.
Кевин Круйссен

@KevinCruijssen: О да, спасибо!
Эминья

5

J 11 байт

,~`,/@\:#&>

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

Сначала разберемся.

Затем мы уменьшаем форму списка справа налево, но чередуя, с какой стороны мы помещаем новый элемент. Выполнено.


Очень хорошо! Хотя в конце у вас есть пробел, удалите его на 11 байт :)
Гален Иванов

1
Спасибо, Гален. Исправлена!
Иона

4

PowerShell , 66 байт

1..($a=$args|sort l*).count|?{$_%2}|%{$a[-$_];$x=,$a[-++$_]+$x};$x

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

Принимает ввод через splatting, который проявляется в TIO как отдельные аргументы командной строки. sorts на lанглийском языке, сохраняет его в $aи строит диапазон от 1до countвходных строк. Затем мы вытаскиваем только нечетные ?{$_%2}и подаем их в цикл |%{...}. На каждой итерации мы помещаем «последний», затем «третий из последнего» и так далее в конвейер с помощью $a[-$_]. Отдельно мы также накапливаемся во $x«второе от последнего», «четвертое от последнего» и т. Д. Вне цикла и конвейер сбрасывается (поэтому эти элементы выводятся), а затем мы выводим $x. В обоих случаях вывод по умолчанию дает нам новые строки между элементами автоматически.


4

PHP ,144 141 байт

function($a){usort($a,function($b,$c){return strlen($b)-strlen($c);});$e=[];foreach($a as$d)(array_.[unshift,push][++$i%2])($e,$d);return$e;}

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

-3 байта благодаря @Ismael Miguel !


хороший. Где я могу прочитать больше о [array_unshift,array_push][++$i%2]($e,$d)?
abhig10

2
@ abhig10 точно. Это массив с двумя именами функций ['array_push','array_unshift']с [++$i%2]как индекс переменного массива между а 0и 1так будет оценивать в другой функции каждый раз. «Переменные функции» в PHP позволяют назначать переменную функции и выполнять ее, вызывая скобки (например, $f='array_push'; $f($e,$d);== array_push($e,$d)), чтобы ($e,$d)затем вызывать оцениваемый элемент массива. Просто более короткий способ сделать if (++$i%2) array_push($e,$d); else array_unshift($e,$e);. Полагаю, что в конце концов был какой-то синтаксический код PHP
640 КБ

Ладно, мне понадобилось время, чтобы понять это. Потрясающе.
abhig10

1
Вы можете сохранить 3 байта, заменив [array_unshift,array_push][++$i%2]($e,$d)на (array_.[unshift,push][++$i%2])($e,$d). Что я сделал, так это удалил повторный array_, связал его, а затем результат передается на вызов.
Исмаэль Мигель

1
@IsmaelMiguel это великолепно. Спасибо!
640KB

4

MATLAB, 87 байт

function f(y);[B,I]=sort(cellfun(@(x)length(x),y));{y{flip(I(1:2:end))},y{I(2:2:end)}}'

Принимает ввод как массив ячеек строк, выводит столбец строк (не уверен, что это допустимо)

> s = {'qweq qwe qw','qweqw','12132132131231231','asdasdasda','qwe','w'};
> f(s)
> >> 
> ans =
> 
>   6×1 cell array
> 
>     {'qweq qwe qw'      }
>     {'qweqw'            }
>     {'qwe'              }
>     {'1234'             }
>     {'asdasdasda'       }
>     {'12132132131231231'}

PS: спасибо Sanchises за указание на ошибку с вводом нечетной длины


Это не удается на нечетном количестве входных строк, напримерf({'loooooooong','medium','short'})
Sanchises

Также некоторые общие советы по игре в гольф: не endявляется обязательным для function. Использование function x=f(y);x={...}'короче чем function f(y);disp({...}').
Санчизес


@Sanchises спасибо за указание на ошибку. Я сделал это точно так же, как ты. Моя проблема в dispтом, что я не уверен, каковы правила вывода. Это должен быть чистый текст или нет? или disp({...})все в порядке или даже так, x={...}как вы предлагаете
ааааа говорит восстановить Монику

1
Это может быть 58 байтов в октаве.
Джузеппе

3

APL (Dyalog Unicode) , 18 байтов SBCS

{⍵[⍋-@(2∘|)⍋⍋≢¨⍵]}

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

Исправлена ​​ошибка благодаря @ngn.

Объяснение:

{⍵[⍋-@(2∘|)⍋⍋≢¨⍵]}
{                }  Function. Takes a single argument: ⍵, list of strings
             ≢¨⍵    The length of each element in the list
           ⍋⍋       Sort the lengths
    -@(2∘|)         At (@) elements divisible by 2 (|), negate (-)
                        gives -1 2 -3 4 -5
                   Sort this list again, gives the indices of that list ^ sorted
 ⍵[             ]   Use these indices to index into the argument

¹


1
≢¨×¯1*⍳∘⍴-> (⊢∘-\≢¨)и это становится еще короче, если вы превратите его в dfn
ngn

1
Тем не менее, я не уверен, что этот алгоритм правильный. мы должны отрицать длину каждой другой строки в их отсортированном порядке, а не в том порядке, в котором они поступают из входных данных
ngn

2

APL + WIN, 31 38 байт

Смотрите комментарий Адамса

⊃n[(⍳⍴n)~a],⌽n[a←2×⍳⌊.5×⍴n←n[⍒∊⍴¨n←⎕]]

Попробуй онлайн. Любезность Dyalog Classic!

Запрашивает вложенный вектор строк


У APL + нет Monadic "tally" для замены ∊⍴?
Адам

1
Сбой на '12' '1234' '1234' '1234' '1234' '12345678' '12345678' '12345678' '12345678'. Ясно, что результат должен был быть'12345678' '12345678' '1234' '1234' '12' '1234' '1234' '12345678' '12345678'
Адам

@ Adám Моя древняя версия APL + не имеет ≢. Согласен на ваш второй комментарий, я посмотрю на него завтра.
Грэм

2

Сетчатка , 26 байт

N$`
$.&
*\,2,^A`.+
,2,G`.+

Попробуйте онлайн! Объяснение:

N$`
$.&

Сортировать строки в порядке возрастания длины ( $.&возвращает длину строки).

*\,2,^A`.+

Временно удалите альтернативные строки и выведите оставшиеся строки в обратном порядке.

,2,G`.+

Сохраните единственные строки, которые были временно удалены, и выведите их.


2

Gaia , 10 байт

el∫v:v+2%ụ

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

e		| eval as Gaia code (list of strings)
 l∫		| ∫ort by lengths (ascending)
   v:v		| reverse, dup, reverse
      +		| concatenate lists
       2%	| take every other element
         ụ	| join by newlines and output

4
мне нравится, что ваши комментарии в развернутом коде образуют строчку строк
ааааа говорит восстановить Монику

2

Japt, 8 байт

ñÊó g0_w

-3 байта благодаря Шегги!

Попытайся


10 байтов с выводом в виде 2D-массива, что, по-видимому, разрешено.
Лохматый

Или, может быть, 8 байтов ? На моем телефоне, так что не проверял это должным образом.
лохматый

@ Shaggy Я искал функцию, чтобы найти каждый n-й элемент, но я не мог найти его. Благодарность!
Воплощение Невежества

также есть, A.ë()но я не знаю, приведет ли это к более короткому решению.
Лохматый




1

Javascript 95 байт

s=>s.sort((x,y)=>x.length-y.length).reduce((a,e,i)=>{i%2?a.push(e):a.unshift(e);return a;},[]);

-1 s.sort() сортирует строки лексикографически, а не по длине строки.
asgallant

Право, (x, y) => x.length-y.length, должно это исправить.
Сомсом



1

C (gcc) , 136 128 байтов

S(a,b)int**a,**b;{a=strlen(*b)-strlen(*a);}f(l,s,o,i,b,e)int**s,**o;{qsort(s,l,8,S);e=l-1;for(i=b=0;i-l;)o[i++%2?b++:e--]=s[i];}

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

-8 байт благодаря потолку.

Функция fявляется решением. Он принимает количество строк, сами строки и выходной буфер в качестве аргументов (плюс еще четыре, используемые внутри).



@TeleportingGoat Вероятно, потому что их нижний колонтитул использует все argv, включая имя файла
Джо Кинг

Точно, это был просто быстрый тест. Можно построить любые данные, которые принимают соответствующий формат. Я обновлю ссылку TIO позже.
LambdaBeta

ха-ха, проблема с этими короткими именами переменных: вы забываете, что tвам нравится, и сохраняете это, даже если вам это не нужно!
LambdaBeta


0

Japt , 8 байт

Ввод в виде массива строк, вывод в виде массива из 2 массивов строк, по одному на каждую половину списка.

ñÊó
hUÎÔ

Попробуйте (дополнительный код для ввода / вывода в виде строки, разделенной новой строкой)

ñÊó      :Implicit input of array U
ñ        :Sort by
 Ê       :  Length
  ó      :Uninterleave

hUÎÔ     :Newline reassigns to U
h        :Set the first element in U to
 UÎ      :  The first element in U
   Ô     :  Reversed

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.