Mũi tên các biến!


29

Thử thách

Robin thích khai báo các biến của mình theo hình mũi tên. Đây là cách anh ấy làm điều đó:

  • Nhập bất kỳ số lượng chuỗi
  • Đặt hàng chúng theo chiều dài tăng dần
  • Xuất chúng theo thứ tự ở giữa để tạo thành một đầu mũi tên âm, như thế này (tùy theo thứ tự golf tốt nhất):

    5  or  4
    3      2
    1      1
    2      3
    4      5
    

Các trường hợp thử nghiệm

Đầu vào:

bow
arrows
sheriffOfNottingham
kingRichard
maidMarian
princeJohn
sherwoodForest

Đầu ra:

sheriffOfNottingham
kingRichard
maidMarian
bow
arrows
princeJohn
sherwoodForest

Đầu vào:

a
bb
cc

Đầu ra (cả hai đều hợp lệ):

bb
a
cc

cc
a
bb

Đầu vào:

one
four
seven
fifteen

Đầu ra có thể (chỉ đầu ra hợp lệ khác là gương dọc của nó):

seven
one
four
fifteen

Ghi chú

  • Các chuỗi nằm trong camelCase và không có số hoặc ký tự đặc biệt, chỉ có chữ thường và chữ in hoa.

  • Đầu vào có thể là bất cứ thứ gì bạn thích: được phân tách bằng dấu phẩy dưới dạng một chuỗi, mảng, ... Bất kỳ định dạng I / O nào đều được phép.

  • Giữa các chuỗi có cùng độ dài, bất kỳ thứ tự nào được chấp nhận.

Tôi cảm thấy như có một thử thách rất giống trước đây ... nhưng chào mừng bạn đến với PPCG!
Giuseppe

@Giuseppe Vâng, đó là những gì tôi nghĩ sau khi đăng, không có cách nào nó chưa được thực hiện trước đó. Bạn có ổn không khi tôi xóa nó ngay bây giờ khi bạn trả lời nó?
Dịch chuyển dê

1
Vâng, tôi đã tìm kiếm một bản dupe nhưng tôi không giỏi tìm kiếm ... chúng tôi có một hộp cát để đăng các thử thách thường có thể bắt gặp những thứ như vậy. Tôi hoàn toàn ổn khi bạn xóa nó nếu bạn lo lắng về việc nó bị lừa.
Giuseppe

1
Không sao, tất cả chúng ta đều bắt đầu lại từ đầu :-)
Giuseppe

1
Bạn có thể thêm một trường hợp thử nghiệm với số chuỗi chẵn không?
Sherlock9

Câu trả lời:


15

Python 2 , 47 byte

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

Hãy thử trực tuyến!


Bạn sẽ cần sắp xếp lại một số thứ, nhưng bạn có thể sử dụng [::-2]trực tiếp để tiết kiệm 5 byte.
Sherlock9

@ Sherlock9 Tôi đã thử điều đó, nhưng sau đó tôi phải kiểm tra độ dài, vì các danh sách có độ dài chẵn / không đều phải được xử lý khác nhau.
trứng

Cũng hoạt động với Python 3. Sẽ loại bỏ "lambda l:" và "hoặc" và làm cho nó trên 2 dòng để lưu 11 byte vẫn được chấp nhận vì "Bất kỳ định dạng I / O nào đều được phép"?
khoai tây

9

R , 63 48 byte

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

Hãy thử trực tuyến!

Sắp xếp theo độ dài chuỗi, sau đó kết hợp danh sách đảo ngược với danh sách được sắp xếp, cuối cùng, lấy mọi phần tử thứ 2, bắt đầu từ chỉ số 1 dựa trên 1.


