Одинаковая длина, другая строка


53

Вызов

Учитывая непустая строка S длины L , состоящей исключительно из печатаемых ASCII символов, вывода другой строки длины L , которая целиком состоит из печатаемых ASCII символов, но не равна S .

Для целей этой задачи пригодный для печати символ ASCII имеет значение от U + 0020 до U + 007E включительно; от (пробел) до ~(тильда). Новые строки и вкладки не включены.

Например, учитывая "abcde", некоторые допустимые результаты могут быть:

  • "11111"
  • "abcdf"
  • "edcba"

Но они будут недействительными:

  • "abcde"
  • "bcde"
  • "abcde0"

Контрольные примеры

"asdf"
"1111"
"       "
"~~~~~"
"abcba"
"1"
" "
"~"
" ~"
"~ "
"  0"
"!@#$%^&*()ABCDEFGhijklmnop1234567890"
" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"

правила

  • Вы можете предположить, что входные данные полностью состоят из печатных символов ASCII.
  • Вы не можете предполагать, что ввод не содержит все 95 печатных символов.
  • Можно предположить, что ввод содержит хотя бы один символ и имеет длину менее 256 символов.
  • Выходные данные также должны состоять исключительно из печатных символов ASCII. Вы не могли бы, например, вывести байт \ x7F для ввода "~".
  • Выходные данные должны отличаться от входных данных с вероятностью 1; то есть вы можете генерировать случайные строки до тех пор, пока одна из них не будет отличаться от входной, но вы не можете просто вывести L случайных символов и надеяться, что она отличается.
  • Новые строки запрещены в выходных данных, но вы можете вывести одну завершающую новую строку, которая не учитывается в строке.

счет

Это , поэтому выигрывает самый короткий код в байтах на каждом языке.


Обратите внимание, что «положительный» исключает пустую строку. Для большей ясности, может быть, заменить «положительный» на «ненулевой»?
CalculatorFeline

5
@CalculatorFeline Но это будет включать строки / строки отрицательной длины
ETHproductions

1
... Таких не существует.
CalculatorFeline

@CalculatorFeline Лучше сейчас?
ETHproductions

3
Еще один простой, но не тривиальный вызов.
Вейцзюнь Чжоу

Ответы:


34

Python 2 , 21 байт

lambda s:`s`[:len(s)]

Попробуйте онлайн!

Принимает строковое представление входной строки и усекает его до длины входной строки. Для типичной строки это помещает ее в 'кавычки и прерывает конец:

abc  ->   'abc'  ->  'ab
     rep        chop

Обратите внимание, что новая строка начинается с '. Покажем, что вывод всегда отличается от ввода.

  • Если у входа нет ', тогда выход начинается с, 'а у входа - нет.

  • Если вход содержит 'и, но нет ", тогда Python будет использовать "для внешних кавычек, давая первый символ ", которого нет во входной строке.

  • Если на входе есть оба 'и ", то внешние кавычки есть 'и каждый 'экранируется как \'. Везде, где первое "появляется на входе, оно сдвигается вправо на исходное 'на выходе и на любое возможное экранирование. Это означает, что он не может совпадать с a "в соответствующей позиции на выходе.

Наконец, обратите внимание, что цитирование ввода и, возможно, экранирование символов всегда увеличивает количество символов, поэтому усечение вывода делает его такой же длины, как и ввод.

Обратите внимание, что крайне важно, чтобы Python адаптивно переключался "на второй вариант. Если этого не сделать, произойдет сбой при вводе трех символов '\'. Или любой более длинный префикс строки показа исправления, используя '. Таким образом, этот метод не будет работать для большинства языков.


Какова причина для индексации, len(s)а не -2?
Джулиан Вольф

1
@JulianWolf Для ввода, содержащего и, 'и "более 2 символов, будут добавлены, потому что кавычки должны быть экранированы.
Андерс Касеорг

Имеет смысл; не учел это. Спасибо!
Джулиан Вольф

Вы можете использовать [2:]вместо того, [:len(s)]чтобы получить до 16 символов.
xbarbie

@xbarbie Это не всегда дает одинаковую длину, если есть символы, нуждающиеся в экранировании.
xnor


15

JavaScript (ES6), 37 33 36 29 26 18 21 19 байт

s=>s.slice(1)+ +!+s

Попробуйте онлайн!

-4 байта благодаря ETHProductions

