Дійсна протягом століть


24

Натхнене цим питанням на SO , ваше завдання - створити програму, яка діє в (принаймні) двох основних версіях обраної вами мови, що дають різні результати.

Правила

  • Можна використовувати будь-яку мову, що має більше однієї основної версії.
    • Для цілей цього виклику я б запропонував "основну версію", де змінюється перший номер у номері версії.
      • PHP 4 і PHP 5 різні, PHP 5.3 і PHP 5.4 - ні.
    • Однак, оскільки я не знаю схему версій для всіх мов, якщо ви можете досить добре аргументувати свою справу, я впевнений, що громада визначить, чи були ви справедливі у визначенні "основної версії" самостійно.
  • Код повинен бути складений і запускатися з однаковими прапорами та вводити кожен раз
    • За винятком зміни версії мови, якщо це доречно
  • Помилки не зараховуються як вихідні дані, а відповіді, що призводять до помилок, дискваліфікуються (а не вихід помилок просто ігнорується)
  • Програма не повинна брати жодного вводу, крім необхідного для її запуску.
  • Для кожної версії вихід повинен бути завжди однаковим
  • Намір полягає в тому, що зміна має бути наслідком зміни специфікації мови, а не специфікації VM або метаданих навколишнього середовища

Оцінка балів

  • скоринг типу за довжиною, так що +1для кожного знака / байта
  • -1для кожної різниці символів у довжині виводу.
    • наприклад, вихід 1 версії abcde(5 символів), вихід 2 версії 123abc(6 символів) =-1

Інші правила

  • Застосовуються стандартні винятки - відсутність зовнішніх програм, веб-запитів тощо.
  • Ваша програма повинна припинитись (протягом 2 секунд)
  • Виграє найнижчий рахунок.

«Краще» бал

Зберігайте свої оригінальні відповіді, в інтересах справедливості я відзначу переможця на основі оригінальних правил.

Оскільки моє оригінальне оцінювання принципово порушено, чому б не повторно оцінити / повторити спробу за допомогою наступної системи балів:

  • скоринг типу за довжиною, так що +1для кожного знака / байта
  • +1для кожної різниці символів у довжині виводу
    • abcdeі 123456->+1
  • -1для кожної унікальної різниці символів у виводі (обмеженому на довжину найкоротшого виходу)
    • abcdeі 123456->-5
    • 12345і 123456->-1
    • 12345і 123455->0
  • Очки, найближчі до нуля, виграють
  • У разі перерви у другому тайму виграє простий рахунок з .

Примітка: у Рубі перший номер - епоха , він означає основні події в історії Рубі, а не номер версії (0-> 1 був початковим випуском, 1-> 2 - 20-річчям від дня народження Рубі). Основне число - це друге число. Отже, Ruby 1.8-> 1.9 перетне головний реліз.
Йорг W Міттаг

1
Я думаю, що нове оцінювання занадто відрізняється від оригіналу, це практично нове запитання
Tal

Я б сказав, що приклад PHP є спірним, 5.4 має досить багато основних функцій, які б розбиваються на 5.3 (риси, [] масиви, перенаправлення масиву). Це буде PHP6, але тоді він вирішив зберегти 6 на щось більш радикальне, як рядки Unicode за замовчуванням IIRC
Einacio

2
У чому полягає унікальна різниця персонажів? Якщо я виходжу zzzzі aaaaчи дає це мені -4? Ось так мені здається.
Джастін

1
Отже, якщо припустити, що програма може виявити, в якій версії вона працює, переможцем є хто може вивести найбільше символів за дві секунди? Я думаю, що це питання було б краще, як конкурс популярності, щоб заохотити людей знаходити цікаві та тонкі мовні помилки.
Головоноги

Відповіді:


39

Переглянута відповідь на "кращу" систему балів

C89 / C99, оцінка: 0

Моя програма має 52 символи і використовує той самий механізм, що і в моїй оригінальній відповіді, щоб досягти різних результатів. Це працює, тому що C89 не розглядає //як коментар:

