เครื่องคัดแยกที่ไม่ประสงค์ดีสำหรับวัตถุประสงค์ที่ชั่วร้าย


18

สวัสดีนักกอล์ฟ!

ความท้าทายของคุณคือยกเลิกหมายเลขชุดอย่างสมบูรณ์

อินพุต

จำนวนเต็ม 100 จำนวนเต็มจะถูกป้อนเข้าสู่โปรแกรมของคุณ โปรแกรมของคุณอาจยอมรับอินพุตเป็นไฟล์หรือผ่าน stdin จำนวนเต็มแต่ละค่าจะถูกคั่นด้วยอักขระขึ้นบรรทัดใหม่

จำนวนเต็ม 100 จำนวนเหล่านั้นจะอยู่ในช่วงตั้งแต่ค่าต่ำสุดไปจนถึงค่าสูงสุดของจำนวนเต็มที่ลงนามในภาษาที่คุณเลือก

จะไม่มีค่าซ้ำกัน ค่าอาจถูกเรียงลำดับไม่เรียงลำดับหรือสั่งบางส่วน - โปรแกรมของคุณควรจัดการแต่ละกรณี

เอาท์พุต

เอาต์พุตจะต้องเป็นจำนวนเต็ม 100 ตัวซึ่งไม่เรียงลำดับอย่างสมบูรณ์โดยแต่ละรายการคั่นด้วยอักขระบรรทัดใหม่ เอาท์พุทอาจจะผ่าน stdout หรือไฟล์

Unsorted โดยสิ้นเชิงหมายความว่าไม่มีค่าอยู่ติดกับค่าใด ๆ ที่จะอยู่ติดกับหากรายการนั้นเรียงลำดับตามลำดับที่สั่งไว้อย่างสมบูรณ์

คะแนน

1 คะแนนต่อตัวละครและคะแนนต่ำสุดชนะ มีโบนัส -100 สำหรับการแก้ปัญหาใด ๆ ที่ไม่มีฟังก์ชั่นการเรียงลำดับในตัวหรือไลบรารี มีโบนัส -20 สำหรับการแก้ปัญหาใด ๆ ที่ไม่มีฟังก์ชั่นตัวเลขสุ่มในตัว

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

Fore!


นอกจากนี้ตรง 100 จำนวนเต็มการป้อนข้อมูลและไม่มีค่าที่ซ้ำกัน (ดูภายใต้หัวข้อ "การป้อนข้อมูล")
lochok

ใช่คุณไม่ได้เห็นอย่างนั้น
Strigoides

2
มันไม่ซ้ำกันเช่นนี้ แต่ก็ไม่แตกต่างกันมากนักกับcodegolf.stackexchange.com/questions/6487/…
Peter Taylor

คำตอบที่ฉลาดมากมาย! ฉันจะเลือกคำตอบที่สั้นที่สุดในวันที่ 31 ตุลาคมเวลา 8: 10-Zulu
lochok

คำตอบ:


9

GolfScript (คะแนน 27 - 120 = -93)

~].,{{.2$<{\}*}*]}*.(;+2%n*

หมายเหตุ: นั่น$คือการอ้างอิงองค์ประกอบบนสแต็ก มีการเรียงลำดับ แต่ทำได้ด้วยการเรียงลำดับฟองด้วยตนเอง

ขอบคุณฮาวเวิร์ดสำหรับ -90 => -92; และ Ilmari ผู้สร้างแรงบันดาลใจ -92 => -93


เครดิตสำหรับคำตอบที่กระชับ แต่ (ยกโทษให้ฉันเนื่องจากฉันไม่พูดหรือเข้าใจ GolfScript) - ^ จะไม่ตัดสิทธิ์จากโบนัส -100 หรือไม่
lochok

1
@lochok ฟังก์ชั่นการเรียงลำดับในตัวคือ$- นั่นคือเหตุผลที่ฉันพูดถึงว่า$ในโปรแกรมไม่ได้เรียงลำดับ (ขึ้นอยู่กับบริบท) ส่วนใหญ่ของโปรแกรม (28 42 ตัวอักษร) กำหนดฟังก์ชั่น^; รุ่นแรกโดยใช้การเรียงลำดับในตัวมีเพียง 14 อักขระ
Peter Taylor

อ่า - ใช่ ขอขอบคุณสำหรับการชี้แจง!
lochok

1
2/{~p}%n*คุณสามารถบันทึกตัวอักษรสองกับห่วงการส่งออกต่อไปนี้:
โฮเวิร์ด

1
2/zip~+n*และ.);\+2%n*ใช้เคล็ดลับสำหรับจำนวนตัวอักษรเดียวกันกับเวอร์ชันของ @ Howard อนิจจาฉันยังไม่สามารถหาอะไรที่สั้นกว่านี้ได้
Ilmari Karonen

