Стріліть ці змінні!


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
Чи можете ви додати тестовий випадок з парною кількістю рядків?
Шерлок9

Відповіді:


15

Python 2 , 47 байт

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

Спробуйте в Інтернеті!


Вам потрібно буде переставити деякі елементи, але ви можете використовувати [::-2]безпосередньо, щоб зберегти 5 байт.
Шерлок9,

@ Sherlock9 Я спробував це, але потім мені довелося перевірити довжину, оскільки списки з рівними / нерівними довжинами доводиться обробляти по-різному.
ов

Також працює для Python 3. Чи буде видалення "лямбда l:" і "або" в 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 з того, що я бачив. Я радий виключити це, якщо він не враховує.
asgallant

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

Це пояснило б невідповідність, яку я бачив.
asgallant


5

K (oK) , 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

Желе , 9 8 байт

LÞŒœm"-Ẏ

Спробуйте в Інтернеті!

LÞŒœṚ;¥/

також 8 байт.

Дякуємо @EriktheOutgolfer та @JonathanAllan за те, що вони пропонували гольфів, щоб зберегти байт.


Приємно! Розумний гольф: Ṛ€1¦може стати m"-.
Ерік Аутгольфер

Або ви могли піти наLÞŒœṚ;¥/
Джонатан Аллан


5

05AB1E , 6 5 байт

Збережено 1 байт завдяки Kevin Cruijssen

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

Спробуйте в Інтернеті!

Здійснює введення через бризки, що проявляється в TIO як окремі аргументи командного рядка. sorts на length, зберігає це в $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 це геніально. Дякую!
640 Кб

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={...}як ви пропонуєте
aaaaa каже відновити Моніку

1
Це може бути 58 байт в Octave.
Джузеппе

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 "підрядно" замінити ∊⍴?
Адам

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

Гая , 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
мені подобається, що ваші коментарі в розгорнутому коді утворюють стрілку з рядків
aaaaa каже відновити Моніку

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, це має виправити.
somsom



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, що включає ім'я файлу
Jo King

Точно, це було просто швидке випробування. Можна сконструювати будь-які дані, що мають відповідний формат. Я поновлю посилання 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.