i=32;main(){putchar(i+++0//**/
+52)&&i<84&&main();}

Результати:

$ ./diff2c89
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRS
$ ./diff2c99
TUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂Çüéâäàåç
$ ./diff2c99 | wc
      0       1      52
$ ./diff2c89 | wc
      0       1      52
$ wc diff2.c
      1       2      52 diff2.c

Стара відповідь:

C89 / C99, Оцінка: -Нескінченність?

Я не зовсім впевнений, чи ця програма не порушує правила, але нічого неважливо. Ця програма використовує той факт, що в C89 //це не вагомий коментар, але /* ... */є.

За допомогою трюку коментарів виконується інша функція. У C89 функція просто друкує, "trolololol..."поки стек не переповнений (тому він може закінчитися протягом 2 секунд).

f1(){printf("ol");f1();}
f2(){printf("oll");}
main(){
    printf("tr");
    void (*f[])() = {f1,f2};
    f[0 //* trollololol */
      +1]();
}

C99

$ ./diffc99
troll

C89

$ ./diffc89
trolololololololololololololololololololololololololololololololololololololololololo
lolololololololololololololololololololololololololololololololololololololololololol
ololololololololololololololololololololololololol ....

1
Я не впевнений, чи це суперечить правилам, але мені це подобається :)
Tal

9
Згідно з "кращими правилами", Scores closest to zero winтому це насправді дуже далеко від нуля.
користувач80551

1
Індексація масиву функціональних покажчиків шляхом поділу або додавання залежно від визначення коментарів стандарту C ... прекрасно.
Desty

16

Python - на 10 балів менше, ніж наступна найкраща відповідь

print(range(100))

У Python 2 це буде надрукувати весь список цілих чисел від 0 до 99.

У Python 3 rangeє генератором, і він буде друкувати лише "діапазон (0,100)".

Бачачи, що я ніколи не стикався з обмеженням розміру чисел у Python, я можу замінити цю 100 набагато більшим числом (наприклад, 2 ** 1000), і в кінцевому підсумку з практично нескінченною різницею у виході.

Відредаговано так, що, хоча я можу отримати безмежно низьку оцінку для будь-яких практичних цілей, я не можу досягти фактичної нескінченності з програмою, яка закінчується за 2 секунди

Для оновленої системи підрахунку балів я хочу подати:

print(range(4))

Вихід:

Пітон 2: [0, 1, 2, 3]

Пітон 3: range(0, 4)

Перший друк має 5 унікальних символів ( [123]), другий - 8 унікальних символів ( range(4)), різниця в довжині виводу - 1, код - 15 символів, найкоротший вихід - 11 символів ... ці правила досить заплутані, але Я думаю, що це підводить мене до остаточного балу 15 + 1 хв (11,5 + 8) = 5.


Однак "ваша програма повинна припинитись", навіть на дуже швидкій машині ваш "набагато більший" (кінцевий) номер все ще ніде не є ∞, тому я заперечую вашу оцінку (дайте чи візьміть;])
Джеймс Вебстер

@JamesWebster Дякую, що довели до мене цю страшну технічну помилку, я відповідним чином відредагував свою відповідь;)
Тал

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

@Vereos Я сподіваюся, що якщо з’являться інші відповіді подібного роду, питання буде відредаговано з додатковими деталями оцінки.
Тал

1
@Tal Я думаю , що кожен , хто читає правила підрахунку очок складе рішення , яке може призвести негативні оцінки, обмежені тільки мовою або апаратного забезпечення, до того , прочитати будь-яку відповідь на питання;) Скоринг просто зламаний дизайн ...
foobar

13

Пітон - 0 балів

Не маю уявлення, як це працює: P Просто натрапили на нього, випробовуючи випадковий код.

int

На Python 3 це, <class 'int'>а на Python 2 - це <type 'int'>(за допомогою інтерактивної консолі) Оцінка
"Краще": 3 (довжина) + 1 (різн. Символи) - 4 (унікальні символи)