-7 + -5 + -2 байта благодаря CalculatorFeline

-3 байта благодаря Рику Хичкоку

Перемещает первый символ в конец и устанавливает его в 0, если он числовой и ненулевой, и 1 в противном случае.

объяснение

s=>                    anonymous function with parameter s
                 +s    convert s to a number
                !      not (converts to boolean; relevant: 0->true,1->false)
               +       convert !+s back to number (true->1, false->0)
   s.slice(1)+         prefix the rest of the string
              ␣        needed to avoid the +s combining

доказательство

Поскольку второй символ становится первым, третий символ становится вторым и т. Д. Все символы должны быть идентичны. Последний оставшийся символ может быть только 0 или 1, поэтому повторяющийся символ должен быть либо 0, либо 1. Но любая строка 0 возвращает 1 в конце, и наоборот; поэтому невозможно создать вход, равный его выходу. -ETHProductions

Смотрите правки для предыдущих версий и объяснений.

f=
s=>s.slice(1)+ +!+s

console.log(f("000"))
console.log(f("111"))
console.log(f("001"))
console.log(f("110"))
console.log(f("~"))
console.log(f("111111111111111111111111111111111111111111111111111"))
console.log(f("Hello world!"))
console.log(f("23"))
console.log(f(" "))
console.log(f("1x"))


13

Желе , 3 байта

~Ṿṁ

Выходные данные представляют собой строку цифр, запятых и знаков минус-минус, первый символ которых будет отличаться от первого символа входной строки.

Попробуйте онлайн!

Как это устроено

~Ṿṁ  Main link. Argument: s (string)

~    Map bitwise NOT over the characters c in s.
     This attempts to cast c to int and then apply bitwise NOT, mapping
     '0', ..., '9' to 0, ..., 9 (before ~), then -1, ..., -10 (after ~).
     For non-digits, the attempt fails, mapping c to 0.
 Ṿ   Uneval, yielding a comma-separated string of integers in [-10, ..., 0].
     The first character will be '-' if s starts with a digit and '0' if not.
  ṁ  Mold; truncate the result to the length of s.

6

Haskell , 20 байтов

map$head.show.(<'M')

Попробуйте онлайн!

Преобразует в строку Fи T. Важно то, что персонажи Fи Tобращаются друг к другу. Это делается путем проверки, меньше ли символ, чем Mполучить Trueили False, затем беря первый символ строкового представления.


Haskell , 23 байта

q '~'=' '
q _='~'
map q

Попробуйте онлайн

Заменяет каждый символ ~, кроме ~становится пробелом.


В чем значение пространства q '~'? Почему его нельзя удалить?
Cyoce

@Cyoce Haskell разрешает 'в качестве идентификатора в идентификаторах, поэтому q'~'=' 'будет проанализирован как q' ~ '=' '(сообщая о лексической ошибке, потому что последняя 'не соответствует.)
Орджан Йохансен

5

Пробел, 59 байт

Видимое представление

NSSNSSSTSSSSSNSNSSNSSNSTNTSTTTTSSTNTTSNSNSTSSSNSSSNTNSSNSNN

Что оно делает:

Для каждого символа, который он читает, он печатает пробел, за исключением случаев, когда это пробел, а затем печатается символ @.

Разборка:

loop:
    push 32
     dup
      dup
       dup
        ichr
       get
       sub
      jn not_32
     dup
      add
not_32:
     pchr
    jmp loop

Всегда приятно видеть решение в Whitespace. Особенно, когда вы обычно не можете это увидеть . +1
Джозия Уинслоу

Хороший ответ! Я пытался придумать что-то более короткое для конструкции, но ничего не смог найти. Но вы можете играть в гольф 2 байта путем изменения SSSTSSSSSN (push 32)в SSSTSSTN (push 9)и TSSS (add)к TSSN (multiply). Он напечатает вкладку для каждого символа со значением Unicode выше 9, и Q(9 * 9 = 81) для каждого символа со значением Unicode, равным 0..9. Попробуй онлайн 57 байт , или Попробуй онлайн с добавлением выделения и пояснений
Кевин Круйссен,

Не обращайте внимания на мой комментарий выше. Для испытания вкладка не считается печатным символом ASCII ..
Кевин Круйссен,

5

MATL , 6 5 байт

Qo!V!

Попробуйте онлайн!

объяснение

