Виведіть пропущене ціле число


34

Вам дадуть рядок. Він буде містити 9 унікальних цілих чисел від 0-9. Ви повинні повернути відсутнє ціле число. Рядок буде виглядати приблизно так:

123456789
 > 0

134567890
 > 2

867953120
 > 4

5
@riker Це, здається, стосується пошуку числа, відсутнього в послідовності. Це, здається, стосується пошуку цифри, відсутньої у наборі.
DJMcMayhem

10
@Riker Я б не вважав, що це дублікат, враховуючи, що пов'язаний виклик має суворо збільшується послідовність (потенційно багатоцифрових чисел), тоді як тут це в довільному порядку.
AdmBorkBork

3
Привіт Джош! Оскільки поки що ніхто не згадував про це, я направляю вас до пісочниці, де ви можете розмістити майбутні ідеї для викликів та отримати змістовні відгуки перед публікацією на головну. Це допомогло б випрасувати будь-які деталі (наприклад, STDIN / STDOUT) і вирішило б дублювання дилеми до того, як ви отримали тут скоромовки.
AdmBorkBork

1
Це така ганьба, що 9-х% 9 працює на будь-яку цифру, крім 0. Можливо, хтось розумніший за мене знайде спосіб змусити її працювати.
Біджан

2
Кілька відповідей приймають ціле число як вхід функції. Це дозволено?
Денніс

Відповіді:


36

Python 2 , 18 16 байт

+ краса завдяки @Sarge Borsch

`99066**2`.strip

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

99066**2 це лише коротший спосіб генерації рядка, який містить 0 ~ 9


7
32043 можна змінити на більш красиве число. 99066 є симетричним по центру (не змінюється, якщо повернути його на 180 градусів навколо центру) або, можливо, 97779 (паліндром, дві чіткі цифри)
Sarge Borsch

1
Якщо ОП дозволяє надрукувати число двічі, 764**4можна зберегти два байти.
Тит

@Titus 764**4відсутній 5, 8і9
Rod

1
Друк ... я мав на увазі 763**4=338920744561
Тит

25

Пітон , 22 байти

lambda s:-int(s,16)%15

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

Арифметичне рішення. Інтерпретує вхідний рядок як шістнадцятковий, заперечує його та приймає результат 15.


2
Чи можете ви пояснити, чому це працює?
KarlKastor

1
@KarlKastor, модуль 15 в базі 16 працює аналогічно модулю 9 в базі 10. Модуль основа-1 є постійним, коли береться сума цифр, тільки тому, що 10 ≡ 1 (mod base-1). Сума всіх можливих цифр є постійною, тому пропущена цифра є різницею цієї постійної та вхідного числа (основа модуля-1).
mik

16

APL (Dyalog) , 4 байти

Похідна функція

D∘~