Старший Пітон 1 - 7 балів

print()

Велика подяка @grc за цю версію та допомагає мені відняти чотири бали!

У Python 2 це твердження трактується як те, print ()що друкує порожній кортеж ().
У Python 3 printфункція є функцією, що не призводить до друку.
Оцінка "Краще": 7 (довжина) + 2 (різниця) - 2 (унікальні символи)

Старший Python 2 - 13 балів:

print(1,2)

Оцінка "Краще": 12 (довжина) + 2 (різн. Різ. O / p) - 1 (унікальні символи o / p)

Я знаю, що це не виграє, але все ж дав відповідь, оскільки це моя перша спроба Python :)


Я думаю, це можна скоротити print().
grc

@grc Дякую за пораду! Озираючись на свого компілятора, я бачу, що я спробував це, але в документах настільки втратив, що я його видалив, щоб спробувати dict.itertools(): P
Gaurang Tandon

12

C #

Я також змінив алгоритми виводу типу загального методу між C # 2, 3 і 4. Наприклад:

using System;
class C
{
  static int M<T>(T x, T y) { return 1; }
  static int M(object x, object y) { return 2; }
  static void Main() 
  {
    Console.WriteLine(M(1, new int?()));
  }
}

У методі C # 2 умовивід типу говорить, що T не може бути intі тим int?, і таким чином виробляє 2. У методі C # 3 тип виводу говорить "найкращий компроміс між intі int?є int?", і таким чином обирає M<int?>та виробляє 1.


9
> Я також змінив Що ти означає, що ти змінив ... о. ОН.
Боб

9

Ruby, 4 символи + 0 різниць довжини символів - 3 унікальних різниці знаків = оцінка 1

p ?d

На Ruby 1.9 він надрукує "d". На 1.8 він друкує 100.

Пояснення: ?dзнаходиться "d"в 1.9 та 100(код ASCII для d) у 1.8. p xеквівалентно puts x.inspect. *є одночасно і рядковим повторенням, і множенням.


"Оптимізована" версія для старого скорингу:

Рубі, 8 символів - 999999989 символів різниця = оцінка -999999981

p ?!*1e9

Друкує 33000000000.0для 1,8 та "!!!!!!... !!!"для 1,9. ( ?!є 33в 1,8 і "!"в 1,9 і *є одночасно повторенням і множенням рядків.)

Дійсно, ви могли б піти так далеко, як хотіли з множенням, це просто залежить від того, наскільки швидкий ваш комп'ютер.


Чи можете ви пояснити, що саме відбувається в тому другому рядку?
Тал

@Tal Добре, відредагований
дверна ручка

8

Bash - -∞ (до практичних обмежень)

Ефективно, скільки б ви не мали пам’яті. Наприклад, приблизно 10 Гб:

echo {0..999999999}

Bash 2: не підтримує діапазони розширення дужок, тому друкує {0..999999999}.

Bash 3:


Будь-яка мова - -∞ (до практичних обмежень)

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

version = … # some arbitrarily weird stuff
if version = 2:
    while not timed_out():
        print "version2"

@foobar У "будь-якій мові" версія означає будь-які хитрощі, якими ви користуєтеся, щоб ваша програма залежала від зміни мовної специфікації. Це визначення версії, робити чи ви if $version >= 3або if isinstance(range(0),list).
Жил "ТАК - перестань бути злим"

4

C #

Наступний код дасть різний вихід для C # 5.0 та попередніх версій C #

using System;
using System.Collections.Generic;

namespace TestConsoleAppClosure
{
    class Program
    {
        static void Main(string[] args)
        {
            var actions = new List<Action>();
            List<int> list = new List<int> { 10, 20, 30, 40 };
            foreach (var item in list)
            {
                  actions.Add(() => Console.WriteLine(item));
            }
            foreach (var act in actions) act();
        }
    }
}

Вихід: C # 5.0

10
20
30
40

Вихід: C # 4.0

40
40
40
40

