จัดเรียงตัวละครที่ไร้ประโยชน์


21

ความท้าทายนี้เป็นแรงบันดาลใจนี้คำตอบที่ดีมากโดย TidB


ในคำตอบของ TidB ทุกตัวละครแปดตัวอยู่ในลำดับที่ถูกต้อง: gnilwoB edoC( Code Bowlingข้างหลัง) สตริงอื่น ๆอยู่ในลำดับที่แปลกและสุ่ม

ความท้าทายของคุณคือการแก้ไขปัญหานี้

รับสตริง (ไม่ว่าง) และจำนวนเต็มบวกnเป็นอินพุต สตริงจะมีอักขระ ASCII อยู่ในช่วง: 32-126 (เว้นวรรคถึงตัวหนอน)

คุณต้องจัดเรียงสตริงตามลำดับจากน้อยไปหามาก (มองจากด้านซ้ายตามค่ารหัส ASCII) แต่ข้ามnอักขระทุกตัวที่เริ่มต้นจากจุดสิ้นสุดของสตริง ตัวอย่างเช่นลองเอาสตริงabcdABC123เป็นอินพุตn=4แล้วเราจะได้:

abcdABC123   <- Input string. (n=4)
_b___B___3   <- These will not be sorted (every 4th starting from the end)
1_2AC_acd_   <- The remaining characters, sorted
1b2ACBacd3   <- The final string (the output)

ตัวอย่างอื่น:

9876543210   <- Input string (n=2)
_8_6_4_2_0   <- These will not be sorted
1_3_5_7_9_   <- The remaining characters, sorted
1836547290   <- The final string (the output)

สตริงอินพุตสามารถถูกนำมาใช้ในรูปแบบที่เป็นทางเลือก (สตริง, รายการอักขระ, รายการของสตริงอักขระเดี่ยว ... ) จำนวนเต็มอินพุทสามารถนำมาใช้กับรูปแบบที่เลือก

กรณีทดสอบ:

รูปแบบจะn=__ตามด้วยสตริงอินพุตในบรรทัดถัดไป เอาต์พุตอยู่ที่บรรทัดด้านล่าง

n=1   (All elements will stay in place)
nafgaksa1252#"%#
nafgaksa1252#"%#    