⎕DД запалює

 (прив'язує лівий аргумент до наступної діадичної функції для створення монадичної функції)

~ крім [аргументу]

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


Функціональний поїзд

D~⊢

⎕DД запалює

~ крім

 правильний аргумент

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


Явна програма

D~⍞

⎕DД запалює

~ крім

 введення символів

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


12

Мозок-Флак , 48 38 36 + 3 = 39 байт

10 байтів збережено завдяки DJMcMayhem!

((([]())[]{}){()()({}[()])}{}[{{}}])

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

Пояснення

Сума всіх цифр в Ascii становить 525. Ця програма підсумовує вхід і віднімає його від 525, щоб отримати пропущену цифру.

((([]())[]{}){()()({}[()])}{}      )

Буде натискати 525. Це використовує той факт, що ми знаємо, що для початку буде 9 елементів введення. Це означає, що []оцінюється до 9, що дозволяє нам швидко дістатись до великої кількості, як 525.

Далі ми маємо трохи:

                             [{{}}]

який підведе підсумки вхідних даних і відніме його від загального.


Як це працює?
Павло

@ ГригорийПерельман Пояснення додано!
Пшеничний майстер

2
Якщо ви перемістите negative(sum(input()))до кінця, ви можете зловживати накладкою висоти штабеля, щоб легше натиснути 525. (([][][]()()()){()()({}[()])}{}[{{}}])має заощадити 10 байт
DJMcMayhem

30 байт , віднявши натомість 477
Джо Кінг

12

Haskell , 24 23 байти

(477-).sum.map fromEnum

Спробуйте в Інтернеті! Використання: (477-).sum.map fromEnum $ "123456890". 477 - це сума символьних кодів цифр від 1 до 9, виключаючи 0. Ця анонімна функція обчислює 477 за мінусом суми всіх знакових кодів символів для знаходження відсутнього.

Повернення цифр знаків до ints на один байт довше:

(45-).sum.map(read.pure)
foldl(\a b->a-read[b])45

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


10

Желе , 3 байти

ØDḟ

Просто фільтруйте ( ) рядок введення з "0123456789" ( ØD).

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


3
Мені подобається те, що всі мови для гольфу (і навіть деякі мови для гольфу) використовують один і той же алгоритм, але Jelly вдається мати найкоротші назви для вбудованих ним файлів, і найменше котельні для повернення аргументів .

1
@ ais523 APL - це буква за буквою однаково (за винятком того, що це буде фрагмент APL, а не функція / програма): Ø= , D= D, = ~, як у ⎕D~'867953120'.
Адам

3
Я, прокручуючи відповіді: "Я прогнозую 3 символи в Желі". Бінго. : ^ D
DLosc

9

Рубі, 14

Підсумовує коди ascii і віднімає від 48 * 9 + 45

->s{477-s.sum}

Використовуйте так

f=->s{477-s.sum}

puts f["123456789"]

9

JavaScript (ES6), 26

Відредагуйте 1 байт збереження thx @Neil, набагато розумнішим трюком

Зведення всіх значень від 1 до 9 дає 1. Xor 1 ще раз, а результат - 0. Отже, якщо якесь одне значення відсутнє, результатом буде значення, що відсутнє.

s=>eval([1,...s].join`^`)

Тест

f=s=>eval([1,...s].join`^`)

function go() {

  var i=I.value;
  O.textContent = f(i)
}  

go()
<input oninput='go()' value='012987653' id=I>
<pre id=O></pre>


s=>eval([1,...s].join`^`)зберігає байт.
Ніл

@Neil ... і це набагато цікавіше
edc65

Я відчуваю, що ця порада підозріло коротка після моєї відповіді : D все одно приємний гольф +1.
Крістоф

1
@Christoph Ну це звучало так, ніби ти хочеш поширити слово ...
Ніл

@Neil absolutly :) Приємно бачити, що це допомогло!
Крістоф

8

Сітківка , 27 21 19 байт

-6 Завдяки Basic Sunset
-2 Дякую Мартіну Ендеру

.
$*_5$*
+`_1|1_

1

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

Замініть кожну цифру на стільки _s і 5 1s:

.
$*_5$*

Видаліть усі _s та a 1для кожного:

+`_1|1_ 


Порахуйте кількість 1лівих s:

1

Перший рядок другої відповіді може бути справедливим ..
Ніл

Ви можете зберегти кілька байтів, використовуючи заміщення замість заміщення: спробуйте в Інтернеті
Business Cat