1
o<-L[...Cách khác để "biến mũi tên". Một bên ít quan trọng hơn, pryr::f(...)làm việc ở đây cho 46. Hãy thử trực tuyến!
CriminallyVulgar

@CriminallyVulgar sử dụng các thư viện bổ sung biến ngôn ngữ này thành ngôn ngữ riêng, R + pryrđó là lý do tại sao tôi thường tránh làm điều đó trừ khi có lý do chính đáng - như đối với các câu hỏi lý thuyết số, numberslà không thể thiếu.
Giuseppe

7

Javascript 77 byte

Lấy đầu vào là một chuỗi các chuỗi, xuất ra một chuỗi các chuỗi được sắp xếp theo mũi tên.

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

Giải trình

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
Tôi không nghĩ bạn phải đếm f=. 77
dana

Điều đó không nhất quán trong các bài nộp golf mã js từ những gì tôi đã thấy. Tôi rất vui khi loại trừ nó nếu nó không được tính.
ngày

2
Tôi nghĩ rằng nó phụ thuộc vào việc chức năng của bạn sử dụng đệ quy. tức f=x=>x?f(x-1). Nếu vậy, bạn cần bao gồm fvì bạn đang gọi nó trong chức năng của bạn. Tuy nhiên, vì bạn không sử dụng đệ quy, bạn không nên đưa vào f. Có một số bài viết trong Meta, bài này dường như giải thích nó tốt hơn một chút. codegolf.meta.stackexchange.com/a/9032/8340
dana

Điều đó sẽ giải thích sự mâu thuẫn tôi đã thấy.
ngày


5

K (oK) , 24 byte

Dung dịch:

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

Hãy thử trực tuyến!

Giải trình:

Tạo 6 4 2 0 1 3 5chuỗi, sử dụng chuỗi đó để lập chỉ mục theo chiều dài tăng dần của đầu vào và sử dụng chuỗi đó để lập chỉ mục vào mảng ban đầu:

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 byte

Đã lưu 1 byte nhờ Kevin Cruijssen

I / O là một danh sách các chuỗi.
Liên kết được sửa đổi cho I / O được phân tách dòng mới để kiểm tra dễ dàng hơn.

éι`Rì

Hãy thử trực tuyến!

Giải trình

é       # 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

Bạn có thể loại bỏ cái đầu tiên Rvà thay thế «bằng iđể lưu một byte, vì quy tắc dấu đầu dòng thứ ba cho phép cả hai phiên bản không xen kẽ.
Kevin Cruijssen

@KevinCruijssen: Ồ vâng, Cảm ơn!
Emigna

5

J , 11 byte

,~`,/@\:#&>

Hãy thử trực tuyến!

Chúng tôi sắp xếp nó xuống đầu tiên.

Sau đó, chúng tôi giảm mẫu danh sách từ phải sang trái, nhưng xen kẽ bên nào chúng tôi đặt phần tử mới vào. Làm xong.


Rất đẹp! Bạn có một khoảng trống ở cuối, hãy xóa nó trong 11 byte :)
Galen Ivanov

1
Cảm ơn Galen. Đã sửa!
Giô-na

4

PowerShell , 66 byte

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

Hãy thử trực tuyến!

Đưa đầu vào thông qua tính năng ghép hình, biểu hiện trên TIO dưới dạng đối số dòng lệnh riêng biệt. sorts trên length, lưu trữ nó vào $avà xây dựng một phạm vi từ 1lên đến các countchuỗi đầu vào. Sau đó chúng tôi chỉ rút ra những cái lẻ ?{$_%2}và đưa chúng vào một vòng lặp |%{...}. Mỗi lần lặp lại, chúng tôi đặt "lần cuối", rồi "lần thứ ba từ lần cuối", và cứ thế tiếp tục với đường ống dẫn $a[-$_]. Một cách riêng biệt, chúng tôi cũng tích lũy vào $x"thứ hai từ cuối", "thứ tư từ cuối", v.v ... Ra khỏi vòng lặp và đường ống được tuôn ra (vì vậy các yếu tố đó là đầu ra) và sau đó chúng tôi xuất ra $x. Trong cả hai trường hợp, đầu ra mặc định cung cấp cho chúng tôi dòng mới giữa các mục tự động.


4

PHP ,144 141 byte

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;}

Hãy thử trực tuyến!

-3 byte nhờ @Ismael Miguel !


tốt đẹp Tôi có thể đọc thêm về [array_unshift,array_push][++$i%2]($e,$d)đâu?
abhig10

2
@ abhig10 chắc chắn. Đó là một mảng với hai tên hàm ['array_push','array_unshift']với [++$i%2]chỉ số của mảng xen kẽ giữa một 0hoặc 1nhiều lần sẽ đánh giá cho hàm khác mỗi lần. "Các hàm biến" của PHP cho phép bạn gán một biến cho một hàm và thực hiện bằng cách gọi bằng dấu ngoặc đơn (ví dụ: $f='array_push'; $f($e,$d);== array_push($e,$d)) để ($e,$d)sau đó gọi phần tử được đánh giá của mảng. Chỉ là một cách ngắn hơn để làm if (++$i%2) array_push($e,$d); else array_unshift($e,$e);. Đoán có một số cú pháp cú pháp PHP sau khi tất cả!
640KB

Được rồi, đôi khi tôi phải hiểu điều này. Tuyệt vời.
abhig10

1
Bạn có thể lưu 3 byte bằng cách thay thế [array_unshift,array_push][++$i%2]($e,$d)bằng (array_.[unshift,push][++$i%2])($e,$d). Những gì tôi đã làm là để loại bỏ lặp đi lặp lạiarray_ , nối nó và sau đó kết quả được chuyển đến cuộc gọi.
Ismael Miguel

1
@IsmaelMiguel thật tuyệt vời. Cảm ơn bạn!
640KB

4

MATLAB, 87 byte

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

Lấy đầu vào là mảng ô của chuỗi, đầu ra cột của chuỗi (không chắc chắn nếu đó là hợp pháp)

> 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: Cảm ơn Sanchises đã chỉ ra một lỗi với đầu vào có độ dài lẻ


Điều này không thành công với số chuỗi đầu vào lẻ, ví dụ:f({'loooooooong','medium','short'})
Tăng