Причину пояснює в дописі блогу Ерік Ліпперт

Закриття змінної циклу вважається шкідливим


4

Python, -14 балів (3 - 17 різниць довжини знаків = -14)

2/3

Виходи Python 2: 0

Виходи Python 3: 0.6666666666666666

Краща версія підрахунку балів, 5 балів (3 + 2 значення різниці знаків = 5)

3/2

Виходи Python 2: 1

Виходи Python 3: 1.5


4

C #

Я додав коваріації та противаріантності до C # 4, тому програми форми:

using System;
using System.Collections.Generic;
class C
{
  static void Main() 
  {
    Console.WriteLine((new List<string>()) is IEnumerable<object>);
  }
}

Випускатимуться falseв C # 2 і 3 та trueв C # 4.

Однак можна стверджувати, що це не враховується, оскільки бібліотека, що містить визначення, IEnumerable<T>також мала змінитись.


3

C ++ 98/11 - «Краще» балів (115 символів - 115 унікальних різниць символів у виході = оцінка 0)

Трохи відредагована версія, щоб відповідати новим правилам скорингу

Гольф:

#include<cstdio>
#define u8 "\x0B"
int main(){int i=116;char c[i];c[--i]=0;while(i-->0)c[i]=u8"\x7E"[0]+i;puts(c);}

Негольована версія:

#include <cstdio>
#define u8 "\x0B"
int main() {
    int i = 116;
    char c[i];
    c[--i] = 0;

    while(i-- > 0)
        c[i] = u8"\x7E"[0] + i;

    puts(c);
}

Нове рішення не сильно відрізняється від старого. У новому рішенні висновок як для C ++ 11, так і для C ++ 98 має 116 символів однаково довго, але єдиним спільним символом є новий символ рядка, доданий функцією put.

Для C ++ 98 u8в по- u8"\x7E"[0], як і раніше буде замінений, але тепер з "\x0B". Тож отримане значення після попередньої обробки буде "\x0B""\x7E"[0]. Два рядки будуть об'єднані "\x0B\x7E"і оператор підпису отримає доступ до першого елемента, в цьому випадку символу зі значенням 11 в кодуванні символів. Додатково iдодаватиметься значення, яке по суті становить 114. Отже, символ із значенням 125 буде записаний у отриманий масив. По мірі iнуля всі масиви від 125 до 11 записуються в масив і putsдрукують усі символи зі значеннями від 11 до 125 плюс новий проміжний рядок.

У C ++ 11 u8"\x7E"[0]буде інтерпретуватися як рядок UTF-8, що складається з одного символу з шістнадцятковим значенням 7E. Оператор підписки тепер отримає доступ до цього символу і до iнього додається значення, в результаті чого десяткове значення 241 під час першої ітерації. Поки iйде в нуль, всі значення вниз до 126 записуються в масив і putsдрукують символи зі значеннями від 126 до 241, плюс останній новий рядок.

Залежно від використовуваного набору символів, це дасть різні результати, оскільки більшість наборів символів мають лише перші 128 символів.

Для ISO-8859-2 вихід буде таким:

C ++ 98: Вихід для C ++ 98

C ++ 11: Вихід для C ++ 11

C ++ (106 символів - 107 різниця у виході = оцінка -1) (СТАРІ ПРАВИЛА)

Гольф:

#include<cstdio>
#define u8 "f"
int main(){int i=108;char c[i];c[--i]=0;while(i-->0)c[i]=u8""[0];puts(c);}

Негольована версія:

#include <cstdio>
#define u8 "f"

int main() {
    int i = 108;
    char c[i];
    c[--i] = 0;

    while(i-- > 0)
            c[i] = u8""[0];

    puts(c);
}

Складено з g++ -std=c++98 main.cppі g++ -std=c++11 main.cpp.

Насправді ви можете замінити 108 будь-яке додатне число в цілому діапазоні, щоб досягти негативних балів. Поки вона більша за 108;)