6

Python -26

(94-120): ใหม่วิธีการดิบ ให้ popping อิลิเมนต์ต่ำสุดไปยังรายการใหม่เพื่อให้เรียงลำดับองค์ประกอบแล้ววนซ้ำ

t=l=[]
i=N=100
exec't=t+[input()];'*N+'l+=[t.pop(t.index(min(t)))];'*N+'print l[i%N];i+=3;'*N

Python -13

(107-120): วิธีแรก: ลบองค์ประกอบต่ำสุดสี่รายการในแต่ละครั้งจากนั้นพิมพ์สี่องค์ประกอบนี้ในลำดับอื่น:

exec'l=[]'+'+[input()]'*100
while l:
 a,b,c,d=eval('l.pop(l.index(min(l))),'*4)
 for e in[b,d,a,c]:print e

t=l=[]และexec't+=[input()];'*100จะช่วยให้คุณประหยัดตัวอักษรสองสามตัว
quasimodo

นอกจากนี้คุณสามารถใช้หนึ่งexecคำสั่งสำหรับมากกว่าหนึ่งวง
quasimodo

@ quasimodo ฉันลองอะไรแบบนั้น แต่เมื่อt=l=[]t และ l ชี้ไปที่วัตถุเดียวกันและมันไม่ทำงาน execแม้ว่าการข้ามวงเล็บจะดี
daniero

คุณสามารถใช้t=t+[input()];สิ่งนี้สร้างวัตถุใหม่ในแต่ละครั้ง และคุณยังสามารถทำวนรอบที่พิมพ์ในงบ ';i+=1;print l[i*3%100]'*100exec:
quasimodo

คุณพูดถูกอีกแล้ว ขอบคุณ! นอกจากนี้ยังเพิ่มบางกอล์ฟอื่น ๆ เช่นการถอด%3และหลีกเลี่ยงการ repeation 100ของ
daniero

4

C: 11 (131 - 120)

โปรแกรมอ่านจาก stdin และทำการเรียงลำดับแทรกอย่างง่ายหลังจากนั้นจะพิมพ์ลำดับที่ n พร้อมหมายเลข th + 50 เช่นเดียวกับโซลูชันอื่น ๆ

main(){int*i,a[101],*j=a;while(scanf("%d",a)>0)for(i=++j;i-->a;)i[1]=*i>=*a?*i:*(i=a);while(a<(i=j-50))printf("%d\n%d\n",*i,*j--);}

3

Mathematica -56 44 4 (95-120) = -25

แก้ไข :

รุ่นนี้อาศัยทั้งฟังก์ชั่นในตัวสำหรับการเรียงลำดับรายการและฟังก์ชั่นการสุ่ม

