Більше менше, а менше - більше


72

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

Напишіть повну програму, внутрішню функцію або фрагмент для середовища REPL мовою на ваш вибір, яка відповідає таким критеріям:

  1. Ваш код повинен бути принаймні 1 символом.

  2. Запуск оригінального коду видає x символів виводу до STDOUT (або найближчої альтернативи), де 0 ≤ x <+ ∞ .

  3. Видалення будь-якого довільного одного символу з вихідного коду знову призводить до дійсного коду, який видає щонайменше х + 1 символів виводу в STDOUT.

  4. Ні оригінальний код, ні модифікації не можуть створювати помилок виводу, бути в STDOUT, STDERR, syslog або в іншому місці. Єдиними винятками з цього правила є попередження компілятора.

    Ваша програма може не вимагати жодних прапорів чи налаштувань, щоб придушити вихід помилок.

    Ваша програма може не містити фатальних помилок, навіть якщо вони не дають результатів.

  5. І вихідний код, і модифікації повинні бути детермінованими і в кінцевому підсумку (без нескінченних циклів).

  6. Ні оригінальний код, ні модифікації не потребують будь-якого введення.

  7. Функції або фрагменти можуть не підтримувати жодного стану між виконанням.

Зважаючи на те, що це завдання є тривіальним в деяких мовах, а в інших - неможливо, це на .

При голосуванні враховуйте "відносну стислість" коду, тобто коротшу відповідь слід вважати творчішою, ніж довшу відповідь на тій же мові .


2
Хоча рішення в 1 байті вражає, було б більш вражаючим побачити, хто може придумати найвище співвідношення x: x + nie довжина нормального виводу порівняно із середньою довжиною виводу при видаленні будь-якого одного символу. Додає додаткове завдання цьому питанню на мою думку.
Трент

@FizzBuzz Easy: 111111111111111111^111111111111111111(якщо ви мали на увазі найнижчий коефіцієнт).
jimmy23013

2
Ах, щойно помітив: "Нескінченних петель". Я працював над створенням програми <<>, яка б швидше створювала вихід, якщо було видалено один символ, таким чином, що після постійних kвказівок вихід кожної програми суворо перевищує вихідний вихідний з того часу (тому що інша програми будуть циклічніше або виведено більше кожного циклу). Це виглядало досить цікаво. Можливо, я побачу, чи зможу це все-таки закінчити, і зроблю ще один виклик.
mbomb007

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

Що розуміється під внутрішньою функцією?
dfeuer

Відповіді:


94

Будь-яка відповідь із операцією caret XOR, 5 байт

11^11

11^11Звичайно, 0. Єдині інші можливості є 1^11або 11^1яких 10, або 1111які виробляє сама.


7
Добре зіграний, feersum. Гарно зіграно.
Олексій А.

13
Мінус теж зробив би трюк.
Мартін Ендер

11
Аналогічно,99|99
Sp3000

@ Challenger5 -10довше, ніж 0.
Мартін Ендер

@MartinEnder О, бачу. Я чомусь подумав, що це мусить бути більша кількість.
Esolanging Fruit

55

TI-BASIC, 3 1

"

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

2 байти:

isClockOn

Те саме, що вище, але з 2-байтовим маркером.

3 байти:

ππ⁻¹

Друкується 1через передбачуване множення. Можна продовжити на невизначений термін, додавши пари ⁻¹'s. Нижче також працюють.

