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.

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!


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.


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
  )

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



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

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


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.


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 !


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


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


@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

¹


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


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.


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

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


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



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;},[]);

-1 s.sort()mengurutkan string secara leksikografis, bukan berdasarkan panjang string.
asgallant

Benar, (x, y) => x.length-y.length, harus memperbaikinya.
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];}

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).


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


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.