Ngoài ra một số mẹo chơi golf nói chung: endlà tùy chọn cho a function. Sử dụng function x=f(y);x={...}'ngắn hơn function f(y);disp({...}').
Sanchises


@Sanchise cảm ơn vì đã chỉ ra lỗi. Tôi đã sửa nó chính xác như bạn đã làm. Vấn đề của tôi displà tôi không chắc chắn các quy tắc đầu ra là gì. Có nên là văn bản thuần túy hay không? hoặc disp({...})là ổn hoặc thậm chí đúng x={...}như bạn đề xuất
aaaaa nói phục hồi lại

1
Điều này có thể là 58 byte trong Octave.
Giuseppe

3

APL (Dyalog Unicode) , 18 byte SBCS

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

Hãy thử trực tuyến!

Đã sửa lỗi nhờ @ngn.

Giải trình:

{⍵[⍋-@(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*⍳∘⍴-> (⊢∘-\≢¨)và nó thậm chí còn ngắn hơn nếu bạn biến nó thành một dfn
ngn

1
tuy nhiên, tôi không chắc thuật toán này là chính xác. chúng ta nên phủ định độ dài của mọi chuỗi khác theo thứ tự được sắp xếp của chúng, không phải theo thứ tự chúng đến từ đầu vào
ngn

2

APL + THẮNG, 31 38 byte

Xem bình luận của Adams

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

Hãy dùng thử trực tuyến Lịch sự của Dyalog Classic!

Lời nhắc cho một vectơ lồng nhau của chuỗi


APL + không có "kiểm đếm" Monadic để thay thế ∊⍴?
Adám

1
Thất bại trên '12' '1234' '1234' '1234' '1234' '12345678' '12345678' '12345678' '12345678'. Rõ ràng, kết quả nên có'12345678' '12345678' '1234' '1234' '12' '1234' '1234' '12345678' '12345678'
Adám

@ Adám Phiên bản APL + cổ của tôi không có. Đồng ý với nhận xét thứ hai của bạn tôi sẽ xem xét nó vào ngày mai.
Graham

2

Võng mạc , 26 byte

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

Hãy thử trực tuyến! Giải trình:

N$`
$.&

Sắp xếp các dòng theo thứ tự tăng dần về chiều dài ( $.&trả về độ dài của dòng).

*\,2,^A`.+

Tạm thời xóa các dòng thay thế và xuất các dòng còn lại theo thứ tự ngược lại.

,2,G`.+

Giữ các dòng duy nhất đã bị xóa tạm thời và xuất chúng.


2

Gaia , 10 byte

el∫v:v+2%ụ

Hãy thử trực tuyến!

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
Tôi thích rằng những bình luận của bạn trong mã chưa được mã hóa tạo thành một mũi tên của chuỗi
aaaaa nói phục hồi Monica

2

Japt, 8 byte

ñÊó g0_w

-3 byte nhờ Shaggy!

Thử nó


10 byte với đầu ra là một mảng 2D, dường như được cho phép.
Shaggy

Hoặc, có thể, 8 byte ? Trên điện thoại của tôi đã không kiểm tra nó đúng cách.
Shaggy

@Shaggy Tôi đang tìm một hàm để tìm mọi phần tử thứ n, nhưng tôi không thể tìm thấy nó. Cảm ơn!
Hiện thân của sự thiếu hiểu biết

cũng có A.ë()nhưng tôi không biết liệu điều đó sẽ dẫn đến một giải pháp ngắn hơn.
Shaggy




1

Javascript 95 byte

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()sắp xếp các chuỗi theo từ vựng, không phải theo chiều dài chuỗi.
asgallant

Phải, (x, y) => x.length-y.length, nên sửa nó.
somsom



1

C (gcc) , 136 128 byte

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];}

Hãy thử trực tuyến!

-8 byte nhờ vào trần nhà.

Chức năng flà giải pháp. Nó lấy số lượng chuỗi, chính chuỗi và bộ đệm đầu ra làm đối số (cộng thêm bốn chuỗi được sử dụng nội bộ).


Tại sao là ./.bin.tiotrong đầu ra ?
Dịch chuyển con dê

@TeleportingGoat Có lẽ vì phần chân trang của họ đang sử dụng tất cả argv, bao gồm tên tệp
Jo King

Chính xác, nó chỉ là một thử nghiệm nhanh. Người ta có thể xây dựng bất kỳ dữ liệu có định dạng thích hợp. Tôi sẽ cập nhật liên kết TIO sau.
LambdaBeta

haha, vấn đề với những tên biến ngắn này: bạn quên mất những gì bạn ghét tở nơi đầu tiên và giữ nó xung quanh ngay cả khi bạn không cần nó!
LambdaBeta


0

Japt , 8 byte

Nhập dưới dạng một mảng các dòng, đầu ra là một mảng gồm 2 mảng dòng, một cho mỗi nửa của danh sách.

ñÊó
hUÎÔ

Hãy thử nó (Mã bổ sung để cho phép I / O dưới dạng chuỗi phân tách dòng mới)

ñÊó      :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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.