У C ++ 98 #define u8 "f"викликатиме препроцесор замінити u8""[0]з "f"""[0]. Це призведе до того "f"[0], що нарешті стає єдиним символом 'f', який записується в масив.

puts(c)буде друкувати отриманий масив, що складається з i-1 'f'.

У C ++ 11 u8""[0]викличе порожню рядок інтерпретувати як рядок UTF-8, тому ніяке конкатенація рядків не проводиться. Оскільки це C-рядок, оператор підписки отримає доступ до закінчуючого нульового байта і запише його в масив.

Зрештою puts(c)буде надруковано отриманий масив, який складається лише з нульових байтів. Але як putsперестає читати вхід, як тільки він зустріне нульовий байт, він надрукує лише новий рядок і більше нічого.


Я вважаю, що ваш показник дорівнює 1. І c ++ 89, і c ++ 11 виводять a ?(принаймні в моїй (Mac) системі)
James Webster

Хоча я розраховую лише 115 символів у рішенні.
Джеймс Вебстер

@James Webster true, wc -c збрехав мені;) Я додаю новий рядок до кінця свого рішення;) ... Або просто відкоригуйте його.
foobar

@James Webster Я думаю, що ви використовуєте кодування UTF-8 у своєму терміналі. Оскільки найзначніший біт у байті зарезервований у UTF-8, він не може відобразити символи, які програма виводить у діапазоні від 128 до 232. Отже, ви повинні побачити до 104 '?' або менше з бінарним сміттям між ними. З кодуванням WINDOWS-1256 як прикладом, ваш термінал відображатиме це для версії C ++ 11: tuvwxyz {|} ~ € پ ‚ƒ„… † ‡ ˆ ‰ ٹ ‹Œ چژڈگ ''„ ”• • –—کک ™ ڑ > œ ں, ¢ £ ¤ ¥ | §¨ © ھ «¬®¯ ° ± ²³'μ¶ · ¹;» ¼½¾ ہءآأؤإئابةتثجحخدذرزسشصض × طظعغفقك à â ل منهو?
Foobar

Для версії C ++ 98 можливо, що ваш термінал відображає "?" для значень нижче 32 як контрольних символів. Наприклад, мій термінал замінює більшість із них на квадрат, а їх шістнадцяткове значення друкується в ньому. За винятком нових символів рядків і вкладок як прикладів. Але тепер, коли я сам це згадую. версія C ++ 98 містить новий рядок двічі, але це легко виправити;)
foobar

2

CSS2 проти CSS3 48 балів

<i style='font-feature-settings:"smcp" on;'>abcdefghijklmnopqrstuvwxyz</i>

Відображається як ABCDEFGHIJKLMNOPQRSTUVWXYZ(маленькі кришки) у браузерах CSS3

Відображається як abcdefghijklmnopqrstuvwxyzу браузерах, що не мають CSS3

74 символи - 26 унікальних знаків різниці = 48


Але це помилка в CSS2. Я думав, помилки не враховуються.
Містер Лістер,

@MrLister AFAIK-налаштування шрифту було введено в CSS3 dev.w3.org/csswg/css-fonts/#propdef-font-feature-settings
Toni Toni Chopper

1

Perl, 24 символи - (9 * (10 ^ 9)) - 1 різниця знаків = оцінка - ((9 * (10 ^ 9)) - 1) +24

print$]>=5?"a":"a"x9e9;

Друкує 9е9 разів aдля всіх версій нижче 5, друкує aдля всіх версій вище 5. Ви можете зробити показник нескінченно низьким, просто додавши більше as до другого результату.


2
У запитанні: "Намір полягає в тому, що зміна має бути наслідком зміни специфікації мови, а не специфікації VM або метаданих навколишнього середовища"
Doorknob

Я не використовую ніяких специфікацій VM чи метаданих навколишнього середовища. Просто встановлена ​​версія.
Вінс

1

Befunge, 36 - 378 = -342; 164 - 2576 = -2412

"v
"<v
" <v
"  <v
"   <v
 <v:,<
 ^_@

