Дивна несортивна машина для нечесних цілей


18

Добрий вечір гольфістів!

Ваше завдання - повністю скасувати ряд чисел.

Вхідні дані

Рівно 100 цілих чисел буде подано у вашу програму. Ваша програма може сприймати вхід як файл, або через stdin. Кожне ціле число буде відокремлено символом нового рядка.

Ці 100 цілих чисел будуть варіюватися від мінімальних до максимальних значень підписаного цілого числа у вибраній мові.

Не буде повторюваних значень. Значення можуть бути впорядковані, не упорядковані або частково впорядковані - ваша програма повинна мати можливість обробляти кожен випадок.

Вихід

Вихід повинен бути кожним із 100 цілих чисел, повністю несортованим, кожне розділене символом нового рядка. Вихід може бути через stdout або у файл.

Повністю несортований означає, що жодне значення не суміжне з будь-яким значенням, до якого воно було б суміжним, якби список був повністю відсортований в упорядкованій послідовності.

Оцінка

1 бал за персонаж, і виграє найнижчий бал. Існує бонус -100 за будь-яке рішення з використанням вбудованих або бібліотечних функцій сортування. Існує бонус -20 за будь-які рішення з використанням вбудованих функцій випадкових чисел.

Я спробував визначити це питання якомога повніше. Якщо у вас є якісь питання, будь ласка, запитайте. Якщо у вас є коментарі, як я можу зробити краще наступного разу, будь ласка, дайте мені знати.

Назад!



Право, ти цього не помітив.
Strigoides

2
Це не дублікат як такий, але він не дуже відрізняється від codegolf.stackexchange.com/questions/6487/…
Пітер Тейлор

Стільки розумних відповідей! Я виберу найкоротшу відповідь 31 жовтня о 8: 10-зулу
лочок

Відповіді:


9

GolfScript (оцінка 27 - 120 = -93)

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

Примітка: $це посилання на елемент у стеці. Існує сортування, але це робиться з кодованим вручну міхуром сортування.

Завдяки Говарду, за -90 => -92; та Ільмарі, які надихнули -92 => -93.


Подяка за таку стислу відповідь, але (вибачте, я не розмовляю і не розумію GolfScript) - чи не призведе ^ дискваліфікувати це з бонуса -100?
лочок

1
@lochok, вбудована функція сортування $- ось чому я згадав, що $в програмі не є сортуваннями (це залежить від контексту). Більшість програм (28 з 42 символів) визначає функцію ^; перша версія, що використовувала вбудований сорт, мала лише 14 символів.
Пітер Тейлор

Ага - правильно. Дякуємо за роз’яснення!
lochok

1
Ви можете зберегти два символу за допомогою наступного вихідного контуру: 2/{~p}%n*.
Говард

1
2/zip~+n*а .);\+2%n*також виконайте трюк для тієї ж кількості символів, що і версія @ Говарда. На жаль, я ще не встиг знайти щось коротше.
Ілмарі Каронен

6

Пітон -26

(94-120): Новий, сирий підхід. Продовжуйте з'являти найнижчі елементи в новому списку, щоб сортувати елементи, а потім повторіть

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

Пітон -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врятувало б вам кілька символів
квазімодо

також ви можете використовувати одне execтвердження для більш ніж одного циклу.
квазімодо

@quasimodo Я спробував щось подібне, але з t=l=[]t і l вказую на той самий об’єкт, і він не працює. execХоча пропустити круглі дужки - це добре.
daniero

Ви можете використовувати t=t+[input()];, це створює новий об'єкт кожного разу. І ви можете навіть зробити цикл друку в ехесе заяви: ';i+=1;print l[i*3%100]'*100.
квазімодо

Ти знову правий. Спасибі! Також додані деякі інші гольф, як видалення %3та уникнення повторення 100.
daniero

4

C: 11 (131 - 120)

Програма читає з stdin і робить просту вставку сортування, після чого друкує n-е разом із th n + 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

Математика -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не вбудована функція сортування?
Пітер Тейлор

Ви праві! Я пропустив обмеження щодо роду.
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

Попередні спроби

Милий однолінійний, тепер використовуючи вбудований сорт для належної роботи:

$<.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 char

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

І я не думаю, що вам навіть потрібні додаткові []s, просто будь-яка окрема символьна рядок.
робота

1

Пітон 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 символів.
скаулер

a=map(input,['']*100)
угорен

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

Ruby: -50 (70 символів - 120)

Я зробив те саме, що і багато інших відповідей: ітеративно видалити max і min зі списку вхідних даних і додати їх до висновку. Однак я зрозумів, що якщо 2 числа з обох сторін медіани самі по собі є послідовними, то вихід буде неправильним (тому що ці 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)

Примітка: Деякі відповіді на меншу кількість Chary вже були опубліковані, але ці рішення не стосувалися медіанної проблеми (та / або передбачали відсортований список введення).


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

Брахілог , 22 байти - 120 = -98

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

Спробуйте в Інтернеті!

Посилання TIO має лише вхід з восьми цілих чисел, а не сто, тому що це настільки страшно повільно, що більше 60 секунд не може впоратися. Причиною цього є те, що, крім усього іншого, замість того, щоб реалізувати простий, але нормальний алгоритм сортування для обов'язкового бонусу, я заради стислості використовував те, що становить детермінований богосорт:p≤₁ через кожну перестановку входу, поки не знайде що не зменшується. Хоча більша причина, мабуть, полягає в тому, що він використовує аналогічний ступінь грубої сили, щоб знайти вихід, і що він перераховує відсортовану версію кожного разу ... Я намагався перевірити її на фактичному введенні розміром 100, але я не впевнений, скільки днів це займе.

Загальна краща версія:

Брахілог , 14 байт - 20 = -6

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

Спробуйте в Інтернеті!

Це ігнорує застарілі вимоги до вводу / виводу щодо стислості та нехтує взяти бонус -100, щоб він міг бути перевірений без суперкомп'ютера (хоча, написавши це, у мене він працював лише на 20 предметів протягом декількох хвилин, і це досі нічого мені не давали).

 .                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

Четвертий (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
  • Інше Якщо n дорівнює 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.