n=214  (The last character will stay in place. All other are sorted. 
&/lpfAVD
&/AVflpD  

n=8
g7L9T E^n I{><#ki XSj!uhl y= N+|wA}Y~Gm&o?'cZPD2Ba,RFJs% V5U.W;1e  0_zM/d$bH`@vKoQ 43Oq*C
g       n !#$%&'i*+,./01l234579;w<=>?@ADoEFGHIJKBLMNOPQR STUVWXYeZ^_`abcdhjkmqsuovyz{|}~C

คำตอบ:


7

MATL , 15 14 ไบต์

ttfiX\qgP)S5M(

อินพุตเป็นสตริงที่อยู่ในเครื่องหมายคำพูดเดี่ยวและตัวเลข สัญลักษณ์เครื่องหมายคำพูดเดี่ยวในสตริงควรหลีกเลี่ยงโดยการทำซ้ำ (เช่นใน MATLAB และ Octave)

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

พิจารณาปัจจัยการผลิตและ'abcdABC123'4

tt     % Implicitly input string. Duplicate twice
       % STACK: 'abcdABC123', 'abcdABC123', 'abcdABC123'
f      % Find: indices of nonzero elements: gives [1 2 ... n] where n is input length
       % STACK: 'abcdABC123', 'abcdABC123', [1 2 3 4 5 6 7 8 9 10]
i      % Input n
       % STACK: 'abcdABC123', 'abcdABC123', [1 2 3 4 5 6 7 8 9 10], 4
X\     % 1-based modulo
       % STACK: 'abcdABC123', 'abcdABC123', [1 2 3 4 1 2 3 4 1 2 3 4]
qg     % Subtract 1, convert to logical: gives true (1) for 1, false (0) otherwise
       % STACK: 'abcdABC123', 'abcdABC123', [0 1 1 1 0 1 1 1 0 1]
P      % Flip
       % STACK: 'abcdABC123', 'abcdABC123', [1 0 1 1 1 0 1 1 1 0]
)      % Use as logical index into the string
       % STACK: 'abcdABC123', 'acdAC12'
S      % Sort
       % STACK: 'abcdABC123', '12ACacd'
5M     % Push logical index again
       % STACK: 'abcdABC123', '12ACacd', [1 0 1 1 1 0 1 1 1 0]
(      % Write into original string as specified by the index. Implicitly display
       % STACK: 1b2ACBacd3

1 ตามแบบโมดูโลหมายความว่าmod([1 2 3 4 5], 3)ให้[1 2 3 1 2]แทนปกติ [1 2 0 1 2](0-based) นี่เป็นสิ่งจำเป็นที่นี่เพื่อจัดการกรณีn=1อย่างเพียงพอ


1
ฉันหวังว่า 05AB1E มีคำสั่งสุดท้ายนั้น ...
mbomb007

6

PHP, 101 ไบต์

ดัชนีสตริงลบ (PHP 7.1) บันทึก 21 ไบต์ - และอาจเป็นวันที่:

for([,$s,$n]=$argv;a&$c=$s[$i-=1];)$i%$n+1?$a[]=$c:0;for(sort($a);++$i;)echo$i%$n+1?$a[+$k++]:$s[$i];

php -nr '<code>' '<string>' <N>ทำงานด้วย

ทำให้พังถล่ม

for([,$s,$n]=$argv;     # import command line arguments to $s and $n
    a&$c=$s[$i-=1];)    # loop backward through string
    $i%$n+1?$a[]=$c:0;      # if index is not n-th, copy character to array
for(sort($a);           # sort array
    ++$i;)              # loop forward through string:
    echo$i%$n+1             # if index is not n-th
        ?$a[+$k++]              # print character from array
        :$s[$i]                 # else print character from string
    ;

ทำไม$i-=1ไม่$i--?
JörgHülsermann

1
@ JörgHülsermannเพราะ$i--ทำงาน doesn't ถ้าเป็น$i NULL
ติตัส

@ JörgHülsermann ... และ--$iซึ่งฉันต้องการก็ไม่เช่นกัน ;)
Titus

ฉันไม่เคยลองมาก่อน ขอบคุณสำหรับคำตอบของคุณ
JörgHülsermann

6

อ็อกเท65 65ไบต์

function s=f(s,n)
l=~~s;l(end:-n:1)=0;s(l)=sort(s(l));

ลองออนไลน์!

ใช้การทำดัชนีเชิงตรรกะเพื่อสร้างอาร์เรย์ของอักขระ 'คงที่' และ 'เรียงลำดับ' คำอธิบาย:

function s=f(s,n) % Create a function, taking a string `s` and the number `n`; the output is also named `s`.
l=~~s;             % Create logical array with the same size of the input string 
                  %    [equivalent to much more verbose true(size(s))].
l(end:-n:1)=0;    % Set the 'fixed' character positions. MATLAB/Octave automatically produces
                  %    the correct result even if n is larger than the string length.
s(l)=sort(s(l)) % Select the elements from `s` where `l` is true. Sort, and store in the corresponding positions in `s`.

วิธีที่ฉันสร้างขึ้นlนั้นต้องsไม่ใช่ศูนย์ซึ่งฉันคิดว่าเป็นข้อกำหนดที่สมเหตุสมผลเนื่องจากมีภาษาจำนวนมากที่ใช้\0เป็นตัวคั่นส่วนท้ายของสตริง


คุณสามารถบันทึกบางไบต์ถ้าคุณเลี่ยงผ่านlและใช้เวกเตอร์ของตัวเลขดัชนีโดยตรง
Leo


@Leo ข้อเสนอแนะของคุณไม่ใช่ 8 ไบต์อีกต่อไปหรือ
Stewie Griffin

@StewieGriffin อ้าวฉันไม่เห็นโซลูชันที่อัปเดตแล้ว
Leo

5

Python 2, 191 ไบต์

ใช่ฉันแน่ใจว่านี่เป็นทางออกที่น่ากลัว

n,s=input()
s=s[::-1]
R=range(len(s)/n+1)
J=''.join
k=s[::n]
t=J(sorted(J(s[i*n+1:i*n+n]for i in R)))
n-=1
print J(j[::-1]for i in zip(k,[t[::-1][i*n:i*n+n][::-1]for i in R])for j in i)[::-1]

ลองออนไลน์

ฉันจะไม่อธิบายให้ฟัง ไม่เป็นไรจนกระทั่งฉันรู้ว่าจะต้องมีการจัดทำดัชนีตั้งแต่ท้าย ตอนนี้มันเป็นสัตว์ประหลาด ณ จุดนี้ฉันแค่ดีใจที่ได้ผล


1
เพิ่มขึ้นเนื่องจาก "คำอธิบาย" : P
Stewie Griffin

4

JavaScript (ES6), 100 93 ไบต์

(s)(n)จะเข้าในไวยากรณ์ currying

s=>n=>s.replace(/./g,(c,i)=>(F=_=>(s.length-++i)%n)()?[...s].filter(F,i=0).sort()[j++]:c,j=0)

จัดรูปแบบและแสดงความคิดเห็น

s => n => s.replace(        // given a string s and an integer n
  /./g,                     // for each character c of s
  (c, i) => (               // at position i:
    F = _ =>                //   F = function that tests whether the
      (s.length - ++i) % n  //       character at position i is non-static
  )()                       //   call F() on the current position
  ?                         //   if the current character is non-static:
    [...s].filter(F, i = 0) //     get the list of non-static characters
      F, i = 0              //     by filtering all characters in s with F()
    )                       //
    .sort()[j++]            //     sort them and pick the next occurrence
  :                         //   else:
    c,                      //     let c unchanged
  j = 0                     //   initialize j = non-static character pointer
)                           //