У Befunge 93 це дозволить отримати 3 пробіли, а <vпотім 76, після <vчого 76, потім 76 простір <v, потім 76 простір, потім <v77 пробіли, потім v78 пробіли. Довжина. 3 + 2 + 76 + 2 + 76 + 2 + 76 + 2 + 77 + 1 + 78 = 395Це тривіально можна розширити, додавши додаткові лінії, схожі на перші 5 рядків.

У Befunge 98 це може вивести <v <v <v <v v.

Різниця в довжині: 395 - 17 = 378. Отже оцінка була б (за старими правилами):-342

Примітка: я міг би отримати ще більшу різницю, якби використовував .замість цього ,; різниця була б-684


Зміна правила:

Це трохи складніше.

"  "-v>"Befunge 93 very long strings"v>"F"0g" "1-`!#v_   "F"0g1-"F"0pvz
     _^p0"F"-1g0"F"_v#    `-1" "g0"F"<^"j++a81zzzzzz]zzzzzzzzzzzzzzz"<
             _@#`0:,<

Вихід 93:

sgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeBsgnirts gnol yrev 39 egnufeB

Вихід 98:

j++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzzj++a81zzzzzz]zzzzzzzzzzzzzzz

Довжини : 2576. Жоден із символів між рядками не є однаковим, тому якщо я правильно зрозумів виклик, мій бал є 164 - 2576 = -2412(так, я повинен був прагнути 0, але це було веселіше). Якщо мені потрібно зробити так, щоб кожен символ у кожному рядку був унікальним і відрізнявся один від одного, я можу це зробити, будь ласка, скажіть мені.


1

Powershell, "Краще" забивання, -163 (15 - 178 знач. Різн. = -163)

$PSVersionTable

Powershell V2

Name                           Value                                                                   
----                           -----                                                                   
CLRVersion                     2.0.50727.5477                                                          
BuildVersion                   6.1.7601.17514                                                          
PSVersion                      2.0                                                                     
WSManStackVersion              2.0                                                                     
PSCompatibleVersions           {1.0, 2.0}                                                              
SerializationVersion           1.1.0.1                                                                 
PSRemotingProtocolVersion      2.1                                                                     

Powershell V3

Name                           Value                                                                   
----                           -----                                                                   
WSManStackVersion              3.0                                                                     
PSCompatibleVersions           {1.0, 2.0, 3.0}                                                         
SerializationVersion           1.1.0.1                                                                 
BuildVersion                   6.2.9200.16398                                                          
PSVersion                      3.0                                                                     
CLRVersion                     4.0.30319.1022                                                          
PSRemotingProtocolVersion      2.2 

1

PHP, Оцінка: 0 (найкращий випадок)

srand(2);echo rand();

Нічого собі, це буде цікаво пояснити.

Згідно з цим веб-сайтом , srand()здається, функція порушена з PHP 5.1.5 до PHP 5.3.14 . Тому ми будемо тримати під розглядом PHP 4.4.9 та одну випадкову версію PHP 5, яка потрапляє у вказаний вище інтервал версій.

Вихід PHP 4.4.9: 1505335290

Я не думаю, що це порушує правила; Оскільки це видається помилкою, вихід повинен бути однаковим, але це не так. Наша інша версія PHP просто пропустить srand()функцію і виведе випадкове число.


1

Java (близько -2.000.000.000)

Версії Java іноді називають 1.x, але я думаю, що це все ще в межах правил.

Найпростіший спосіб - перевірити, чи існує клас, який був представлений у певній версії.

try {
    Class.forName("java.lang.AutoCloseable");
    // Java 7 or later
    char[] text = new char[Integer.MAX_VALUE];
    Arrays.fill(text, 'a');
    System.out.println(new String(text));
} catch (Exception e) {
    // Java 6 or earlier
    System.out.println("-");
}

