Panah variabel-variabel itu!

29

Tantangan

Robin suka memiliki deklarasi variabel dalam bentuk panah. Begini cara dia melakukannya:

  • Masukkan sejumlah string
  • Pesanlah dengan panjang menanjak
  • Keluarkan mereka yang dipesan oleh bagian tengah untuk kira-kira membentuk panah negatif, seperti ini (mana yang paling suka golf):

    5  or  4
    3      2
    1      1
    2      3
    4      5
    

Uji Kasus

Memasukkan:

bow
arrows
sheriffOfNottingham
kingRichard
maidMarian
princeJohn
sherwoodForest

Keluaran:

sheriffOfNottingham
kingRichard
maidMarian
bow
arrows
princeJohn
sherwoodForest

Memasukkan:

a
bb
cc

Output (keduanya valid):

bb
a
cc

cc
a
bb

Memasukkan:

one
four
seven
fifteen

Kemungkinan keluaran (satu-satunya keluaran valid lainnya adalah cermin vertikalnya):

seven
one
four
fifteen

Catatan

  • String ada di camelCase dan tidak memiliki angka atau karakter khusus, hanya huruf kecil dan huruf besar.

  • Input dapat berupa apa saja yang Anda suka: dipisahkan dengan koma sebagai satu string, array, ... Setiap format I / O diizinkan.

  • Antara string dengan panjang yang sama, pesanan apa pun diterima.
Teleporting Goat
sumber
Saya merasa ada tantangan yang sangat mirip sebelumnya ... tapi selamat datang di PPCG!
Giuseppe
@ Giuseppe Ya itu yang saya pikir setelah memposting, tidak mungkin itu belum pernah dilakukan sebelumnya. Apakah Anda baik-baik saja dengan saya menghapusnya sekarang setelah Anda menjawabnya?
Teleporting Goat
1
baik saya telah mencari seorang penipu tetapi saya tidak terlalu pandai dalam pencarian ... kami memiliki kotak pasir untuk memposting tantangan yang sering dapat menangkap hal-hal seperti itu. Saya benar-benar setuju dengan Anda menghapusnya jika Anda khawatir akan menjadi korban penipuan.
Giuseppe
1
Tidak apa-apa, kita semua mulai dari awal :-)
Giuseppe
1
Bisakah Anda menambahkan test case dengan jumlah string genap?
Sherlock9

Jawaban:

15

Python 2 , 47 byte

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

Cobalah online!

ovs
sumber
Anda perlu mengatur ulang beberapa hal, tetapi Anda dapat menggunakannya [::-2]langsung untuk menghemat 5 byte.
Sherlock9
@ Sherlock9 Saya mencobanya, tetapi kemudian saya harus memeriksa panjangnya, karena daftar dengan panjang genap / tidak rata harus ditangani secara berbeda.
Ovs
Juga berfungsi untuk Python 3. Apakah menghapus "lambda l:" dan "atau" dan membuatnya pada 2 baris untuk menghemat 11 byte masih dapat diterima karena "Setiap format I / O diperbolehkan"?
kentang
9

R , 63 48 byte

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

Cobalah online!

Urutkan berdasarkan panjang string, lalu gabungkan daftar terbalik dengan daftar diurutkan, akhirnya, ambil setiap elemen ke-2, mulai dari indeks berbasis 1.

Giuseppe
sumber
1
o<-L[...Cara lain untuk 'panah variabel'. Samping yang kurang penting, pryr::f(...)bekerja di sini untuk 46. Cobalah online!
Kriminal kriminal
@CriminallyVulgar menggunakan perpustakaan tambahan mengubah ini menjadi bahasa yang terpisah, R + pryr itulah sebabnya saya biasanya menghindari melakukannya kecuali ada alasan yang baik untuk - seperti untuk pertanyaan nomor teori, numberssangat diperlukan.
Giuseppe
7

Javascript 77 byte

Mengambil input sebagai array string, menghasilkan array string panah-diurutkan.

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

Penjelasan

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
  )
