同じ長さ、異なる文字列


53

チャレンジ

完全に印刷可能なASCII文字で構成される長さLの空でない文字列Sが与えられた場合、完全に印刷可能なASCII文字で構成されるがSと等しくない長さLの別の文字列を出力します。

この課題のために、印刷可能なASCII文字はU + 0020とU + 007Eの間の1つです。つまり、 (スペース)から~(チルダ)までです。改行とタブは含まれません。

たとえば、次の"abcde"ような有効な出力があります。

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

ただし、これらは無効です。

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

テストケース

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

ルール

  • 入力がすべて印刷可能なASCII文字で構成されていると仮定することができます。
  • 入力に95個の印刷可能な文字がすべて含まれるとは限りません。
  • 入力には少なくとも1文字が含まれ、256文字未満であると想定できます。
  • 出力は、印刷可能なASCII文字のみで構成する必要があります。たとえば、inputにバイト\ x7Fを出力できませんでした"~"
  • 出力は、確率1の入力と異なる必要があります。つまり、入力とは異なるものになるまでランダムな文字列を生成できますが、L個のランダムな文字を出力することはできません。
  • 出力では改行は使用できませんが、文字列にはカウントされない末尾の改行を1つ出力できます。

得点

これはであるため、各言語のバイト単位の最短コードが優先されます。


「正」は空の文字列を除外します。さらに明確にするために、「ポジティブ」を「非ゼロ」に置き換えますか?
CalculatorFeline

5
@CalculatorFelineしかし、これには負の長さの文字列/ sが含まれます
-ETHproductions

1
...それらは存在しません。
CalculatorFeline

@CalculatorFelineより良いですか?
ETHproductions

3
もう1つの単純ではあるが些細ではない課題。
ウェイジュン周

回答:


34

Python 2、21バイト

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

オンラインでお試しください!

入力文字列の文字列表現を取得し、入力文字列の長さに切り捨てます。典型的な文字列の場合、これはそれを'引用符で囲み、最後を切り捨てます:

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

新しい文字列はで始まることに注意してください'。出力は常に入力とは異なることを示しましょう。

  • 入力にno 'がある場合、出力はで始まり'、入力はありません。

  • 入力に'andが含まれ、noが含まれる場合、"Pythonは"外部引用符に使用"し、入力文字列にない最初の文字を提供します。

  • 入力の両方を有する場合'"、その後外側の引用符があり'、それぞれが'としてエスケープされます\'"入力の最初の部分が現れると'、出力の最初の部分と可能なエスケープによって右にシフトされます。これは"、出力内の対応する位置のa と一致できないことを意味します。

最後に、入力を引用して文字をエスケープすると、常に文字数が増加するため、出力を切り捨てると入力と同じ長さになります。

"2番目のケースでは、Pythonが適応的に切り替わることが重要であることに注意してください。そうしないと、3文字の入力で失敗します'\'。または、修正の長いプレフィックスは、を使用して文字列表示します'。そのため、この方法はほとんどの言語で機能しません。


ゴマインデックスのための推論」何len(s)ではなく-2
ジュリアンウルフ

1
@JulianWolf 'との両方を含む入力の"場合、引用符をエスケープする必要があるため、3文字以上が追加されます。
アンデルスカセオルグ

理にかなっています。それを考慮していなかった。ありがとう!
ジュリアン・ウルフ

[2:]代わり[:len(s)]に16文字まで使用できます。
xbarbie

@xbarbieエスケープが必要な文字がある場合、常に同じ長さになるとは限りません。
xnor


15

JavaScript(ES6)、37 33 36 29 26 18 21 19バイト

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

オンラインでお試しください!

ETHProductionsのおかげで-4バイト

CalculatorFelineのおかげで-7 + -5 + -2バイト

リック・ヒッチコックのおかげで-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

証明

2番目の文字が最初になり、3番目の文字が2番目になります。すべての文字は同一である必要があります。最後の残りの文字は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お互いに変換します。これは、文字がMget Trueまたはより小さいかどうかを確認しFalse、文字列表現の最初の文字を取得することで実行されます。


Haskell、23バイト

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

オンラインで試す

スペースになる~以外のすべての文字をに置き換えます~


空間の意義は何q '~'ですか?なぜ削除できないのですか?
チョイス

@Cyoce Haskellは'識別子の文字として許可するため、(最後が一致しないため字句エラーを報告する)q'~'=' 'として解析されq' ~ '=' 'ます'
ØrjanJohansen

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を超えるすべての文字のタブと、Unicode値がのすべての文字のQ(9 * 9 = 81)が印刷されます0..957バイトの未加工のオンラインで試す
ケビンクルーイッセン

上記の私のコメントは無視してください。挑戦のためにタブが印刷可能なASCII文字とはみなされません...
ケビンCruijssen

5

MATL6 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

それはCJamの5です:(l'0f=もしそれが私が思うようにすれば)
マーティン・エンダー

@MartinEnderはい、まさにそれです:-)説明を追加しました
ルイスメンドー