Riffle[RotateLeft[#[[All, 2]], 2], #[[All, 1]]] &
[Partition[l //. {x___, a_, b_, y___} /; b < a :> {x, b, a, y}, 2]]

คือSortไม่ได้เป็นฟังก์ชั่นการจัดเรียง?
Peter Taylor

คุณถูก! ฉันพลาดข้อ จำกัด เกี่ยวกับการจัดเรียง
DavidC

ฉันทำเรียงลำดับมือรีด
DavidC

3

อักขระ J, -63 (57-120)

เนื่องจากทุกคนกำลังลงเส้นทางการเรียงลำดับที่เขียนด้วยตนเอง ...

,50(}.,.{.)($:@([-.m),~m=.]#~]=<./)^:(0<#),".[;._2[1!:1[3

ไม่ใช้ฟังก์ชันตัวเลขสุ่มใด ๆ หรือการเรียงลำดับในตัว

ใช้การเรียงลำดับการเลือกแบบเรียกซ้ำแบบง่ายเพื่อเรียงลำดับอินพุต


3

ทับทิม 1.9, -59

(61-120)

เรียกซ้ำ! อันนี้จริง ๆ แล้วไม่เหมือนกับความพยายามทับทิมครั้งก่อนของฉันยกเลิกรายการโดยไม่คำนึงถึงลำดับเดิม

p *(f=->l{l[1]&&f[l-m=l.minmax]+m||[]})[$<.map &:to_i].rotate

ความพยายามครั้งก่อน

Cute one-liner ตอนนี้ใช้ builtin sort เพื่อทำงานอย่างถูกต้อง:

$<.map(&:to_i).sort.each_slice(4){|a,b,c,d|p b,d,a,c}

ตัวแรก - ไม่จำเป็นต้องยกเลิกค่า 4 ตัวสุดท้าย:

l=$<.map &:to_i
48.times{l-=p *l.minmax}
a,b,c,d=l
p b,d,a,c

1
โซลูชัน -72 ของคุณจะถือว่ารายการเริ่มต้นเรียงลำดับซึ่งไม่ใช่กรณี
ฮิสโทแคต

อุ่ย ดูเหมือนว่าฉันไม่ได้อ่านคำถามอีกครั้งอย่างละเอียดเมื่อฉันกลับมาที่นี่อีกครั้ง จะพยายามคิดหาสิ่งอื่น
daniero

@histocrat ที่ควรทำ
daniero

1

Python 2: 90 ถ่าน

n=100
s=sorted(int(raw_input())for i in range(n))
for i in range(n):print s[(4*i+4*i/n)%n]

สันหลังยาว แต่เพียงเพื่อเริ่ม


1

Python 48 = (148 - 100)

from random import*
x=[input()for i in range(100)]
while any(abs(x[i]-x[i+1])>1 for i in range(99)):n=randint(1,99);x=x[n:]+x[:n]
for j in x:print j

ยังไม่ได้ทดสอบสิ่งนี้เพราะมันไม่รับประกัน (หรือน่าจะเป็น) ที่จะทำงานในเวลาที่สมเหตุสมผล แต่ควรทำงานตามทฤษฎีที่ให้เวลาไม่สิ้นสุด


1
x=map(input,['']*100)
ugoren

และฉันไม่คิดว่าคุณจะต้องการอะไรพิเศษแม้แต่[]แค่สายอักขระตัวเดียว
งาน

1

Python 27 (147 - 100 - 20)

R=range
def S(L):
 for i in R(len(L)-1):
    if L[i]>L[i+1]:L[i:i+2]=[L[i+1],L[i]];S(L)
a=map(input,['']*100);S(a)
for i in R(100):print a[i/2+i%2*50]

หมายเหตุ: ช่องว่างก่อนหน้าif L[i]>...ควรเป็นแท็บ แต่เห็นได้ชัดว่าปรากฏเป็นช่องว่างในบล็อครหัส


ด้วยR=rangeคุณสามารถบันทึก 5 ตัวอักษร
scleaver

a=map(input,['']*100)
ugoren

1

Perl 5: 95 - 120 = -25 ตัวอักษร

การนับบรรทัดคำสั่งต่อไปนี้:

perl -ne '$n=$_;splice@n,(grep{$n[$_]>$n}0..@n),0,$n}{print for map{@n[$_,$#n/2+$_+1]}0..$#n/2'

1

ทับทิม: -50 (70 ตัวอักษร - 120)

ฉันทำเช่นเดียวกันกับคำตอบอื่น ๆ : ลบค่าสูงสุดและค่าต่ำสุดจากรายการอินพุตและผนวกเข้ากับเอาต์พุต อย่างไรก็ตามฉันตระหนักว่าหากตัวเลข 2 ตัวที่ด้านใดด้านหนึ่งของค่ามัธยฐานอยู่ติดกันผลลัพธ์จะไม่ถูกต้อง ในการแก้ไขปัญหานี้ฉันหมุนรายการ "ไม่เรียงลำดับ" โดย 1 องค์ประกอบ:

n=$*.map &:to_i;u=[];50.times{u+=n.minmax;n-=u.last 2};p *u.rotate(-1)

หรือหากต้องการทำงานกับอินพุตจำนวนมากโดยพลการ (ใช้อักขระเพิ่มอีก 4 ตัวเท่านั้น):

n=$*.map &:to_i;u=[];(u+=n.minmax;n-=u.last 2)while n.any?;p *u.rotate(-1)

หมายเหตุ: คำตอบ Ruby-char Ruby ที่น้อยลงบางส่วนได้ถูกโพสต์ไปแล้ว แต่วิธีแก้ปัญหาเหล่านั้นไม่ได้แก้ไขปัญหาค่ามัธยฐาน (และ / หรือสันนิษฐานว่าเป็นรายการอินพุตที่เรียงลำดับ)


1

J 37 - 100 = -63

({~?~@#)^:(+./@(1=|)@(2&(-/\))@/:)^:_

ใช้การเรียงลำดับ (แม้ว่าจะใช้การจัดอันดับขึ้น) ใช้ตัวเลขสุ่ม

คำอธิบาย:

({~?~@#)             NB. Randomizes the array
^: foobar ^:_        NB. as long as
foo =: +./@(1 = |)   NB. as any 1 == absolute value of
bar =: (2&(-/\))@/:  NB. differences between adjacent ranks
foobar =: foo@bar

1

Brachylog , 22 ไบต์ - 120 = -98

ṇịᵐpX¬{p≤₁s₂.&s₂p}∧Xẉᵐ

ลองออนไลน์!

ลิงก์ TIO มีอินพุตเป็นจำนวนเต็มแปดจำนวนเท่านั้นแทนที่จะเป็นหนึ่งร้อยเพราะนี่ช้ามากจนไม่สามารถจัดการได้อีกใน 60 วินาที เหตุผลสำหรับสิ่งนี้คือเหนือสิ่งอื่นใดแทนที่จะใช้อัลกอริธึมการเรียงลำดับแบบง่าย ๆ แต่ปกติสำหรับโบนัสที่ได้รับคำสั่งฉันเพื่อประโยชน์ของความกะทัดรัดใช้สิ่งที่มีจำนวนโบกโกซอร์ที่กำหนดไว้: p≤₁backtracks ผ่านการเปลี่ยนแปลงทุกครั้ง ซึ่งไม่ลดลง แม้ว่าเหตุผลที่ใหญ่กว่าอาจเป็นเพราะมันใช้กำลังดุร้ายระดับเดียวกันในการค้นหาเอาต์พุตและมันจะคำนวณเวอร์ชั่นที่เรียงใหม่ทุกครั้ง ... ฉันพยายามทดสอบมันด้วยขนาดจริง 100 แต่ฉัน ไม่แน่ใจว่าต้องใช้เวลากี่วัน

รุ่นที่ดีกว่าโดยรวม:

Brachylog 14 ไบต์ - 20 = -6

p.¬{os₂.&s₂p}∧

ลองออนไลน์!

สิ่งนี้ละเว้นข้อกำหนด I / O โบราณวัตถุสำหรับความกะทัดรัดและละเลยที่จะใช้โบนัส -100 เพื่อให้สามารถทดสอบได้โดยไม่ใช้ซูเปอร์คอมพิวเตอร์ ยังไม่ให้อะไรฉันเลย)

 .                The output is
p                 a permutation of
                  the input
  ¬{        }∧    such that it cannot be proven that
         s₂       a pair of adjacent values in
        &         the output
       .   p      is a permutation of
     s₂           a pair of adjacent values in
    o             the output sorted.

แม้ว่านี่จะไม่ใช่คำตอบที่ใช้งานได้จริง แต่ก็สามารถใช้ในการตรวจสอบความถูกต้องของเอาต์พุตจากโปรแกรมอื่น ๆ ได้เนื่องจากส่วนใหญ่เป็นเพียงการอธิบายข้อ จำกัด ที่วางไว้บนเอาต์พุต
สตริงที่ไม่เกี่ยวข้อง

0

Forth (gforth) , 79 - 120 = -21 ไบต์

: f 100 0 do dup i 2 mod 4 * 2 - i + i 99 = i 0 = - 3 * + cells + @ . cr loop ;

ลองออนไลน์!

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

คำอธิบาย

วนซ้ำทุกตัวเลขตั้งแต่ 0 ถึง 99 สำหรับแต่ละหมายเลข (n):

  • ถ้า n คือ 0:
    • ส่งออกค่าที่อาเรย์ที่อยู่ + 1
  • ถ้าไม่ใช่คือ 99:
    • ส่งออกค่าที่อาเรย์ที่อยู่ + 98
  • ถ้า n เป็นเลขคี่:
    • เอาท์พุทค่าที่อยู่อาร์เรย์ + (n + 2)
  • อื่น (n คือคู่):

    • ส่งออกค่าที่อาเรย์ที่อยู่ + (n - 2)
  • ขึ้นบรรทัดใหม่

รหัสคำอธิบาย

: f               \ start new word definition
  100 0 do        \ loop from 0 to 99
    dup           \ duplicate the array address
    i             \ place the loop index on the stack
    2 mod 4 * 2 - \ convert to 2 if it's odd and -2 if it's even
    i +           \ add the result to the the loop index
    i 99 =        \ if i = 99 place -1 on top of the stack, else place a 0
    i 0 =         \ i i = 0 place -1 on top of the stack, else place 0
    - 3 *         \ subtract previous two results from each other and multiply by 3
\ the above line is used to avoid writing if/then by instead using math to get 98 and 1
    +             \ add result to existing result from above
    cells         \ multiply by the size of a single integer in memory
    +             \ add to the array's starting address
    @ . cr        \ get the value at the calculated address, print it, then print a newline
  loop            \ end the loop
;                 \ end the word definition
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.