sangat penting
sumber
1
Saya pikir Anda tidak perlu menghitung f=. 77
dana
Itu tidak konsisten dalam pengiriman kode js golf dari apa yang saya lihat. Saya senang mengecualikannya jika tidak masuk hitungan.
asgallant
2
Saya pikir itu tergantung apakah fungsi Anda menggunakan rekursi. yaitu f=x=>x?f(x-1). Jika demikian, Anda perlu memasukkan fkarena Anda memanggilnya dalam fungsi Anda. Namun, karena Anda tidak menggunakan rekursi, Anda tidak harus memasukkannya f. Ada beberapa posting di Meta, yang ini sepertinya menjelaskannya sedikit lebih baik. codegolf.meta.stackexchange.com/a/9032/8340
dana
Itu akan menjelaskan ketidakkonsistenan yang pernah saya lihat.
asgallant
5

K (oK) , 24 byte

Larutan:

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

Cobalah online!

Penjelasan:

Buat 6 4 2 0 1 3 5urutan, gunakan itu untuk mengindeks ke dalam panjang input yang naik, dan gunakan itu untuk mengindeks ke dalam array asli:

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
sumber
5

Jelly , 9 8 byte

LÞŒœm"-Ẏ

Cobalah online!

LÞŒœṚ;¥/

juga 8 byte.

Terima kasih kepada @EriktheOutgolfer dan @ JonathanAllan karena keduanya menawarkan golf untuk menghemat satu byte.

Nick Kennedy
sumber
Bagus! Golf pintar: Ṛ€1¦bisa menjadi m"-.
Erik the Outgolfer
Atau Anda bisa memilihLÞŒœṚ;¥/
Jonathan Allan
5

05AB1E , 6 5 byte

Disimpan 1 byte berkat Kevin Cruijssen

I / O adalah daftar string.
Tautan dimodifikasi untuk I / O yang dipisahkan oleh baris baru untuk pengujian yang lebih mudah.

éι`Rì

Cobalah online!

Penjelasan

é       # 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
sumber
Anda dapat menghapus yang pertama Rdan menggantinya «dengan iuntuk menyimpan byte, karena aturan poin-ketiga memungkinkan kedua versi uninterleaving.
Kevin Cruijssen
@KevinCruijssen: Oh ya, terima kasih!
Emigna
5

J , 11 byte

,~`,/@\:#&>

Cobalah online!

Kami mengurutkannya terlebih dahulu.

Kemudian kita mengurangi formulir daftar dari kanan ke kiri, tetapi berganti-ganti sisi mana kita meletakkan elemen baru. Selesai

Jonah
sumber
Sangat bagus! Anda memiliki ruang pada akhirnya, hapus selama 11 byte :)
Galen Ivanov
1
Terima kasih Galen. Tetap!
Jonah
4

PowerShell , 66 byte

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

Cobalah online!

Mengambil input melalui splatting, yang bermanifestasi pada TIO sebagai argumen baris perintah yang terpisah. sortpada length, menyimpannya ke dalam $a, dan membangun rentang dari 1hingga countstring input. Kami kemudian menarik hanya yang aneh ?{$_%2}dan memberi makan mereka menjadi satu lingkaran |%{...}. Setiap iterasi, kami menempatkan "terakhir", lalu "ketiga dari terakhir", dan seterusnya ke dalam pipa bersama $a[-$_]. Secara terpisah, kami juga terakumulasi menjadi $x"kedua dari terakhir", "keempat dari terakhir", dll. Keluar dari loop dan pipeline memerah (jadi elemen-elemen tersebut adalah output) dan kemudian kami output $x. Dalam kedua contoh, output default memberi kita baris baru antar item secara otomatis.

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

Cobalah online!

-3 byte terima kasih kepada @Ismael Miguel !

