ลูกศรตัวแปรเหล่านั้น!


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 และไม่มีตัวเลขหรือตัวอักษรพิเศษเฉพาะอักษรตัวพิมพ์เล็กและตัวพิมพ์ใหญ่

  • อินพุตสามารถเป็นอะไรก็ได้ที่คุณต้องการ: คั่นด้วยเครื่องหมายจุลภาคเป็นหนึ่งสตริง, อาร์เรย์, ... อนุญาตให้ใช้รูปแบบ I / O ใดก็ได้

  • ระหว่างสตริงที่มีความยาวเท่ากันคำสั่งใดก็ได้รับการยอมรับ

ฉันรู้สึกเหมือนเคยมีความท้าทายที่คล้ายกันมาก่อน ... แต่ยินดีต้อนรับสู่ PPCG!
จูเซปเป้

@Giuseppe ใช่นั่นคือสิ่งที่ฉันคิดหลังจากโพสต์ไม่มีทางที่มันไม่เคยทำมาก่อน คุณจะโอเคกับฉันที่จะลบมันตอนนี้หรือไม่?
Teleporting Goat

1
ดีฉันได้ค้นหาล่อลวง แต่ฉันไม่ค่อยเก่งในการค้นหา ... เรามีSandboxสำหรับโพสต์ความท้าทายซึ่งมักจะจับสิ่งต่าง ๆ เช่นนั้น ฉันตกลงกับคุณได้อย่างสมบูรณ์แบบถ้าคุณกังวลว่ามันจะเป็นคนหลอกลวง
จูเซปเป้

1
ไม่เป็นไรเราทุกคนเริ่มจากจุดเริ่มต้น :-)
จูเซปเป้

1
คุณสามารถเพิ่มกรณีทดสอบด้วยจำนวนสายอักขระได้หรือไม่?
Sherlock9

คำตอบ:


15

Python 2 , 47 ไบต์

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

ลองออนไลน์!


คุณจะต้องจัดเรียงสิ่งต่าง ๆ แต่คุณสามารถใช้[::-2]โดยตรงเพื่อบันทึก 5 ไบต์
Sherlock9

@ Sherlock9 ฉันลองแล้ว แต่ฉันต้องตรวจสอบความยาวเนื่องจากรายการที่มีความยาวเท่ากัน / ไม่เท่ากันนั้นต้องจัดการแตกต่างกัน
ovs

ใช้งานได้กับ Python 3 ด้วยการลบ "lambda l:" และ "หรือ" และทำให้เป็น 2 บรรทัดเพื่อบันทึก 11 ไบต์ยังคงยอมรับได้เนื่องจาก "อนุญาตให้ใช้รูปแบบ I / O ใด ๆ "
มันฝรั่ง

9

R , 63 48 ไบต์

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

ลองออนไลน์!

เรียงตามความยาวของสตริงจากนั้นรวมรายการที่กลับรายการเข้ากับรายการที่เรียงลำดับสุดท้ายใช้องค์ประกอบที่สองทุกอันเริ่มต้นที่ดัชนี 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
dana

ที่ไม่สอดคล้องกันในการส่ง js code golf จากสิ่งที่ฉันได้เห็น ฉันยินดีที่จะยกเว้นหากไม่นับ
asgallant

2
ฉันคิดว่ามันขึ้นอยู่กับว่าฟังก์ชั่นของคุณใช้การเรียกซ้ำ f=x=>x?f(x-1)กล่าวคือ ถ้าเป็นเช่นนั้นคุณจะต้องรวมfตั้งแต่ที่คุณกำลังเรียกมันในฟังก์ชั่นของคุณ แต่เนื่องจากคุณไม่ได้ใช้ recursion 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"-
Erik the Outgolfer

หรือคุณสามารถไปหาLÞŒœṚ;¥/
Jonathan Allan


5

05AB1E , 6 5 ไบต์

บันทึกแล้ว 1 ไบต์ขอบคุณKevin Cruijssen

I / O เป็นรายการสตริง
ลิงก์ได้รับการแก้ไขสำหรับการขึ้นบรรทัดใหม่ 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เพื่อบันทึกไบต์เนื่องจากกฎกระสุนปืนที่สามอนุญาตให้ทั้งสองรุ่น uninterleaving
Kevin Cruijssen

@KevinCruijssen: โอ้ใช่ขอบคุณ!
Emigna

5

J , 11 ไบต์