กรณีทดสอบ


2

Perl 5 , 94 ไบต์

88 ไบต์ของรหัสเมือง + -F -plธง

$_=join"",(map{(--$i%$n?"":$F[$#F-$i--]),$_}sort grep$i++%$n,reverse@F),chop if($n=<>)>1

ลองออนไลน์!

มันค่อนข้างยาวเกินไปในความคิดของฉัน แต่แล้วก็ไม่น่าเกลียด ... ฉันยังคงพยายามตีกอล์ฟต่อไป


2

เยลลี่ , 14  13 ไบต์

FṢṁ
ṚsṚµḢ€ż@Ç

โปรแกรมเต็มรูปแบบที่พิมพ์สตริงไปยัง STD out *

ลองออนไลน์!

อย่างไร?

ṚsṚµḢ€ż@Ç - Main link: string s, non-negative number n
Ṛ         - reverse s
 s        - split into chunks of size n
  Ṛ       - reverse the resulting list
   µ      - monadic chain separation (call that list x)
    Ḣ€    - head €ach - yield a list of the first entries of each of x and modify x
        Ç - call the last link (1) as a monad - get the sorted and re-split list
      ż@  - zip together (with reversed @rguments)

FṢṁ - link 1, sort and reshape like self: list of lists
F   - flatten into a single list
 Ṣ  - sort
  ṁ - mould the result like the input

ฉันไม่สามารถช่วยได้ แต่คิดว่ามีวิธีใช้ความจริงที่ปรับเปลี่ยนอินพุตของมัน

* Fสำหรับฟังก์ชั่นหนึ่งต้องการที่จะแผ่ออกเป็นรายการเดียวกับ
ตัวอย่างเช่นอินพุตของ"abcdABC123", 4ให้ผล:
[[['1'],['b']],[['2','A','C'],['B']],[['a','c',',d'],['3']]]
มากกว่า:
['1','b','2','A','C','B','a','c',',d','3']


1

Python + NumPy , 115 114 ไบต์

from numpy import *
def f(x,n):l=len(x);x=array(x);m=[1<2]*l;m[-1::-n]=[1>2]*len(m[0::n]);x[m]=sort(x[m]);return x

รับรายการ Python ปกติเป็นอินพุต (ไม่แน่ใจว่าการใช้อาร์เรย์จะถือเป็น kosher หรือไม่) ส่งคืนอาร์เรย์ NumPy ที่มีผลลัพธ์

ทำงานโดยปกปิดดัชนีที่เกี่ยวข้องและจัดเรียงส่วนที่เหลือ


1

Python 2, 119 113 bytes

n,l=input()
i=range(len(l))
print"".join(sorted(l[~a]for a in i if a%n)[-a+a/n]if a%n else l[~a]for a in i)[::-1]

สร้างรายการของตัวละครทั้งหมดที่จะเรียงลำดับเรียงลำดับแล้วผสานเข้าด้วยกันเพื่อการพิมพ์ขณะเดียวกันก็หลีกเลี่ยงการย้อนกลับบางส่วนด้วยการทำดัชนีเชิงลบ


1
print"".join(sorted(l[~a]for a in i if a%n)[-a+a/n]if a%n else l[~a]for a in i)[::-1]บันทึก 5 ไบต์
TidB

@TidB ขอบคุณเกือบกำจัดแถบเลื่อน! (Apparantly มีการขึ้นบรรทัดใหม่มีส่วนร่วมในการนับก่อนหน้าของฉันจึงน่าจะเป็น 113 ตอนนี้แทน 114)
moooeeeep

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