(Трохи залежить від вашого терміналу, чи можна вивести 2 мільярди символів за дві секунди Integer.MAX_VALUE.

Цей код залежить від версії VM / JDK, яка використовується (чи враховується це?)

import java.lang.reflect.Field;
import java.util.Arrays;

{
    Field fValue = null;
    for (Field f: String.class.getDeclaredFields()) {
            if (f.getName().equals("value")) {
                    fValue = f;
            }
    }
    char[] text = new char[10];
    Arrays.fill(text, 'a');
    String s1 = new String(text);
    String s2 = s1.substring(1);
    fValue.setAccessible(true);
    text = (char[]) fValue.get(s2);
    Arrays.fill(text, 'z');
    System.out.println(s1);
}

Він друкує zs для Java 6 та більш ранніх JDK та as для останніх версій.


1

JavaScript (ES3 проти ES5) - 9 балів

довжина 10 + різниця довжин 0 - різниця виходу1

[].map?1:0

Виходи 1для сучасних браузерів, які підтримують Array.prototype.map. Виходи 0на старих браузерах. Я тестував це за допомогою IE8.

За старими правилами: 0 балів

length 26 - різниця в довжині26

Array([].map?27:0).join(0)

Виходи 00000000000000000000000000на сучасних браузерах. І порожній рядок на старому.


IE8 дійсно підтримує ES4 ???
Бергі

Я скоріше здивувався, як вони реалізували неіснуючий стандарт
Бергі

Ого! Виправлено :)
nderscore

1

Пітон - 0

a='a=%r\ntry:print a%%a\nexcept:pass'
try:print a%a
except:pass

Python 2 друкує лайку, тоді як Python 3 нічого не друкує.

EDIT: оновлено, виправлено.


Чи може ваш комп'ютер дійсно друкувати ~ 9 мільярдів цифр за 2 секунди?
Джеймс Вебстер

@JamesWebster Це фактично повернене значення функції - таким чином, для завершення програми потрібно лише існувати в пам'яті. Він вимагає / lot / оперативної пам’яті, але він завершиться протягом 2 секунд на добре розробленому комп'ютері.
cjfaure

0

APL (5 - (1988894 - 1) = -1988888)

У старих APL-файлах (наприклад, Dyalog, якщо ⎕ML=0*), означає суміш , яка на 1-мірному векторі нічого не робить. У APL2-стилі APL, як GNU APL (або Dyalog, якщо ⎕ML=3), означає перше , що приймає перший елемент вектора.

Таким чином, наступні 5байти (діаграма APL дійсно вкладається в байт),

↑⍳3e5

буде виводити 1988894байти (список розділених пробілом чисел від 1 до 3e5) в діалектах APL старого стилю,

і 1байт (лише перше число у згаданому списку, яке є 1і, отже, довжиною 1), у діалектах APL2 стилю APL2.

Примітки:

  • ⎕MLозначає рівень міграції . У Dyalog APL, чим вище ви встановлюєте ⎕ML, тим більше функцій стилю APL2 увімкнено. Це за замовчуванням до 0. (І це глобальна змінна! Весело!)
  • 3e5було найвищим 3-символьним значенням, яке Dyalog APL прийняв би . 4e5дав мені LIMIT ERROR. Це обмеження, ймовірно, залежить від перекладача. (GNU APL не мав проблем з більш високими значеннями.)

0

Bash 7 (довжина програми 14 байтів + ​​0 різниці у довжині виводу - 7 різниць у унікальних символах у виході)

Пов’язаний з відповіддю @Gilles, але відрізняється функцією розширення та різними версіями. Оцінка балів відповідно до відредагованого питання:

echo {1..9..2}

Вихід для bash 3.x:

{1..9..2}

Вихід для bash 4.x:

1 3 5 7 9

0

PHP: −134217684 (43 - 134217727)

echo str_pad("",ip2long("")&0x7ffffff,"a");

Використання:

time php -r 'echo str_pad("",ip2long("")&0x7ffffff,"a");' > /tmp/test
1.61user 0.17system 0:01.79elapsed 99%CPU (0avgtext+0avgdata 142272maxresident)k
0inputs+0outputs (0major+35922minor)pagefaults 0swaps

