Однакова довжина, різний рядок


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 Але це буде включати рядки / s негативної довжини
ETHproductions

1
... Таких не існує.
CalculatorFeline

@CalculatorFeline Краще зараз?
ETHproductions

3
Ще один простий, але не банальний виклик.
Вейджун Чжоу

Відповіді:


34

Python 2 , 21 байт

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

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

Приймає подання рядка вхідного рядка і скорочує його до довжини вхідного рядка. Для типового рядка це ставить його в 'лапки і відбиває в кінці:

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

Зауважте, що новий рядок починається з '. Покажемо, що вихід завжди відрізняється від вхідного.

  • Якщо вхід не має ', то вихід починається з, 'а введення - ні.

  • Якщо вхід містить 'а, але ні ", то Python використовуватиме "для зовнішніх лапок, даючи перший символ, "який не знаходиться у рядку введення.

  • Якщо вхід має 'і те ", і зовнішні лапки є, 'і кожна 'ухиляється як \'. Де б не "з'явилося перше на вході, воно зміщується вправо на початковий 'на виході і на будь-який можливий вхід . Це означає, що він не може збігатися з "відповідним положенням у висновку.

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

Зауважте, що "у другому випадку важливо було адаптивно перейти на Python . Якщо цього не зробило, воно не вдалось би ввести три символи '\'. Або будь-який довший префікс рядка fix show, використовуючи '. Отже, цей метод не працюватиме для більшості мов.


Яке міркування щодо індексації, 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, тому повторне значення char повинно бути або 0, або 1. Але будь-який рядок з 0s видає 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 Haskell допускає 'як персонаж в ідентифікаторах, так q'~'=' 'би це було q' ~ '=' 'розроблено як (повідомлення про лексичну помилку, оскільки остання 'не відповідає)
Ørjan Johansen

5

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

Видиме зображення

NSSNSSSTSSSSSNSNSSNSSNSTNTSTTTTSSTNTTSNSNSTSSSNSSSNTNSSNSNN

Що це робить:

Для кожного прочитаного символу він друкує пробіл, за винятком випадків, коли це пробіл, тоді він друкує а @.

Розбирання:

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

Завжди приємно бачити рішення у Whitespace. Особливо, коли ти зазвичай не можеш цього реально побачити . +1
Josiah Winslow

Гарна відповідь! Я намагався придумати щось коротше до структури, але нічого не зміг знайти. Але ви можете пограти в 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

Хаскелл , 19 байт

Анонімна функція, яка приймає та повертає a String. Використовувати як (map$(!!1).show.succ) "1111".

map$(!!1).show.succ

Спробуйте в Інтернеті! (Використання тестового ременя @ xnor.)

  • Кожен символ у рядку введення збільшує характер, потім перетворює його у формат буквального символу, а потім приймає другий символ літералу, який є символом відразу після початкової 'лапки.
  • Для майже всіх символів для друку це призводить до простого збільшення символів. Винятки є &і ~, які натомість дають \, тому що їхні наступники 'і \DELвтечуть в буквальних літерах.

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

Ні, headє (!!0), ні (!!1). Це не вдалося б характеру '.
Ørjan Johansen

Ага, правильно. Я щойно читав відповідь пітона і забув, що цитати зазвичай потребують спеціального лікування.
Джуліан Вольф

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 = ' ' + '~'
четчик

Я думаю, ти маєш на увазі 158 = '' + '~'. 159-32 = 127, що було б символом поза рамками. Але гарна ідея.
Computronium

@celtschk Інволюції не можуть працювати, оскільки є непарна кількість (95) друкованих символів, тому принаймні одна з них буде відображати себе.
Денніс

@Computronium: На жаль, ви праві, я зрозумів код символу ~неправильно.
Celtschk

4

C (gcc) , 20 байт

Відповів Денніс, подумавши про 2-байтне суттєве покращення.

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

Спробуйте в Інтернеті! (Футер від Денніса.)

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


4

Python 2 , 25 байт

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

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

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


Я б запропонував змінити '?'двозначний шаркод, але Python не є однією з тих мов, де ви можете це зробити :(
CalculatorFeline

Варіанти збереження байта (але lambda s:`+(s<'1')`+s[1:]lambda s:`s<'T'`[0]+s[1:]
відмова від



3

CJam , 5 байт

l)iA%

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

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




3

Cubix , 10 байт

..@|i?2%)O

Спробуйте в Інтернеті! або Дивіться, як вона працює!

На кожному знаку друкується, 1якщо в char є рівна кодова точка, в 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 Мартіна Ендера. Перший символ приймається за кодову точку, зменшується mod 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

Мозок-Флак , 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

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

Гольфскрипт, 3 байти

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

)5%

Візьміть модуль 5 ASCII останнього символу та замініть останній символ результатом. Це, очевидно, працює для нецифрових символів, але якщо останній символ є цифрою, він також змінюється ("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.