Q     % Implicitly input a string. Add 1 to each code point.
o     % Parity: 0 if odd, 1 if even. Note that '0' has ASCII code 48, so after
      % having added 1 it now gives 1. Similarly. '1' has ASCII code 49, so it
      % now gives 0. All other chars give 0 or 1. 
!V!   % Convert each number to the corresponding char. Implicitly display

Это 5 в CJam: l'0f=(если он делает то, что я думаю, он делает)
Мартин Эндер

@MartinEnder Да, это именно так :-) Я только что добавил объяснение
Луис Мендо

5

Haskell , 19 байтов

Анонимная функция, которая принимает и возвращает String. Использовать как (map$(!!1).show.succ) "1111".

map$(!!1).show.succ

Попробуйте онлайн! (Используя тестовое устройство @ xnor.)

  • Для каждого символа во входной строке увеличивается символ, затем преобразуется в буквенный формат символа, затем берется второй символ литерала, который является символом сразу после начальной 'кавычки.
  • Почти для всех печатных символов это приводит к просто увеличенному символу. Исключения составляют &и ~, которые вместо этого дают \, потому что их наследники 'и \DELэкранируются в символьных литералах.

почти наверняка headможно использовать вместо (!!1)дополнительного байта
Джулиан Вольф

Нет, headэто (!!0)не (!!1). Это не подействует на персонажа '.
Орьян Йохансен,

Ах, верно. Я только что прочитал ответ на языке Python и забыл, что цитаты обычно требуют особого отношения.
Джулиан Вольф

4

05AB1E , 5 байтов

žQDÀ‡

Попробуйте онлайн!

объяснение

Заменяет каждый символ следующим печатным символом ascii, переносясь из тильды в космос.

žQ     # push a string of printable acsii chars (space to tilde)
  D    # duplicate
   À   # rotate left
    ‡  # translate

4

V , 7 байт

íÁ/a
g?

Попробуйте онлайн! или проверьте все контрольные примеры!

Как это работает?

Рассмотрим все строки, состоящие из печатного ASCII. Каждая строка должна либо: 1) содержать буквенные символы, либо 2) не содержать буквенных символов.

Таким образом, эта программа работает, сначала преобразовав один не алфавитный символ 'a', а затем выполнив ROT13 для входной строки.

í       " Substitute:
 Á      "   A non-alphabetic character ([^a-zA-Z])
  /     "   with
   a    "   the letter 'a'
g?      " Perform ROT13 on...
        "   (Implicit) the current line.

Это ломается, если у вас есть число, подобное 9одному, при увеличении которого в строку добавляется еще один символ
nmjcman101

@ nmjcman101 Ах, это хороший момент. Я вернулся
DJMcMayhem

Мне нравится ROT13, хотя я не знал, что V (im) может это сделать
nmjcman101

4

C (gcc) , 22 байта

f(char*s){*s=65+*s%2;}

Принимает указатель строки и модифицирует первый символ на месте.

Попробуйте онлайн!


1
Короче: *s=159-*s. Всегда изменяет последний бит, поэтому никогда не дает одинаковый символ. Обратите внимание, что159 = ' ' + '~'
celtschk

Я думаю, что вы имеете в виду 158 = '' + '~'. 159-32 = 127, что будет символом вне области видимости. Но хорошая идея.
КОМПЬЮТРОНИУМ

@celtschk Инволюции не могут работать, поскольку существует нечетное количество (95) печатных символов, поэтому, по крайней мере, один из них будет отображаться сам.
Деннис

@Computronium: Ой, ты прав, я ~неправильно понял код символа .
celtschk

4

C (gcc) , 20 байтов

Увидел ответ Денниса, подумал о существенном улучшении в 2 байта.

f(char*s){*s^=*s/3;}

Попробуйте онлайн! (Нижний колонтитул от Денниса.)

Как и оригинал, модифицирует первый символ строки на месте, но делает xors его с его значением, деленным на 3 (наименьшее число, которое работает. 2 терпит неудачу на одном символе, 'U'который дает 127, не для печати.)


4

Python 2 , 25 байт

lambda s:`s<'T'`[0]+s[1:]

Попробуйте онлайн!

Андерс Касеорг сохранил байт, извлекая первый символ из Trueили False.