,~`,/@\:#&>

ลองออนไลน์!

เราจัดเรียงมันลงก่อน

จากนั้นเราลดรูปแบบรายการจากขวาไปซ้าย แต่สลับด้านที่เราใส่องค์ประกอบใหม่ เสร็จสิ้น


ดีมาก! คุณมีพื้นที่ที่สิ้นสุด แต่เอามันออกไป 11 ไบต์ :)
เลน Ivanov

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]เป็นดัชนีของอาร์เรย์ที่สลับระหว่าง a 0หรือ1ดังนั้นจะประเมินเป็นฟังก์ชันอื่นในแต่ละครั้ง PHP "ฟังก์ชั่นตัวแปร" ช่วยให้คุณกำหนด varible ให้กับฟังก์ชั่นและดำเนินการโดยการเรียกด้วยวงเล็บ (เช่น: $f='array_push'; $f($e,$d);== array_push($e,$d)) ดังนั้น($e,$d)จึงเรียกองค์ประกอบที่ประเมินของอาร์เรย์ if (++$i%2) array_push($e,$d); else array_unshift($e,$e);เพียงวิธีที่สั้นกว่าที่จะทำ เดามีน้ำตาล syntactic PHP หลังจากทั้งหมด!
640KB

โอเคฉันใช้เวลาซักพักเพื่อทำความเข้าใจ น่ากลัว
abhig10

1
คุณสามารถบันทึก 3 ไบต์โดยการแทนที่ด้วย[array_unshift,array_push][++$i%2]($e,$d) (array_.[unshift,push][++$i%2])($e,$d)สิ่งที่ฉันทำคือการลบที่ซ้ำarray_กันตัดแบ่งแล้วผลลัพธ์จะถูกส่งผ่านไปยังการโทร
Ismael Miguel

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


@Sanchises ขอบคุณสำหรับการชี้จุดบกพร่อง ฉันแก้ไขมันเหมือนที่คุณทำ ปัญหาของฉันdispคือฉันไม่แน่ใจว่ากฎการส่งออกคืออะไร ควรเป็นข้อความที่บริสุทธิ์หรือไม่? หรือdisp({...})ไม่เป็นไรหรือแม้แต่x={...}ตามที่คุณแนะนำ
aaaaa พูดว่าคืนสถานะโมนิก้า

1
นี่อาจเป็น58 ไบต์ในระดับแปดเสียง
Giuseppe

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

4
ฉันชอบที่ความคิดเห็นของคุณในรหัสที่ไม่ได้ห่อรูปเป็นลูกศรของสตริง
aaaaa พูดว่าคืนสถานะโมนิก้า

2

Japtet, 8 ไบต์

ñÊó g0_w

-3 ไบต์ขอบคุณ Shaggy!

ลองมัน


10 ไบต์พร้อมเอาต์พุตเป็นอาเรย์ 2 มิติซึ่งดูเหมือนว่าจะได้รับอนุญาต
Shaggy

หรืออาจจะ8 ไบต์ ? บนโทรศัพท์ของฉันดังนั้นจึงยังไม่ได้ทดสอบอย่างถูกต้อง
ปุย

@Shaggy ฉันกำลังมองหาฟังก์ชั่นเพื่อค้นหาองค์ประกอบที่ n แต่ฉันหามันไม่เจอ ขอบคุณ!
ศูนย์รวมแห่งความไม่รู้

นอกจากนี้ยังมีA.ë()แต่ฉันไม่รู้ว่าจะนำไปสู่วิธีแก้ปัญหาที่สั้นกว่านี้หรือไม่
Shaggy




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()เรียงลำดับสตริงตามพจนานุกรมไม่ใช่ตามความยาวสตริง
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เป็นทางออก มันต้องใช้จำนวนสตริงสตริงเองและบัฟเฟอร์เอาต์พุตเป็นอาร์กิวเมนต์ (รวมทั้งที่ใช้ภายในสี่รายการ)


เป็นเพราะเหตุใด./.bin.tioในการส่งออก ?
ไกลแพะ

@TeleportingGoat อาจเป็นเพราะส่วนท้ายของพวกเขาใช้งานทั้งหมดargvซึ่งรวมถึงชื่อไฟล์
โจคิง

แน่นอนมันเป็นเพียงการทดสอบอย่างรวดเร็ว หนึ่งสามารถสร้างข้อมูลใด ๆ ที่ใช้รูปแบบที่เหมาะสม ฉันจะอัปเดตลิงค์ TIO ในภายหลัง
LambdaBeta

ฮ่าฮ่าปัญหากับชื่อตัวแปรสั้น ๆ เหล่านี้: คุณลืมสิ่งที่คุณสวมใส่tในตอนแรกและเก็บไว้รอบแม้คุณไม่ต้องการมัน!
LambdaBeta


0

Japt , 8 ไบต์

อินพุตเป็นอาร์เรย์ของบรรทัดเอาต์พุตเป็นอาร์เรย์ 2 อาร์เรย์บรรทัดหนึ่งรายการสำหรับแต่ละครึ่งของรายการ

ñÊó
hUÎÔ

ลองใช้ (รหัสเพิ่มเติมเพื่ออนุญาตให้ I / O เป็นสตริงที่คั่นด้วยบรรทัดใหม่)

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.