У PHP5 + це нічого не надрукує, оскільки ip2long з недійсним аргументом перетворюється на хибний, який переходить у нуль. У PHP4 він ip2long("")повертає -1, і ми прокладаємо порожню рядок із 128 Мб oga .

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

З новими правилами: 0 (40 - 40. Ви не можете наблизитися до нуля.)

echo str_pad("",40,chr(97+ip2long("")));

Виходи:

In PHP4: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 
In PHP5: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

За новими правилами балів ваш бал становить 39. Обидва результати однаково довгі, тому жодного штрафу за це. Але є лише одна унікальна різниця персонажів. a не дорівнює b, тому вам дозволяється відняти -1 від вашої оцінки.
foobar

0

C89 / C99 коментар експлуатувати, 45 символів, 0 балів

main(a){while(++a<47)putchar(79-a//**/~0
);}

c89 вихід

QRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} - 45 знаків.

c99 вихід

MLKJIHGFEDCBA@?>=<;:9876543210/.-,+*)('&%$#"! - 45 знаків.


Це насправді використовує таку саму логіку, з іншого C відповіді .
користувач12205

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

Цей запис перевершує початковий "інший відповідь С" на кількох рівнях. Це коротше, результат ідеальний, завершується за дві секунди і не збивається і не переривається. Що стосується оновленої версії ... справедливо, ви, мабуть, повинні залишити коментар, що посилається на цей код.
Джонні Кейдж

Ваша відповідь краща за "початкову" іншу відповідь С, оскільки ця інша відповідь надіслана перед зміною правила.
користувач12205

Можливо, але оновлена ​​версія зірває мою реалізацію. Мало того, що він використовує ті самі компенсації та переходить з printfна putchar; Найбільш проклятим є те, що для r5 я неправильно прочитав правила і випадково поєднав нове і старе балів. Вихід для [r5, r6] - помилка. r3 в іншій відповіді C містить точно таку ж помилку. Якщо ви подивитеся на часові позначки, то побачите, що тут було розміщено r5 , коли інша відповідь оновлена. Це не важливо, оскільки це код гольфу , і ця запис задовольняє виклик у меншій кількості символів, періоду.
Джонні Кейдж

0

C ++ 98 / C ++ 11

#include <iostream>

int main()
{
  for (long i = 0; i < __cplusplus; ++i)
     std::cout << "x";
}

Для стандартного компілятора C ++ 98 це виводить 199711 разів більше літери "x", тоді як для стандартного компілятора C ++ 11 це виходить у 201103 разів більше літери "x". Тому різниця в довжині виводу становить 1392 символи. Це означає, що насправді гольфу на вихідний код не варто, оскільки набагато більший ефект можна досягти, просто замінивши "x"на довший рядок або множивши __cplusplusна деяку кількість.


0

SmileBASIC 3 / SmileBASIC 2, Оцінка: -5 (оригінальна оцінка)

?1E9

У сучасних версіях SB це друкується 1000000000як очікувалося, але у версії 2 та більш ранній друкується 10через помилку.


0

TI-Basic 83 Plus проти 84 Plus, оцінка 5-1 = 4

length("setTime(

Виходи 2на TI-83 Plus, де та сама програма аналізується як щось, що схоже на те, length("?►DMSщоsetTime( команда ще не була введена. Так рядок містить два однобайтових лексеми, її довжина - 2.

Виводиться 1на TI-84 Plus, оскільки рядок, що містить один 2-байтовий маркер, має довжину 1.


0

Ідіть 1.9-> 1.10. Оцінка = 1 - 1 = 0

З 1.10 приміток :

Для налаштування GOMAXPROCS більше немає обмеження. (У Go 1.9 ліміт становив 1024.)

package main 
import (r"runtime")
var g=r.GOMAXPROCS
func main() {g(10340)
print(g(0))}

1,8: 256

1.9: 1024

1.10: 10340

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.