Я бы предложил изменить '?'код из двух цифр, но Python не из тех языков, где вы можете это сделать :(
CalculatorFeline

Варианты сохранения байта (но без совместимости с Python 3): lambda s:`+(s<'1')`+s[1:]илиlambda s:`s<'T'`[0]+s[1:]
Anders Kaseorg


3

Октава , 19 18 байт

@(s)['',(s<66)+65]

Попробуйте онлайн!

Объяснение:

@(s)                 % Anonymous function taking a string s as input
         s<66        % A boolean vector with `1` for all characters below ASCII-66.
        (s<66)+65    % Add 65 to this, so that all elements that are 32-65 are now 66.
                     % All other elements are 65 
    ['',         ]   % Implicitly convert the list of 65 and 66 to the letters A and B

3

CJam , 5 байтов

l)iA%

Попробуйте онлайн!

Преобразует последний символ в его кодовую точку и принимает его по модулю 10. Это явно отличается от нецифровых символов в последней позиции. Но цифры начинаются с кодовой точки 48, поэтому использование этого мода 10 будет сдвигать их влево циклически, и, следовательно, последний символ всегда изменяется.




3

Cubix , 10 байт

..@|i?2%)O

Попробуйте онлайн! или смотреть, как он бежит!

Для каждого символа печатается, 1если символ имеет четную кодовую точку, в 2противном случае; 1имеет нечетную кодовую точку и 2четную, поэтому выход никогда не будет равен входу.

объяснение

Этот код соответствует следующей сети кубов:

    . .
    @ |
i ? 2 % ) O . .
. . . . . . . .
    . .
    . .

IP (указатель инструкций) начинается в верхнем левом углу крайнего левого лица и направляется на восток. Это следует из этой серии инструкций:

i     Grab a char-code from STDIN and push it to the stack (-1 if there is no more input).
?     If the top item is negative, turn left and hit @ which ends the program.
      If it's positive (any printable ASCII char), turn right. The IP runs through a bunch
        of no-ops, then hits:
)     Increment the top item.
|     Mirror the IP's direction horizontally (turns it around).
)     Increment the top item again. The IP then wraps around again until it hits:
?     The top item is positive, so turn right.
2     Push a 2 to the stack.
%     Push the modulus of the top two items (0 for even char-code, 1 for odd).
)     Increment the result (now 1 for even char-code, 2 for odd).
O     Output as a number. The IP wraps back around to the i and the process starts again.

3

Алиса , 9 байт

#oi/
t i@

Попробуйте онлайн!

объяснение

Идея была взята из представления Мартина Эндера в CJam. Первый символ берется в качестве кодовой точки, сокращается мод 10 и перемещается в конец вывода. Поскольку был изменен ровно один символ, перестановка символов не может привести к получению той же строки обратно.

#   skip next command
o   (skipped)
i   push first byte onto stack
    STACK: [97]
/   reflect to SE, switch to ordinal mode (implicit reflect to SW)
i   push remaining input onto stack as string (implicit reflect to NW)
    STACK: [97, "sdf"]
o   output top of stack (implicit reflect to SW)
    STACK: [97]
t   implicitly convert code point to decimal string, and extract last character
    (implicit reflect to NE)
    STACK: ["9", "7"]
o   output this last digit (implicit reflect to SE)
i   push empty string, since there is no more input to take (implicit reflect to NE)
/   reflect to S, switch to cardinal mode
@   terminate

Использование tдля мода 10 действительно умно, приятно. :)
Мартин Эндер

3

Напористый , 1 байт

Q

Попробуйте онлайн!

Это преобразует данную строку в список кодов символов ASCII, индексирует их (модульное индексирование) в верхний алфавит, а затем печатает результат. По сути, каждый персонаж nотображается на chr(ord(n) % 26 + 65). Вы можете использовать эту программу, чтобы увидеть, как работает отображение.

Выход:

  • Всегда будет иметь ту же длину, что и входные данные, так как символы непосредственно отображаются в новые.
  • Всегда будет содержать только печатаемые символы ASCII (так как он содержит только заглавные буквы)
  • Всегда будет отличаться от ввода, так как нет никакого возможного входного символа, nтакого chr(ord(n) % 26 + 65) == n, что для того, чтобы это было правдой, должно быть целое число, xтакое 26x = 65, для которого нет решения.

1 байт

q

Попробуйте онлайн!

Этот ответ точно такой же, за исключением того, что он отображается строчными буквами алфавита, а не прописными буквами алфавита. Это все еще допустимо, поскольку нет никакого возможного входного символа, nтакого как chr(ord(n) % 26 + 97) == n.