√(25
e^(πi
⁻ii
ii³
2ππ   
cos(2π

Більш довгі рішення:

11/77►Frac
ᴇ⁻⁻44
cos(208341   //numerator of a convergent to pi; prints "-1"

Напевно, є також багаторядкові рішення, але я не можу їх знайти.


Я не знайомий з TI BASIC. Чи вважаєте ви sqrt і дужки як єдиний символ?
Рівень річки Св.

6
Так, sqrt і круглі дужки - це один маркер, який зберігається як один байт у пам'яті калькулятора і вводиться одним натисканням клавіші.
lirtosiast

8
нарешті спосіб зупинити це дратівливе повідомлення Готово!
Фараз Масрур

1
Немає Doneлексеми; калькулятор відображається Doneпісля завершення виконання будь-якої програми без виразу в останньому рядку (включаючи порожню програму).
lirtosiast

48

CJam, JavaScript, Python тощо, 18 байт

8.8888888888888888

Виходи в CJam:

8.8888888888888888 -> 8.88888888888889
8.888888888888888  -> 8.888888888888888
88888888888888888  -> 88888888888888888
.8888888888888888  -> 0.8888888888888888

JavaScript і Python працюють аналогічно. Він не є конкурентоспроможним у JavaScript та Python, але коротший у CJam знайти непросто .


16
Приємне зловживання з плаваючою комою!
nderscore

31

Октава, 5 байт

10:10

(x: y) дає масив чисел між x і y з кроком 1, тому між 10 і 10 єдиним елементом є 10:

> 10:10
ans = 10

Коли другий аргумент менше першого, октава друкує порожню матрицю та її розміри:

> 10:1
ans = [](1x0)

> 10:0
ans = [](1x0)

Коли символ видаляється з першого числа, у масиві є більше елементів:

> 1:10
ans = 1 2 3 4 5 6 7 8 9 10

> 0:10
ans = 0 1 2 3 4 5 6 7 8 9 10

Коли видаляється двокрапка, число повертається:

> 1010
ans = 1010

1
також діє в R
mnel

30

Мікроскрипт, 1 байт

h

Це не створює жодних результатів, оскільки hпригнічує неявну друк мови. Видалення єдиного символу створює програму, вихід якої є 0\n.

Я спробую пізніше придумати кращу відповідь.

РЕДАКЦІЯ 17 листопада:

Це також працює в Microscript II, за винятком того, що замість того, щоб поступатись 0\n, порожня програма поступається null.


22

Pyth, 3 байти

cGG

Gпопередньо ініціалізується малими літерами в алфавіті. cце спліт-функція.

cGGрозбиває алфавіт за появами алфавіту, який закінчується на ['', ''](8 байт).

Коли другий параметр відсутній, cрозбиває рядок на пробіли, вкладки або нові рядки. Так як ні один з них не з'являються G, вихід на cGце ['abcdefghijklmnopqrstuvwxyz'](30 байт).

І GGпросто двічі друкує алфавіт на двох окремих рядках: abcdefghijklmnopqrstuvwxyz\nabcdefghijklmnopqrstuvwxyz(53 байти).

Спробуйте в Інтернеті: Демонстрація


16

Python REPL, 6 байт

Не найкоротший, але ось ще одна відповідь на зловживання плаваючою комою:

>>> 1e308
1e+308
>>> 11308
11308
>>> 11e08
1100000000.0
>>> 11e38
1.1e+39
>>> 11e30
1.1e+31

Але ...

>>> 11e308
inf

14

JavaScript (і багато іншого), 5 байт

44/44 або

44/44 -> 1
44/4  -> 11
4444  -> 4444
4/44  -> 0.09090909090909091


11

Ленгуага , 5 байт

00000

Довжина програми становить 5, що відповідає програмі brainf ***, яка ,читає кінець вхідного символу та закінчується без виводу.

Видалення будь-яких результатів знаків із коду, 0000який має довжину 4, відповідає програмі brainf ***, .роздруковуючи один символ ( кодову точку 0) та закінчуючи.

Унарне еквівалент буде 0000000000000(13 нулів) , тому що ви повинні випереджати провідні 1до двійкового довжини коду так 101стає 1101.


9

PHP, 6 байт

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

<?php 

(відзначте пробіл після секунди p)

Це виводить порожній рядок. Видалення будь-якого символу виводить текст без символу. Зверніть увагу, що це може призвести до помилок HTML (вміст, який не відображається браузерами, наприклад. <?ph).

Я також спробував з echoтегом. тобто. напр .:

<?= __LINE__;;

Цей виводить 1. Якщо =пропущено, <? __LINE__;;- це вихід. Однак видалення будь-якого з магічних постійних символів призведе до отримання E_NOTICE : Примітка: Використання невизначеної постійної LNE - передбачається " LNE " у ...

Якщо повідомлення не вважаються помилками (пункт 4 правил), це також стосується :-)


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

@Dennis PHP виводить що завгодно . Ви завжди можете використовувати CTRL-U у своєму браузері, щоб побачити вихід. HTML може бути недійсним, але насправді програма не є (немає <HTML>тегів тощо)
Voitcus

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

2
#!у файлі сценарію також працює.
jimmy23013

9

Пітон, 10 8 байт

256**.25

Працює в Python та друзів. Дякую Якубе за те, що він показав, як зробити його на 2 байти менше.

Від IDLE:

>>> 256**.25
4.0
>>> 26**.25
2.2581008643532257
>>> 56**.25
2.7355647997347607
>>> 25**.25
2.23606797749979
>>> 256*.25
64.0
>>> 256*.25
64.0
>>> 256**25
1606938044258990275541962092341162602522202993782792835301376L
>>> 256**.5
16.0
>>> 256**.2
3.0314331330207964

спочатку у мене було це (10 байт):

14641**.25

Від IDLE:

>>> 14641**.25
11.0
>>> 4641**.25
8.253780062553423
>>> 1641**.25
6.364688382085818
>>> 1441**.25
6.161209766937384
>>> 1461**.25
6.18247763499657
>>> 1464**.25
6.185648950548194
>>> 14641*.25
3660.25
>>> 14641*.25
3660.25
>>> 14641**25
137806123398222701841183371720896367762643312000384664331464775521549852095523076769401159497458526446001L
>>> 14641**.5
121.0
>>> 14641**.2
6.809483127522302

і на цій же примітці:

121**.25*121**.25

працює однаково завдяки гарному округленню Python, у 17 байт.

>>> 121**.25*121**.25
11.0
>>> 21**.25*121**.25
7.099882579628641
>>> 11**.25*121**.25
6.0401053545372365
>>> 12**.25*121**.25
6.172934291446435
>>> 121*.25*121**.25
100.32789990825084
>>> 121*.25*121**.25
100.32789990825084
>>> 121**25*121**.25
3.8934141282176105e+52
>>> 121**.5*121**.25
36.4828726939094
>>> 121**.2*121**.25
8.654727864164496
>>> 121**.25121**.25
29.821567222277217
>>> 121**.25*21**.25
7.099882579628641
>>> 121**.25*11**.25
6.0401053545372365
>>> 121**.25*12**.25
6.172934291446435
>>> 121**.25*121*.25
100.32789990825084
>>> 121**.25*121*.25
100.32789990825084
>>> 121**.25*121**25
3.8934141282176105e+52
>>> 121**.25*121**.5
36.4828726939094
>>> 121**.25*121**.2
8.654727864164496

@Akiino я не розумію зроблені вами зміни. Видалена лінія була однією з необхідних можливостей і не відрізнялася від будь-якої з них. Чи можете ви пояснити, чому ви її зняли? Я відкотив це назад, але можу погодитися скасувати дію з адекватними міркуваннями.
rp.beltran

Мій внутрішній перфекціоніст просто не міг спати, знаючи, що лінія (та, яку я видалив) дублюється без причини. Є рядки 56..., 26...і 56...знову ж таки, але існує лише один спосіб отримати 56, тому його слід включити лише один раз, чи не так?
Akiiino

О, я не бачив, щоб це було двічі. Мій поганий, хороший улов.
rp.beltran

Я відкинув відкат.
rp.beltran

7

Перекладач SWI-Prolog

__A=__A.

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

Вихідний запит __A=__A.виходи true..

Запит _A=__A.виводить _A = '$VAR'('__A'). Подібні модифікації (тобто видалення одного _або одного з двох A) призведе до подібних результатів.

Нарешті, запит __A__A.виводить у SWI-Prolog:

% ... 1,000,000 ............ 10,000,000 years later
% 
%       >> 42 << (last release gives the question)

12
@Jakube Я не бачу, як обов'язковий фінальний період значно відрізняється від того, щоб ввести клавішу введення, щоб запустити фрагмент іншою мовою. Якщо ви вилучите подачу рядка, він також не запуститься.
Фаталізувати

У деяких мовах воно більше еквівалентно крапці з комою, і це вважається символом.
tomsmeding

5

Сід, 1 байт

d

Оскільки sedпотрібен потік введення, я пропоную конвенцію про те, що сама програма повинна подаватися як вхід.

$ sed -e 'd' <<<'d' | wc -c
0
$ sed -e '' <<<'d' | wc -c
2

Альтернативна програма x, але змінюється тільки 1в 2байти виведення при видаленні.


2
Я фактично забув додати жодного правила введення до питання, тож ви не порушили жодних правил під час надсилання. Я створив дискусію Чи є такі мови, як sed, виключені з правил "без введення"? на Meta.
Денніс

5

К, 3 байти

2!2

Виходи 0в REPL. Видалення перших 2 виходів 0 1, видалення вигуку призводить до 22і видалення останніх 2 результатів у рядку, який змінюється між реалізаціями K, але завжди має принаймні 2 символи (в oK, це (2!); згідно з результатами @Dennis, Kona 2!).


@ Sp3000 Видалення *лише відбитків 2. Видалення двох відбитків (*!)(неповна функція) в oK; Я не знаю про інших перекладачів (наприклад, Kona, k2 тощо), хоча я вважаю, що Кона надрукувала б *[!;]щось подібне. Я пішов із зняттям зірки, тому що вона здавалася найбезпечнішою.
kirbyfan64sos

Ви не можете вибрати, він повинен працювати, видаляючи будь-якого символу
edc65

@ edc65 Виправлено за рахунок жодного байта.
kirbyfan64sos

1
@Dennis Оновлено
kirbyfan64sos

5

MATLAB, 9 7 байт

Це на 2 байти довше, ніж інші відповіді MATLAB / Octave, але мені це все ж подобається, оскільки це трохи складніше.

'Оператор Матлаба - це складне сполучене транспондування. Використовуючи це на скалярному уявному числі, ви отримуєте i' = -i. Оскільки уявні числа можна записати просто так, як 2iце можна зробити:

2i--2i'
ans =
     0    

Видалення будь-якого з символів призведе до одного з наведених нижче:

ans =
   0.0000 - 1.0000i
   2.0000 - 2.0000i
   0.0000 + 4.0000i
   0.0000 + 4.0000i
   0.0000 + 1.0000i
   2.0000 + 2.0000i
   0.0000 + 4.0000i

4

GolfScript, 2 байти

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

:n

За замовчуванням всі програми GolfScript друкують весь стек з подальшим підведенням рядків, виконуючи putsвесь стек. Сама функція putsреалізована як {print n print}в інтерпретаторі, де printє фактично вбудованою і nє змінною, яка містить "\n"за замовчуванням рядок .

Тепер програма GolfScript завжди висуває вхід STDIN на стек. У цьому випадку, оскільки вводу немає, висувається порожній рядок. Призначення змінної :nзберігає цей порожній рядок n, пригнічуючи неявну передачу рядків і робить вихід повністю порожнім.

Видаляючи n, вам залишається незавершене призначення змінної :(ви можете подумати, що це синтаксична помилка, але немає), тому неявна передача рядків друкується як зазвичай.

Видаляючи :, ви залишаєтеся з n, що висуває подачу ліній на стек, тому програма друкує два канали ліній.


4

APL, J та, можливо, інші варіанти, 3 байти

--1

Він виводить 1у APL. -1виводить ¯1і --виводить у TryAPL наступне :

┌┴┐
- -

3

J, 5 байт

|5j12

Величина комплексного числа 5 + 12iв REPL.

   |5j12 NB. original, magnitude of the complex number `5 + 12i`
13
   5j12  NB. the complex number `5 + 12i`
5j12
   |j12  NB. magnitude of the undefined function j12
| j12
   |512  NB. magnitude of 512
512
   |5j2  NB. magnitude of 5 + 2i
5.38516
   |5j1  NB. magnitude of 5 + 1i
5.09902

.

J, 9 байт

%0.333333

На основі точності з плаваючою точкою, зворотної та зворотної матриці.

   %0.333333 NB. original, reciprocal of 0.333333
3
   0.333333  NB. 0.333333
0.333333
   %.333333  NB. matrix inverse of 333333
3e_6
   %0333333  NB. reciprocal of 333333
3e_6
   %0.33333  NB. reciprocal of 0.33333
3.00003

Спробуйте його онлайн тут.


3

Математика, 3 байти

4!0

4!0  ->  0    the factorial of 4, times 0
4!   ->  24   the factorial of 4
40   ->  40
!0   ->  !0   the logical not of 0, but 0 is not a boolean value

3

Діалог APL , 2 байти

⍴0 повертає порожній рядок (довжина 0)

повернення (довжина 1)

0повернення 0(довжина 1)


2

Швидкий (і багато іншого), 8 байт

93^99<84

вихід (4 символи):

true

При видаленні n-го символу вихід:

n -> out
----------
0 -> false
1 -> false
2 -> false
3 -> false
4 -> false
5 -> 10077
6 -> false
7 -> false

Існує 78 можливих подібних рішень у форматі a^b<c.

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


Я думав про це, але це могло б бути легким для мов на основі стека. Якби це був виклик боулінгу з кодом, у aditsu було б нескінченна оцінка. Його код можна повторювати знову і знову; кожна копія зробить точно так само.
Денніс

@ Денніс О, я бачу, так, це має сенс, але я думаю, що байти, можливо, не дуже вдалий захід для цього завдання
Kametrixom

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

2

MathGolf , 2 байти

♂(

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

Пояснення

♂   Push 10
 (  Decrement TOS by 1

Чому це працює?

Регулярний вихід є 9. Якщо значення (видалено, вихід 10. Якщо вилучено, програма неявно вискакує 0 із стека, щоб подати (оператора, який виводить -1.


1

Clojure, 11 байт

(defn x[]1)

Спочатку я думав просто опублікувати відповідь одного символу у відповіді, як і інші мови, наприклад

user=> 1
1

Але проблема полягає в тому, що якщо ви видалите цей символ, REPL нічого не робить при натисканні клавіші enter. Тож замість цього його потрібно було обробити функцією, дозволеною правилами питання. Коли ви викликаєте цю функцію, вона повертається 1. Якщо ви видалите єдиний символ у функції,

(defn x[])

повертається функція, nilяка друкує додаткові два байти.

user=> (defn x[]1)
#'user/x
user=> (x)
1
user=> (defn y[])
#'user/y
user=> (y)
nil

1
Для уточнення: Конкурс вимагає внутрішньої функції , яка була б 1у цьому випадку (1 байт).
Денніс

1

05AB1E (спадщина), 1 байт

Будь-який єдиний байт 05AB1E (спадщина) працював, за винятком [(нескінченний цикл).

Дивіться тут усі можливі виходи для всіх можливих однобайтових програм 05AB1E.

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

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


05AB1E , 1 байт

?

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

На жаль, порожня програма в новій версії 05AB1E за замовчуванням видає лише 1-байтовий новий рядок ( Спробуйте в Інтернеті ), тому майже жоден з 1-байтових символів неможливий, оскільки їм нічого не доведеться виводити. ?Наскільки мені відомо, єдина можлива програма, яка нічого не дає (так само не неявний новий рядок) .


0

Japt , 2 байти

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

Aпопередньо ініціалізовані до 10, Éвіднімає 1, і результат 1 байт: 9.

Видалення É результатів у програмі A, яка виводить значення A 10, тому результат - 2 байти.

Аналогічно, видалення A призводить до того, Éщо інтерпретується як -1, а результат - як 2 -1, а результат 2 байти.


0

Runic Enchantments , 6 (може змінюватися) байт

11-{{B\
/B~~@/
\00<
R"Error"@

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

У Runic немає середовища REPL, і написання повної програми для задоволення обмежень не представляється можливим (це призводить до недійсних програм або відсутності результатів). Таким чином, частина коду 11-{{Bвиступає як внутрішня функція, і лише ця частина може бути змінена. BІнструкція досить близько до покажчика функції і оператору повернення , що ця класифікація повинна бути прийнятною (як стрибає IP на позицію в коді, а також штовхаючи зворотне розташування в стек , який може бути доступний подальшої Bабо відкидається) .

  • Стандартний вихід: 0
  • Видалення будь-якого з 1s:05
  • Видалення -:11
  • Видалення будь-якого {:Error051
  • Видалення B:120

Заключний \на кінці першого рядка надає зовнішню межу навколо внутрішньої функції у випадку, якщо інструкція повернення буде видалена, щоб IP-адреса не лукавила всюди скрізь невольно (ні друкує жодного результату).

Зауважте, що Error051це лише довільна рядок, я міг би помістити все, що мені захотілося, у цю частину коду, і "Помилка" була кумедним результатом наявності коду, який підводить координати повернення та IP-телепорти до довільного місця.

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