5

Haskell、19バイト

を取得して返す匿名関数String。として使用し(map$(!!1).show.succ) "1111"ます。

map$(!!1).show.succ

オンラインでお試しください!(@xnorのテストハーネスを使用。)

  • 入力文字列の各文字について、文字をインクリメントし、それを文字リテラル形式に変換してから、リテラルの2番目の文字(開始'引用符の直後の文字)を取得します。
  • ほとんどすべての印刷可能文字について、これは単純に増加した文字になります。例外はある&~代わりに与えており、\その後継ので、'とは、\DEL文字リテラルにエスケープされます。

余分なバイトのhead代わりにかなり確実に使用できること(!!1)
Julian Wolf

いいえ、そうでheadはありませ(!!0)(!!1)。キャラクターに失敗するでしょう'
Ørjanヨハンセン

ああ、そう。私はちょうどPythonの答えを読んでいて、引用には通常特別な扱いが必要であることを忘れていました。
ジュリアン・ウルフ


4

V、7バイト

íÁ/a
g?

オンラインでお試しください!またはすべてのテストケースを検証してください!

どのように機能しますか?

印刷可能なASCIIで構成されるすべての文字列を検討してください。すべての文字列は、1)アルファベット文字を含むか、2)アルファベット文字を含まない必要があります。

したがって、このプログラムが機能する方法は、最初に1つの非アルファベット文字を'a'に変換し、次に入力文字列に対してROT13を実行することです。

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

これは、91つだけのような数字がある場合に壊れます。数字を増やすと、文字列に別の文字が追加されます
-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 Involutionsは機能しません。印刷可能な文字数が奇数(95)であるため、少なくとも1つはそれ自体にマッピングされます。
デニス

@Computronium:おっと、あなたは正しい、~間違った文字コードを受け取った。
celtschk


4

Python 2、25バイト

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

オンラインでお試しください!

Anders Kaseorgは、Trueまたはから最初の文字を抽出してバイトを節約しましたFalse


'?'2桁の文字コードに変更することをお勧めしますが、Pythonはそれができる言語の1つではありません。(
CalculatorFeline

バイトを保存するバリアント(ただし、Python 3の互換性は削除されます):lambda s:`+(s<'1')`+s[1:]またはlambda s:`s<'T'`[0]+s[1:]
Anders Kaseorg



3

CJam、5バイト

l)iA%

オンラインでお試しください!

最後の文字をコードポイントに変換し、10を法とする値を取ります。これは、最後の位置の数字以外の文字では明らかに異なります。ただし、数字はコードポイント48から始まるため、これらのmod 10を使用すると、それらが循環的に左にシフトされるため、最後の文字が常に変更されます。




3

Cubix、10バイト

..@|i?2%)O

オンラインでお試しください!またはそれを実行してください!

各charについて、charに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@

オンラインでお試しください!

説明

このアイデアは、Martin EnderのCJam提出物から取られました。最初の文字はコードポイントと見なされ、mod 10に縮小されて、出力の最後に移動します。正確に1文字が変更されたため、文字を並べ替えても同じ文字列が返されることはありません。

#   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

tmod 10 を使用するのは本当に賢い、素晴らしいことです。:)
マーティンエンダー

3

Pushy、1バイト

Q

オンラインでお試しください!

これは、指定された文字列をASCII文字コードのリストに変換し、大文字(アルファベット順)にインデックス付けしてから、結果を出力します。基本的に、各文字nはにマップされchr(ord(n) % 26 + 65)ます。このプログラムを使用し、マッピングの動作を確認できます。

出力:

  • 文字は新しい文字に直接マッピングされるため、常に入力と同じ長さになります。
  • 常に印刷可能なASCII文字のみで構成されます(大文字のみを含むため)
  • nなどの入力文字は存在しないため、入力とは常に異なります。これはchr(ord(n) % 26 + 65) == ntrueであるため、の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

ああ。DOES !$a~$a仕事?
CalculatorFeline

@ETHproductions寝る直前に最後の編集を行ったので、更新する時間がありませんでした。もちろん、あなたの権利は最初に整数に変換されるため、最初の文字は変更されないかもしれませんが、2番目の文字、たとえば「12」は「13」になります。
クリストフ

@CalculatorFeline悲しいことに失敗し、両方の!$aターン"12""12"するのでfalse、その何も交換しないとされますので、空の文字列に変換され~$aunprintablesにすべてを回すので、~"12"最初にint型に変換しませんが、文字通り、文字列内のすべてのビットを反転させます。
クリストフ


2

Brachylog、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%

5を法とする最後の文字のASCII値を取得し、最後の文字を結果に置き換えます。これは明らかに数字以外の文字に対しては機能しますが、最後の文字が数字の場合も変更されます( "0" mod 5 = 3、 "1" mod 5 = 4など)。

これは、同じ長さを維持したまま7または9でも機能します。

また、イェーイ!ここで最高のソリューションと同じくらい良いGolfscriptソリューションがあります!


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.