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

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.

Giuseppe
источник
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
  )
asgallant
источник
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
streetster
источник
5

Желе , 9 8 байт

LÞŒœm"-Ẏ

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

LÞŒœṚ;¥/

также 8 байтов.

Спасибо @EriktheOutgolfer и @JonathanAllan за то, что оба предложили игру в гольф для экономии байта.

Ник Кеннеди
источник
Ницца! Умный гольф: Ṛ€1¦может стать m"-.
Эрик Outgolfer
Или вы можете пойти наLÞŒœṚ;¥/
Джонатан Аллан
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
Emigna
источник
Вы можете удалить первое 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. В обоих случаях вывод по умолчанию дает нам новые строки между элементами автоматически.

AdmBorkBork
источник
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 !

640 КБ
источник
хороший. Где я могу прочитать больше о [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
Giuseppe
источник
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;},[]);
somsom
источник
-1 s.sort() сортирует строки лексикографически, а не по длине строки.
asgallant
Право, (x, y) => x.length-y.length, должно это исправить.
Сомсом
1

Perl 5 ( -p0777F/\n/ -M5.01), 59 байт

for$x(sort{$b=~y///c-length$a}@F){--$|?$\="$x
".$\:say$x}}{

TIO

Науэль Фуйе
источник
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является решением. Он принимает количество строк, сами строки и выходной буфер в качестве аргументов (плюс еще четыре, используемые внутри).

LambdaBeta
источник
Почему ./.bin.tioв выходной ?
телепортирующийся козел
@TeleportingGoat Вероятно, потому что их нижний колонтитул использует все argv, включая имя файла
Джо Кинг
Точно, это был просто быстрый тест. Можно построить любые данные, которые принимают соответствующий формат. Я обновлю ссылку TIO позже.
LambdaBeta
ха-ха, проблема с этими короткими именами переменных: вы забываете, что tвам нравится, и сохраняете это, даже если вам это не нужно!
LambdaBeta
122 байта
ceilingcat
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
мохнатый
источник
0

Haskell , 104 96 байт

import Data.List
f s=splitAt((length s+1)`div`2)s
g=sortOn length
h(x,y)=reverse(g x)++g y
z=h.f

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

ошибки
источник
Неправильно, вы должны отсортировать перед разрезанием списка пополам
только ASCII
90
только ASCII