2

Brain-Flak , 53 байта

Включает +1 для -c

([(((()()()()){}){}){}()]({}())){{}(<({}[()()])>)}{}

Это будет уменьшать первый символ, если это не пробел, в этом случае он будет увеличивать первый символ.

Попробуйте онлайн!

([(((()()()()){}){}){}()]      )                     # Push: input + 1 != 33 on top of...
                         ({}())                      #    input + 1
                                {{}(<          >)}{} # If (input + 1 != 33)
                                     ({}[()()])      #   Push: (input + 1) - 2

2

Желе , 4 байта

^1Ṿ€

Выводит цифровую строку. Никакой выходной символ не будет равен соответствующему входному символу.

Попробуйте онлайн!

Как это устроено

^1Ṿ€  Main link. Argument: s (string)

^1    XOR each character c in with 1.
      This attempts to cast c to int, mapping '0', ..., '9' to 0, ..., 9.
      For non-digits, the attempt fails, mapping c to 0.
      After XORing with 1, we get 1, 0, 3, 2, 5, 4, 7, 6, 9, 8 for '0', ..., '9', 
      and 1 for all non-digits.
  Ṿ€  Uneval each; mapping 0, ..., 9 to '0', ..., '9'. This yields a character
      array, which is Jelly's string type.
      Note that no character is mapped to itself.


2

PHP, 30 27

<?=strtr($a=$argn,$a,$a^1);

Изменяет каждый символ, равный первому, с измененным наименее значимым битом.


"~" Работает?
CalculatorFeline

На самом деле он не переворачивает наименее значимый бит первого символа; он преобразует его в целое число и переворачивает младший бит этого . Так что да, @CalculatorFeline, ~работает , выводит 1.
ETHproductions

Ой. Работает !$aили ~$aработает?
CalculatorFeline

@ETHproductions Последнее редактирование я сделал незадолго до того, как ложился спать, и у меня не было времени его обновить. Конечно, по праву он сначала преобразуется в целое число и, следовательно, может даже не изменить первый символ, но, возможно, второй, например, «12» становится «13».
Кристоф

@CalculatorFeline к сожалению оба сбоя !$aпревращаются "12"в "12"потому что falseпреобразуется в пустую строку, так что ничто не заменяется и ~$aпревращает все в непечатаемые, потому ~"12"что сначала не преобразуется в int, а буквально переворачивает все биты в строке.
Кристоф


2

Брахилог , 9 байт

{¬Ṣ|∧Ịh}ᵐ

Попробуйте онлайн!

объяснение

Это заменяет все символы пробелом, кроме пробелов, которые он заменяет "0".

{      }ᵐ      Map on each char of the Input
 ¬Ṣ              The Input char is not " ", and the Output char is " "
   |             Or
    ∧Ịh          The Output char is "0"

2

PHP <7,1, 31 байт

for(;~$c=$argn[$i++];)echo$c^1;

Попробуйте онлайн!


Пожалуйста, удалите 66-байтовое решение, потому что оно недопустимо.
CalculatorFeline

Сбой для входов «1», «10», «101» и т. Д. Вы не можете зависеть только от длины строки.
CalculatorFeline

@CalculatorFeline «1» выдает «0», «10» выдает «01», «101» выдает «010». Где проблема?
Кристоф

@CalculatorFeline "1" => 0, "10" => 01, "101" => 010 Где это не получается?
Йорг Хюльсерманн

1
PHP 7.1 дает A non-numeric value encountered. И вы можете использовать ~вместо a&.
Тит

2

Golfscript, 3 байта

Попробуйте онлайн!

)5%

Возьмите значение ASCII последнего символа по модулю 5 и замените последний символ результатом. Это, очевидно, работает для нецифровых символов, но если последний символ является цифрой, он также изменяется («0» mod 5 = 3, «1» mod 5 = 4 и т. Д.).

Это также будет работать с 7 или 9 при сохранении той же длины.

Кроме того, ууу! У меня есть решение для Golfscript и лучшее решение здесь!


2

Фанки , 26 22 байта

s=>s::gsub("."a=>1&~a)

Вычисляет, ~aчто для не-цифр вернет NaN. Затем 1&ограничивает его либо 0, либо 1, для цифры 0 это будет 1, и для 1этого будет 0. Так что эта строка всегда уникальна.

Попробуйте онлайн!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.