Я думаю, что здесь нет достаточно простых вопросов, которые могут попробовать новички!
Задача: задана случайная входная строка из 1 и 0, например:
10101110101010010100010001010110101001010
Напишите кратчайший код, который выводит побитовую инверсию, вот так:
01010001010101101011101110101001010110101
=&'0'
работает на такое же количество байтов.GolfScript , 5 байт
Попробуйте онлайн.
Как это устроено
GolfScript читает весь ввод из STDIN и помещает его в стек в виде строки.
{}%
проходит через все символы в строке и выполняет блок кода для всех них.1^
вычисляет исключающее ИЛИ символов ASCII-кода с 1. «0» соответствует ASCII-коду 48, «1» - ASCII-коду 49.Так как
48 ^ 1 = 49
и49 ^ 1 = 48
это превращает 0 в 1 и 1 в 0.После завершения GolfScript печатает измененную строку.
источник
CJam - 4
В этом xor каждый символ с 1.
В отличие от другого ответа CJam, я не предполагаю, что ввод уже находится в стеке.
Попробуйте это на http://cjam.aditsu.net/
источник
f
.машинный код x86 на DOS -
141311 байтНу, это снова стало короче! После написания решения для несвязанного вызова я заметил, что тот же трюк можно применить даже здесь. Итак, поехали:
Комментируемая сборка:
Предыдущее решение - 13 байт
Я думаю, что это не становится намного короче, чем это.На самом деле, это сделал! Спасибо @ninjalj за то, что сбрил еще один байт.В этой версии реализована расширенная интерактивность ™ - после запуска из командной строки она выплевывает «перевернутые» символы до тех пор, пока вы пишете входные цифры (которые не отображаются); чтобы выйти, просто нажмите Ctrl-C.
В отличие от предыдущего решения, в DosBox возникают некоторые проблемы - поскольку DosBox не поддерживает правильно Ctrl-C , вы вынуждены закрыть окно DosBox, если хотите выйти. Вместо этого в виртуальной машине с DOS 6.0 она работает так, как задумано.
NASM источник:
Старое решение -
272522 байтаЭто приняло его ввод из командной строки; работает как файл .COM в DosBox.
Вход NASM:
источник
xchg dx,ax
на 1 байт меньше, чемmov dl,al
Bash + coreutils, 8 байт
Принимает участие от STDIN.
Или же
sed, 8 байт
источник
y 01 10
tr
...CJam , 4 байта
Предполагается, что исходная строка уже находится в стеке. Печатает измененную строку.
Попробуйте онлайн , вставив следующий код :
Как это устроено
:~
оценивает каждый символ строки, т. е. заменяет символ 0 на целое число 0.:!
вычисляет логическое НЕ каждого целого числа. Это превращает 0 в 1 и 1 в 0.источник
Brainfuck (
7071)Объяснение:
источник
a
на11
.PHP - 19 байт
Да, не совсем оригинально, наверное!
источник
Стек блин , 532 байта
Предполагается, что ввод завершается нулевым символом. Стратегия заключается в следующем:
1
.0
(получая,1
если у нас было0
, или0
если у нас было1
)0
к немуисточник
С: 29
Попробуйте это онлайн здесь .
Спасибо, что указал на трюк с XOR, Деннис.
источник
i(char*s){while(*s)*s++^=1;}
while
сfor
еще результатами длиной 28 символов.Python 2.7 - 34 *
Ох, сколько это первый отстой. Довольно некрасиво это 63 символа
Этот немного лучше, но все же не такой модный. 44 символа
Так как
int(x) and 1
возвращается,int(x)
если это не 0 и в противном случае False. Решение может быть дополнительно уменьшено до 36 символов.Поскольку
join()
берет генератор, скобки могут быть удалены. 32 символаИ галочки могут быть использованы вместо
str()
Уменьшено до 44 с 34 благодаря указателям из @TheRare
Найти комплимент в Python сложно, так как
bin(-int)
возвращает -0bxxx, следовательно, и выше.источник
(int(x) and 1) == int(x)
'' == False
и'hi' == True
''.join(`1-int(x)`for x in'')
repr(x)
str(x)
Perl, 9 символов
9-й символ - это флаг 'p'
Использование:
источник
y/10/01/
но на один символ короче, потому что ему не нужны флагиJavascript ( ES6 ) 36
источник
s
,s.replace(/./g,x=>x^1)
22 символа.p=prompt(p().replace(/./g,x=>x^1))
(p=prompt)(p().replace(/./g,x=>x^1))
и это такая же длина.Лабиринт , 6 байт
(Лабиринт новее, чем этот вызов, поэтому этот ответ не конкурирует - не то, что он все равно выигрывает ...)
Этот код предполагает, что STDIN содержит только цифры (в частности, нет завершающего перевода строки).
Указатель инструкций (IP) начинается в верхнем левом углу и идет вправо. В то время как есть цифры для чтения, он будет циклически проходить по левому блоку 2x2:
1
нажмите 1,,
прочитайте цифру,$
XOR с 1, чтобы переключить последний бит,.
напечатайте результат. IP принимает этот цикл, потому что вершина стека положительна после XOR, так что он будет поворачивать направо. Когда мы нажимаем EOF, вместо этого,
возвращается-1
. Тогда XOR даст,-2
и с этим отрицательным значением IP повернет налево на@
и программа завершится.Это решение должно быть оптимальным для Лабиринта: вам нужно
,
и.
для цикла ввода-вывода, и@
для завершения программы. Вам нужно как минимум два символа (здесь1
и$
) для переключения последнего бита. И вам нужен хотя бы один символ новой строки для цикла, который можно завершить.Если ... если мы игнорируем STDERR, то есть разрешаем завершение с ошибкой, мы можем сохранить
@
и нам также не нужен способ переключения между двумя путями. Мы просто продолжаем читать и печатать, пока не попытаемся случайно напечатать отрицательное значение (-2
). Это позволяет использовать как минимум два 5-байтовых решения:источник
Рубин: 23
источник
Код машины Тьюринга, 32 байта (1 состояние - 3 цвета)
Использование синтаксиса таблицы правил, требуемого этим онлайн-симулятором TM. Заимствовано из сообщения, которое я сделал в своем блоге пользователя Googology Wiki несколько месяцев назад.
Вы также можете проверить это, используя эту реализацию Java.
источник
Python 2.x - 44 байта
Зачем делать это сложным или использовать некоторые обманчивые переменные?
источник
print''.join('1-int(x)'for x in'input()')
. Я не мог получить обратные пометки в коде комментария, поэтому заменил их на '.`a\`b`
->a`b
.R, 27 символов
Использование:
источник
APL (Dyalog Unicode) , 7 байтов SBCS
Полная программа. Подскажет stdin.
Попробуйте онлайн!
⍞
подскажите stdin⍎¨
выполнить каждый персонаж~
логическое НЕ⍕¨
отформатировать каждый символ как текст∊
ε NLIST (сплющить)источник
PHP> 5,4 - 37 символов
$s
это входTry it online
источник
<kbd>
тегом.TI-BASIC, 7 байтов
Это функция, которая принимает двоичную строку (сквозную
Ans
) в качестве входных данных и возвращает выходные данные в виде инвертированной (не обращенной) строки, как указано. Для получения дополнительной помощи вы можете прочитать список приложенийnot(
на вики-сайте TI-BASIC. Я использую скомпилированную версию, потому что она меньше:В шестнадцатеричном виде:
объяснение
»*r
- Возьмите ввод функции как строку и конвертируйте в список>
- передать данный список следующим операторамÕ¸r
- вернуть обратный списокисточник
»*r>Õ¸r
?expr(Ans:Returnnot(Ans
; 2. Поскольку строка не разделена запятыми и не начинается с{
, она будет вычисляться как целое число, например 1000010011, а не как список; 3.Return
не работает так, как вы это написали; 4. Это дает вывод в виде списка, а не строки.Haskell, 22 байта
Я был удивлен отсутствием решений Haskell для этой задачи, так что вот один. Он оценивает функцию, которая принимает строку и возвращает ее инверсию.
объяснение
Здесь нет ничего особенного.
источник
Befunge 93, 25 байт
Предполагая, что пустой стек и EOF оба читают -1.
0
толкает \ 0 как нулевой терминатор>~1+:#v_
это цикл ввода, он читает ascii, добавляет 1, проверяет EOF + 1 = 0,^ -1<
else вычитает 1 и оставляет заданное значение ascii в стеке.$>:#,_@
сбрасывает лишнюю копию нуля сверху стека, затем печатает двоичную строку сверху внизЕсли пустой стек читает 0, сохраните 2 байта с
Возможна версия около 15 байтов с использованием этого же алгоритма, если EOF = 0, но у меня нет такой реализации, с которой можно было бы тестировать.
источник
Javascript ES6, 26 символов
источник
Befunge-98 (PyFunge) , 7 байт
Для каждого символа
c
во входных данных он печатает символ со значением ascii94 - c
, где 94 - это значение «0» + «1» или «a».Попробуйте онлайн!
источник
Python3, 39
Methinks Python - не лучший язык для этого. :)
Если вас интересует наличие новой строки после вывода, вот альтернатива из 43 символов:
источник
end=''
единой,
воли :) - если вы не заботитесь об отсутствии пробеловprint
требует настройкиend
параметра для подавления новой строки в конце каждой печати. Кроме того, в соответствии со спецификацией OP, я думаю, что меня волнует отсутствие пробелов. :) Спасибо за комментарий, хотя!J - 11 символов
Логические значения в J представлены в виде целых чисел
0
и1
, конечно, также являются допустимыми индексами в массивах (в данном случае это 2-символьный массив'01'
)источник
C #, 131 байт
Немного опоздал на вечеринку, но вот мой. :)
источник
MATLAB, 13 байт
После выполнения описанного выше просто вызовите функцию со своей входной строкой, чтобы получить инвертированную строку. Например работает:
печатает:
источник
BotEngine , 4x8 = 32
Неконкурентоспособен, так как язык ставит вопрос на задний план.
С подсветкой:
источник