Ну добре, і ось я щойно отримував другу відповідь до старого рахунку байтів першої відповіді ...^ 5 ^. $*9¶ . $*_ +`_¶_ _
Ніл

@Neil Я отримав його на один менше, ніж оригінал.
Райлі

(Так, це виглядає підозріло схожими на мою відповідь, єдина відмінність полягає в тому , що ви перейшли від _до 1зберегти байт.)
Neil


6

JavaScript (ES6), 31 29 28 22 байт

s=>(15-`0x${s}`%15)%15

Порт відповіді Python @ xnor, за винятком того, що JavaScript має лише оператор залишку, а не оператор модуля, тому я не можу це зробити за один крок. Редагувати: Збережено 6 байт завдяки @Arnauld.


s=>[...s].map(c=>r-=c,r=45)|r;-)
ETHproductions

3
Ви занадто сильно закохані reduce. +1 у будь-якому випадку
edc65

@Arnauld Я не бачу, що це працює s[0]!='0', але відповідь уже використовується eval.
Ніл

Ви могли б зробити s=>(15-`0x${s}`%15)%15?
Арнольд

@Arnauld Bah, і я вже робив це для порту Batch ...
Ніл

6

Brainfuck, 17 15 байт

-[-[->-<],]>++.

Спробуйте це тут . Це рішення працює лише на стандартному Brainfuck (8-бітові комірки), оскільки воно покладається на обгортку.

Це рідкісний день, коли Brainfuck може насправді конкурувати, але цей виклик щойно трапився, щоб вирівнятися зі специфікацією BF!

Замість прямого розбиття на цю відповідь, я хотів би перейти через ітерації, які я взяв, тому що я думаю, що це було б зрозуміліше (і цікавіше).
Зауважте: це рішення в значній мірі натхнене відповіддю Бріт-Флака Пшеничного Майстра .

Пояснення

Крок 1, 26 байт

У своїй відповіді Wheat Wizard вказував, що сума значень ASCII від 0-9 до 525. А оскільки стандартний Brainfuck має лише поняття [0,255], це складає значення 525% 256 = 13 . Тобто, віднімання значень ASCII вхідного сигналу від 13 дає змогу вам пропустити цифру.

Перша версія цієї програми була:
1. Помістіть 13 у першу клітинку
2. Візьміть дані у другу клітинку
3. Відніміть другу клітинку з першої комірки
4. Перейдіть до 2, якщо залишилися входи
5. Роздрукуйте першу клітинку

А ось код простого рішення:

+++++++++++++ #Set the first cell to 13  
>,            #Take inputs into the second cell  
[[<->-],]     #Subtract the second cell from the first cell and repeat until inputs are over  
<.            #Print the first cell  

Крок 2, 19 байт

Як було зазначено у його відповіді, оскільки ми знаємо, що вхід буде точно довжиною 9, ми можемо використовувати це значення як константи та усунути цю довгу нитку + на початку.
Також не має значення, в який момент ми додаємо 13 (спасибі, комутативна властивість!), Тому ми будемо змішувати його з кроками віднімання та друку.

,        #Take input to enter the loop
[[->-<], #Subtract the first cell from the second cell 
>+<]     #Add 1 for each input; totaling 9
>++++    #Add the missing 4 to make 13
.        #And print

Це була моя оригінальна відповідь на цю проблему, але ми можемо зробити краще.

Крок 3, 17 байт

Цікаво, що попередня відповідь працює навіть у тому випадку, якщо ми починаємо з + замість,

+[[->-<],>+<]>++++.

Brainfuck вимагав чогось у комірці, щоб почати цикл. Ми наївно додали, що додаткові 4 врешті-решт, коли це могло піти в інших місцях.

-[[->-<],>+<]>++.

За допомогою цілковитої навмисної хитрості циклу (читання: проб і помилок), запуск програми з а - призводить до двох цікавих результатів:

  1. Один додається до другої комірки (збереження 1 байт в кінці).
  2. Цикли виконуються один додатковий час, загалом 10, а не 9 (збереження ще 1 байт).

1 + 10 + 2 = 13, і ми закінчуємо оригінальною відповіддю.

Озираючись на це, це, мабуть, надмірна оплата на таку просту програму Brainfuck.

Крок 4, 15 байт

Трохи подумавши над цим рішенням, я зміг відрізати 2 байти.

Я хотів щось уточнити щодо попереднього кроку:
Мінус для входу в цикл ефективно додає 1, але те, що він насправді робить, - відняття 255 з другої комірки (в результаті виходить 1).

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

-[-[->-<],]>++.

Мені вдалося видалити "> + <", додавши "-" на початку першого циклу. Він повинен туди йти, а не там, де був "> + <", тому що програма буде циклічно нескінченна інакше.



5

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

477-Tr@ToCharacterCode@#&

Чиста функція, що приймає рядок як вхідний і повертає ціле число. Mathematica має довгі імена команд і неохоче перетворюється між рядками та цілими числами, що робить це особливо погано при цьому виклику. Найкращим, що я міг знайти, був алгоритм з відповіді Ruby Level River St , який робить обчислення на основі загальної кількості ASCII кодів вхідного рядка; в Mathematica для цього використовується лише одне довге ім'я команди.


5

PHP, 27

<?=trim(32043**2,$argv[1]);

використовує фокус з відповіді Рода, щоб створити рядок, що містить усі цифри, а потім видаляє всі цифри, крім відсутньої.


PHP, 41

for($b=1;$i<9;$b^=$argv[1][$i++]);echo$b;

Цей використовує xor, тому що я його ще не бачив.


Приємно, що я не думав про обробку. Альтернативні значення32043,32286,33144,35172,35337,35757,35853,37176,37905,38772,39147,39336,40545,42744,43902,44016,45567,45624,46587,48852,49314,49353,50706,53976,54918,55446,55524,55581,55626,56532,57321,58413,58455,58554,59403,60984,61575,61866,62679,62961,63051,63129,65634,65637,66105,66276,67677,68763,68781,69513,71433,72621,75759,76047,76182,77346,78072,78453,80361,80445,81222,81945,83919,84648,85353,85743,85803,86073,87639,88623,89079,89145,89355,89523,90144,90153,90198,91248,91605,92214,94695,95154,96702,97779,98055,98802,99066
Jörg Hülsermann

5

Bash + coreutils, 19 байт

Я знайшов коротше рішення bash, яке використовує цікавий підхід контрольної суми:

sum -s|dc -e524?--P

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

Пояснення:

sumКоманда друкує контрольну суму і підрахунок блоків. Я не знаю багато деталей, але використовую опцію-s (алгоритм System V) зробимо контрольну суму рівним ASCII сумі кожного вхідного символьного коду. Як така, контрольна сума залишається постійною, коли змінюється порядок одних і тих же символів введення.

Наведений 867953120як тестовий випадок (останній приклад), ось як працює сценарій:

  • sum -sвиходи 473 1. Якби жодне ціле число не було, контрольна сума була б 525.
  • dc -e524?штовхає 524, а потім вхід труби. Стек: 1 473 524. Ідея полягає в тому, щоб відняти контрольну суму від 525, але оскільки сума результатів 1 також, мені потрібно працювати з нею.
  • --P. Після застосування двох вирахувань (524- (473-1)), стек: 52. За допомогою 'P' я друкую символ з таким кодом ASCII:, 4що відсутня цифра.

4

Fortran 95, 146 128 байт

function m(s)
character(len=10)::s,t
t='0123456789'
do j=1,10
k=0
do i=1,9
if(s(i:i)==t(j:j))k=1
end do
if(k==0)m=j-1
end do
end

Я не дуже короткий, боюся.

Безголівки:

integer function m(s)
    implicit none

    character(len=9)::s
    character(len=10)::t
    integer:: i, j, k

    t='0123456789'
    do j=1,10
        k=0
        do i=1,9
            if (s(i:i) == t(j:j)) k=1
        end do
        if (k==0) m=j-1
    end do

end function m



3

Брахілог (2), 5 байт

ẹ:Ị↔x

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

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

Пояснення

ẹ:Ị↔x
ẹ      Split the input into a list of characters
 :Ị    Pair that list with the string "0123456789"
   ↔x  Remove all elements of the list from the string

xреалізація стара і досить баггі, саме тому вам потрібно .
Фаталізувати

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

Маючи ¬∋ℕроботу , як це не можливо навіть в Пролозі, якщо спеціально НЕ програмування , що ви маєте в виду, що не not in. ¬в Брахілогу еквівалентно \+Прологу, і його значення полягає в тому, що "не піддається допущенню в умовах закритого світу", а не "дай мені пункти вибору для всього, що цього не підтверджує" (що майже завжди є нескінченною кількістю речей )
Фаталізувати

Єдиним способом зробити це в Prolog було б "заздалегідь" позначити " , але це означало б посилання на порядок оцінки Брахілога на основі вмісту предикатів. Це лише одна з проблем, які вона має; є тонна інших.

3

Лист звичайний, 47 байт

(lambda(s)(- 45(reduce'+ s :key'digit-char-p)))

Безголівки:

(lambda (s) (- 45 (reduce '+ s :key 'digit-char-p)))

Пояснення:

(reduce '+ s :key 'digit-char-p)

Цей цикл проходить через знаки s, перетворює їх у цифри та додає їх. Digit-char-p, як зручно, повертає номер знака як його "справжнє" значення, тому його можна використовувати як тест або перетворення.

(- 45 ...)

Віднімання з 45 повертає цифру, яка відсутня на введенні.


3

Кубікс , 18 байт

5v&;52/ni?@.>!&oW+

Розширено

    5 v
    & ;
5 2 / n i ? @ .
> ! & o W + . .
    . .
    . .

Спробуйте тут

Використовується такий самий метод, як і ця відповідь, що відповідає мозку .

Створіть на стеку значення -525, натиснувши 5, 2, об'єднати, натиснути 5, об'єднати і заперечити.
Потім повторно отримуйте введення та додайте, поки не буде досягнуто кінця введення.
Видаліть останній ввід, відмініть (зробіть позитивним) останній результат додавання, виведіть символ і зупиніть.

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



3

Bash (+ утиліти), 22, 19 байт

  • Використовуйте seqзамість розширення дужок, -3 байти (Thx @Riley!)
seq 0 9|tr -d \\n$1 

Тест

$seq 0 9|tr -d \\n123456789
0

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


Якби ви перемістили простір до цього, $1це було б очевидніше ...
Ніл

@Neil, так, це гарна ідея! Дякую !
зеппелін

Ви можете використовувати seqзамість echo: seq 0 9|tr -d \\n$1
Райлі

3

Google Таблиці, 39 33 байт

Вхід вводиться в комірку A1.

Код:

=REGEXEXTRACT(4&2^29,"[^"&A1&"]")

Збережено 6 байт завдяки Стіву Кассу.

Попередній код:

=REGEXEXTRACT("0123456789","[^"&A1&"]")

Результат:

введіть тут опис зображення


Число 2 ^ 29 має всі цифри, окрім 4, тому 33 байти: = REGEXEXTRACT (4 & 2 ^ 29, "[^" & A4 & "]")
Стів Касс

@SteveKass Nice. =REGEXEXTRACT(0&49^9,"[^"&A1&"]")також є правильним рішенням, враховуючи подібну логіку. Оновлена ​​відповідь.
Грант Міллер

3

Befunge 98, 14 12 байт

Я врятував 1 байт, перемістивши програму на 1 рядок і 1 байт, зробивши кращу математику

~+;@.%a--7;#

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

Пояснення

Сума значень ASCII коливається від 477 до 468 залежно від того, яке число відсутнє. Віднімаючи це від 7, ми отримуємо діапазон -470 до -461. Змінивши це число на 10, ми отримаємо діапазон 0 - 9, який ми можемо потім надрукувати.

~+;       ;#    Sums the ASCII values of all characters to stdIn
~          #    The # doesn't skip over the ~ because it's on the end of a line
~               Once EOF is hit, the ~ reverses the IP's direction
          ;#    Jump the ; that was used before
       --7      Subtract the sum from 7 (really just 0 - (sum - 7))
     %a         Mod it by 10
   @.           Print and exit

Причиною того, що я використовую значення ASCII замість того, щоб брати цілі введення, є те, що &команда в «Спробуйте це онлайн» зупиняється на EOF (навіть незважаючи на те, що вона повинна змінювати IP). Хоча ~працює правильно.

Стара програма , 14 байт

#v~+
@>'i5*--,

Сума значень ASCII всіх 10 цифр дорівнює 525. Віднімаючи суму заданих цифр від 525, отримуємо значення ASCII відсутнього символу.

#v~+         Sums the ASCII values of all characters on stdIn
             Moves to the next line when this is done
 >'i5*       Pushes 525 (105 * 5)
      --     Subtracts the sum from 525
@       ,    Prints and exits

2

PowerShell , 30 байт

param($n)0..9|?{$n-notmatch$_}

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

Бере введення $n, конструює діапазон 0..9(тобто 0, 1, 2 ... 9), потім використовує Where-Objectпункт (the |?{...}), щоб витягнути число, яке робить регулярний вираз -notmatch. Що залишилося на конвеєрі, вихід неявний.



2

Піт, 5 байт

-jkUT

Спробуй це!

пояснення

-jkUT
    T   # 10
   U    # The unary range of ten: [0,1,..,9]
 jk     # join that on the empty string
-       # set minus

"-jUT" також начебто працює, але створює нові рядки для кожного int.


2

05AB1E , 5 байт

žhISK

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

Пояснення

žh     # from the string "0123456789"
    K  # remove
  IS   # each digit of the input

6
Мені це подобається, тому що ти можеш сказати це вголос. "" žhISK ", - закричав він, коли махав палицею над верхньою шапочкою, і маленький білий кролик з'явився в димі".
Пінгвіно
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.