640KB
sumber
bagus Di mana saya bisa membaca lebih banyak tentang [array_unshift,array_push][++$i%2]($e,$d)?
abhig10
2
@ abhig10 yakin. Ini adalah array dengan dua nama fungsi ['array_push','array_unshift']dengan [++$i%2]sebagai indeks array yang bergantian antara satu 0atau 1lebih akan mengevaluasi ke fungsi lainnya setiap kali. "Fungsi variabel" PHP memungkinkan Anda menetapkan variabel ke suatu fungsi dan mengeksekusi dengan memanggil dengan tanda kurung (contoh: $f='array_push'; $f($e,$d);== array_push($e,$d)) sehingga ($e,$d)kemudian memanggil elemen array yang dievaluasi. Cara yang lebih singkat untuk dilakukan if (++$i%2) array_push($e,$d); else array_unshift($e,$e);. Sepertinya ada beberapa gula sintaksis PHP!
640KB
Oke, kadang-kadang saya perlu memahami hal ini. Luar biasa.
abhig10
1
Anda dapat menyimpan 3 byte dengan menggantinya [array_unshift,array_push][++$i%2]($e,$d)dengan (array_.[unshift,push][++$i%2])($e,$d). Apa yang saya lakukan adalah menghapus yang diulang array_, menyatukannya dan kemudian hasilnya diteruskan ke panggilan.
Ismael Miguel
1
@ IsmaelMiguel itu brilian. Terima kasih!
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)}}'

Mengambil input sebagai array sel string, menampilkan kolom string (tidak yakin apakah itu legal)

> 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: Terima kasih Sanchises karena menunjuk bug dengan input panjang ganjil

kata aaaaa mengembalikan Monica
sumber
Ini gagal pada jumlah ganjil input string, misalnyaf({'loooooooong','medium','short'})
Sanchises
Juga beberapa tip golf umum: endini opsional untuk a function. Penggunaan function x=f(y);x={...}'lebih pendek dari function f(y);disp({...}').
Sanchises
Jika Anda mandek, beginilah cara saya melakukannya.
Sanchises
@Sanchises terima kasih telah menunjukkan bug. Saya memperbaikinya persis seperti yang Anda lakukan. Masalah saya dengan dispadalah saya tidak yakin apa aturan outputnya. Haruskah itu murni teks atau tidak? atau disp({...})tidak apa-apa atau bahkan x={...}seperti yang Anda sarankan
aaaaa mengatakan mengembalikan Monica
1
Ini bisa menjadi 58 byte dalam Oktaf.
Giuseppe
3

APL (Dyalog Unicode) , 18 byte SBCS

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

Cobalah online!

Memperbaiki bug berkat @ngn.

Penjelasan:

