Вам дадуть рядок. Він буде містити 9 унікальних цілих чисел від 0-9. Ви повинні повернути відсутнє ціле число. Рядок буде виглядати приблизно так:
123456789
> 0
134567890
> 2
867953120
> 4
Вам дадуть рядок. Він буде містити 9 унікальних цілих чисел від 0-9. Ви повинні повернути відсутнє ціле число. Рядок буде виглядати приблизно так:
123456789
> 0
134567890
> 2
867953120
> 4
Відповіді:
+ краса завдяки @Sarge Borsch
`99066**2`.strip
99066**2
це лише коротший спосіб генерації рядка, який містить 0 ~ 9
764**4
можна зберегти два байти.
764**4
відсутній 5
, 8
і9
763**4
=338920744561
lambda s:-int(s,16)%15
Арифметичне рішення. Інтерпретує вхідний рядок як шістнадцятковий, заперечує його та приймає результат 15.
⎕D∘~
⎕D
Д запалює
∘
(прив'язує лівий аргумент до наступної діадичної функції для створення монадичної функції)
~
крім [аргументу]
⎕D~⊢
⎕D
Д запалює
~
крім
⊢
правильний аргумент
⎕D~⍞
⎕D
Д запалює
~
крім
⍞
введення символів
10 байтів збережено завдяки DJMcMayhem!
((([]())[]{}){()()({}[()])}{}[{{}}])
Сума всіх цифр в Ascii становить 525. Ця програма підсумовує вхід і віднімає його від 525, щоб отримати пропущену цифру.
((([]())[]{}){()()({}[()])}{} )
Буде натискати 525. Це використовує той факт, що ми знаємо, що для початку буде 9 елементів введення. Це означає, що []
оцінюється до 9, що дозволяє нам швидко дістатись до великої кількості, як 525.
Далі ми маємо трохи:
[{{}}]
який підведе підсумки вхідних даних і відніме його від загального.
negative(sum(input()))
до кінця, ви можете зловживати накладкою висоти штабеля, щоб легше натиснути 525. (([][][]()()()){()()({}[()])}{}[{{}}])
має заощадити 10 байт
(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
ḟ
.
Ø
= ⎕
, D
= D
, ḟ
= ~
, як у ⎕D~'867953120'
.
Підсумовує коди ascii і віднімає від 48 * 9 + 45
->s{477-s.sum}
Використовуйте так
f=->s{477-s.sum}
puts f["123456789"]
Відредагуйте 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`^`)
зберігає байт.
-6 Завдяки Basic Sunset
-2 Дякую Мартіну Ендеру
.
$*_5$*
+`_1|1_
1
Замініть кожну цифру на стільки _
s і 5 1
s:
.
$*_5$*
Видаліть усі _
s та a 1
для кожного:
+`_1|1_
Порахуйте кількість 1
лівих s:
1
.
.
^
5
^.
$*9¶
.
$*_
+`_¶_
¶
_
_
до 1
зберегти байт.)
s=>(15-`0x${s}`%15)%15
Порт відповіді Python @ xnor, за винятком того, що JavaScript має лише оператор залишку, а не оператор модуля, тому я не можу це зробити за один крок. Редагувати: Збережено 6 байт завдяки @Arnauld.
s=>[...s].map(c=>r-=c,r=45)|r
;-)
reduce
. +1 у будь-якому випадку
s[0]!='0'
, але відповідь уже використовується eval
.
s=>(15-`0x${s}`%15)%15
?
-[-[->-<],]>++.
Спробуйте це тут . Це рішення працює лише на стандартному Brainfuck (8-бітові комірки), оскільки воно покладається на обгортку.
Це рідкісний день, коли Brainfuck може насправді конкурувати, але цей виклик щойно трапився, щоб вирівнятися зі специфікацією BF!
Замість прямого розбиття на цю відповідь, я хотів би перейти через ітерації, які я взяв, тому що я думаю, що це було б зрозуміліше (і цікавіше).
Зауважте: це рішення в значній мірі натхнене відповіддю Бріт-Флака Пшеничного Майстра .
У своїй відповіді 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
Як було зазначено у його відповіді, оскільки ми знаємо, що вхід буде точно довжиною 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
Це була моя оригінальна відповідь на цю проблему, але ми можемо зробити краще.
Цікаво, що попередня відповідь працює навіть у тому випадку, якщо ми починаємо з + замість,
+[[->-<],>+<]>++++.
Brainfuck вимагав чогось у комірці, щоб почати цикл. Ми наївно додали, що додаткові 4 врешті-решт, коли це могло піти в інших місцях.
-[[->-<],>+<]>++.
За допомогою цілковитої навмисної хитрості циклу (читання: проб і помилок), запуск програми з а - призводить до двох цікавих результатів:
1 + 10 + 2 = 13, і ми закінчуємо оригінальною відповіддю.
Озираючись на це, це, мабуть, надмірна оплата на таку просту програму Brainfuck.
Трохи подумавши над цим рішенням, я зміг відрізати 2 байти.
Я хотів щось уточнити щодо попереднього кроку:
Мінус для входу в цикл ефективно додає 1, але те, що він насправді робить, - відняття 255 з другої комірки (в результаті виходить 1).
Це очевидно в ретроспективі, але віднімання 1 з першої комірки - це те саме, що додавання 1 до другої комірки (адже все, що знаходиться в першій комірці, віднімається з другої комірки.)
-[-[->-<],]>++.
Мені вдалося видалити "> + <", додавши "-" на початку першого циклу. Він повинен туди йти, а не там, де був "> + <", тому що програма буде циклічно нескінченна інакше.
477-Tr@ToCharacterCode@#&
Чиста функція, що приймає рядок як вхідний і повертає ціле число. Mathematica має довгі імена команд і неохоче перетворюється між рядками та цілими числами, що робить це особливо погано при цьому виклику. Найкращим, що я міг знайти, був алгоритм з відповіді Ruby Level River St , який робить обчислення на основі загальної кількості ASCII кодів вхідного рядка; в Mathematica для цього використовується лише одне довге ім'я команди.
<?=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
Я знайшов коротше рішення 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
що відсутня цифра.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
A,sq-
A, e# The range from 0 to 9: [0 1 2 3 4 5 6 7 8 9]
s e# Cast to a string: "0123456789"
q e# The input
- e# Remove all characters from the range that are in the input
e# Implicit output
Включає +1 для -r
s/$/0123456789/
:
s/(.)(.*)\1/\2/
t
s/$/0123456789/ # Append 0123456789
: # Start loop
s/(.)(.*)\1/\2/ # remove a duplicate character
t # loop if something changed
ẹ:Ị↔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
. ¬
в Брахілогу еквівалентно \+
Прологу, і його значення полягає в тому, що "не піддається допущенню в умовах закритого світу", а не "дай мені пункти вибору для всього, що цього не підтверджує" (що майже завжди є нескінченною кількістю речей )
(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 повертає цифру, яка відсутня на введенні.
5v&;52/ni?@.>!&oW+
Розширено
5 v
& ;
5 2 / n i ? @ .
> ! & o W + . .
. .
. .
Використовується такий самий метод, як і ця відповідь, що відповідає мозку .
Створіть на стеку значення -525, натиснувши 5, 2, об'єднати, натиснути 5, об'єднати і заперечити.
Потім повторно отримуйте введення та додайте, поки не буде досягнуто кінця введення.
Видаліть останній ввід, відмініть (зробіть позитивним) останній результат додавання, виведіть символ і зупиніть.
Причина роботи від -525 вгору полягає в тому, що виведення символів потрапляє на кожну ітерацію вводу. Оскільки значення є негативним, нічого не виводиться, поки цикл не вийде і негативне значення не стане позитивним.
<?=45-array_sum(str_split($argv[1]));
Вхід вводиться в комірку
A1
.
Код:
=REGEXEXTRACT(4&2^29,"[^"&A1&"]")
Збережено 6 байт завдяки Стіву Кассу.
Попередній код:
=REGEXEXTRACT("0123456789","[^"&A1&"]")
Результат:
=REGEXEXTRACT(0&49^9,"[^"&A1&"]")
також є правильним рішенням, враховуючи подібну логіку. Оновлена відповідь.
Я врятував 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). Хоча ~
працює правильно.
#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
param($n)0..9|?{$n-notmatch$_}
Бере введення $n
, конструює діапазон 0..9
(тобто 0, 1, 2 ... 9
), потім використовує Where-Object
пункт (the |?{...}
), щоб витягнути число, яке робить регулярний вираз -notmatch
. Що залишилося на конвеєрі, вихід неявний.
-jkUT
-jkUT
T # 10
U # The unary range of ten: [0,1,..,9]
jk # join that on the empty string
- # set minus
"-jUT" також начебто працює, але створює нові рядки для кожного int.