{⍵[⍋-@(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

¹

Yang Mulia
sumber
1
≢¨×¯1*⍳∘⍴-> (⊢∘-\≢¨)dan semakin pendek jika Anda mengubahnya menjadi dfn
ngn
1
Namun, saya tidak yakin algoritma ini benar. kita harus meniadakan panjang setiap string lain dalam urutan mereka, bukan dalam urutan mereka berasal dari input
ngn
2

APL + WIN, 31 38 byte

Lihat komentar Adams

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

Cobalah secara online Courtesy of Dyalog Classic!

Anjuran untuk vektor string yang bersarang

Graham
sumber
Apakah APL + tidak memiliki "penghitungan" Monadic untuk diganti ∊⍴?
Adám
1
Gagal aktif '12' '1234' '1234' '1234' '1234' '12345678' '12345678' '12345678' '12345678'. Jelas, hasilnya seharusnya'12345678' '12345678' '1234' '1234' '12' '1234' '1234' '12345678' '12345678'
Adám
@ Adám Versi APL saya yang lama tidak memiliki have. Setuju dengan komentar kedua Anda, saya akan melihatnya besok.
Graham
2

Retina , 26 byte

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

Cobalah online! Penjelasan:

N$`
$.&

Urutkan garis dalam urutan panjang ( $.&mengembalikan panjang garis).

*\,2,^A`.+

Hapus sementara garis alternatif dan output garis yang tersisa dalam urutan terbalik.

,2,G`.+

Pertahankan satu-satunya baris yang dihapus sementara dan outputkan.

Neil
sumber
2

Gaia , 10 byte

el∫v:v+2%ụ

Cobalah online!

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
sumber
4
saya suka bahwa komentar Anda dalam kode yang tidak terbungkus membentuk panah string
aaaaa mengatakan mengembalikan Monica
2

Japt, 8 byte

ñÊó g0_w

-3 byte, terima kasih untuk Shaggy!

Cobalah

Perwujudan Ketidaktahuan
sumber
10 byte dengan output sebagai 2D-array, yang tampaknya diizinkan.
Shaggy
Atau, mungkin, 8 byte ? Di ponsel saya jadi belum diuji dengan benar.
Shaggy
@ Shaggy Saya sedang mencari fungsi untuk menemukan setiap elemen ke-n, tetapi saya tidak dapat menemukannya. Terima kasih!
Perwujudan Ketidaktahuan
ada juga A.ë()tetapi saya tidak tahu apakah itu akan mengarah pada solusi yang lebih pendek.
Shaggy
2

T-SQL, 84 byte

Input adalah variabel tabel

SELECT a FROM(SELECT*,row_number()over(order by len(a))r
FROM @)x order by(r%2-.5)*r

Cobalah online

t-clausen.dk
sumber
2

Perl 6 , 31 byte

*.sort(&chars).sort:{$++%2*$--}

Cobalah online!

Sortir menurut panjang string, kemudian dengan urutan statis 0, -1, 0, -3, 0, -5, ...

nwellnhof
sumber
1

Javascript 95 Bytes

s=>s.sort((x,y)=>x.length-y.length).reduce((a,e,i)=>{i%2?a.push(e):a.unshift(e);return a;},[]);
somsom
sumber
-1 s.sort()mengurutkan string secara leksikografis, bukan berdasarkan panjang string.
asgallant
Benar, (x, y) => x.length-y.length, harus memperbaikinya.
somsom
1

Merah , 116 101 byte

func[b][sort/compare b func[x y][(length? x)> length? y]collect[forall b[keep take b]keep reverse b]]

Cobalah online!

Galen Ivanov
sumber
1

perl 5 ( -p0777F/\n/ -M5.01), 59 byte

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

TIO

Nahuel Fouilleul
sumber
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];}

Cobalah online!

-8 Bytes berkat ceilingcat.

Fungsi fadalah solusinya. Dibutuhkan jumlah string, string itu sendiri, dan buffer output sebagai argumen (ditambah empat lagi yang digunakan secara internal).

LambdaBeta
sumber
Mengapa ada ./.bin.tiodalam output ?
Teleporting Goat
@TeleportingGoat Mungkin karena catatan kaki mereka menggunakan semuanya argv, yang mencakup nama file
Jo King
Tepatnya, itu hanya tes cepat. Satu dapat membangun data apa pun yang mengambil format yang sesuai. Saya akan memperbarui tautan TIO nanti.
LambdaBeta
haha, masalah dengan nama-nama variabel pendek ini: Anda lupa apa yang Anda inginkan tdi tempat pertama dan tetap di sekitar bahkan ketika Anda tidak membutuhkannya!
LambdaBeta
122 bytes
ceilingcat
0

Japt , 8 byte

Input sebagai array baris, output sebagai array 2 array baris, satu untuk setiap setengah dari daftar.

ñÊó
hUÎÔ

Cobalah (Kode tambahan untuk memungkinkan I / O sebagai string yang dipisahkan baris baru)

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

Haskell , 104 96 byte

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

Cobalah online!

bug
sumber
Tidak valid, Anda harus mengurutkan sebelum memotong daftar menjadi dua
ASCII
90
ASCII