数字が減り、文字が増える


18

文字が減少する一方で数字が増加することからランダムにヒントを得た

文字と整数が混在したリスト(たとえば、['a', 2, 3, 'b']与えられた場合、アルファベットの1桁だけ文字を増やしztoでラップa)、数字を1 減らします。上記の例では、出力はになります['b', 1, 2, 'c']

  • 入力は、混合タイプのリスト、区切り文字列、文字列のリストなどです。
  • zにラップしますがa、に1行き0、に0行きます-1
  • 入力は[a-z]整数のみです。大文字[A-Z]が入力しやすい場合は、大文字を選択できます。
  • 入力は空でないことが保証されます。
  • 入力には、数字のみまたは文字のみを含めることができます。

例:

Input
Output

['a', 2, 3, 'b']
['b', 1, 2, 'c']

['a', 'b', 'z']
['b', 'c', 'a']

[-1, 0, 257, 'x']
[-2, -1, 256, 'y']

[0, 3, 1, 20382876]
[-1, 2, 0, 20382875]

規則と説明

  • 入力と出力は、任意の便利な方法で指定できます。
  • 結果をSTDOUTに出力するか、関数結果として返すことができます。
  • 出力は入力と同じ形式である必要はありません(たとえば、入力を文字列として、出力をリストとして取得できます)。
  • 完全なプログラムまたは機能のいずれかが受け入れられます。
  • 該当する場合は、入力/出力整数が言語のネイティブint範囲に収まると想定できます。
  • 標準的な抜け穴は禁止されています。
  • これはので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。

1
数値がInteger.MinValueに等しいか、符号付き整数の最小値が言語にある場合、Integer.maxValueにアンダーフローする必要がありますか、それともカウントダウンを続ける必要がありますか?
Nzall

1
@Nzall未定義の動作。Rules and Clarificationsの5番目の箇条書きでは、入力整数と出力整数の両方が言語のネイティブint範囲に収まるように指定されているためInteger.MinValue、入力として取得することはできません。
AdmBorkBork

回答:



5

Python 3、59バイト

lambda a:[i-1if''!=i*0else chr(97+(ord(i)+8)%26)for i in a]

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

Erik the Outgolferのおかげで-1バイト



@EriktheOutgolfer整数と文字列の比較は、ソリューションでは機能していないようです。
Jitse

ああ、そのためにはPython 2が必要です。
エリック・ザ・アウトゴルファー

ああ、それでうまくいくようです。それでも-96with の置換は+8バイトを節約します。
Jitse

''!=i*0私よりも3バイト短いstr(i)>'9'、良い仕事
ブラックフクロウカイ


5

ルビー、34バイト

各要素について、要素-1を返そうとします。文字列はこれを行うことができないため、エラーになり、rescue句によって選択されます。句は代わりsuccにそれを呼び出して、アルファベットの次の文字を返します。しかし、succ「ロールオーバー」しzて戻りaaますので、返された文字列の最初の文字を取得します。

->a{a.map{|e|e-1rescue e.succ[0]}}

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



3

Pythonの3182の 130 118バイト

-51は、@AdmBorkBorkと@Blackフクロウ甲斐のおかげバイト-1 @Blackフクロウカイへのバイトおかげで、-12置き換えることにより、バイト.append()+=[]し、交換n+1-~n

def a(x):
 b='abcdefghijklmnopqrstuvwxyz';c=[]
 for d in x:
  try:c+=[d-1]
  except:c+=[b[(-~b.find(d)%26)]]
 return c

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

質問がSandboxにある間に作成しましたが、今まで投稿されていませんでした。:P

非ゴルフ

def a(x):
    b = 'abcdefghijklmnopqrstuvwxyz'
    c = []
    for d in x:
        try:
            c.append(d - 1)
        except:
            c.append(b[((b.find(d) + 1) % 26)])
    return c

説明

入力されたリストの各要素についてx、1を減算し、最終的に返されるリストに追加しようとします。(要素が文字列であるため)エラーが発生した場合、アルファベットの文字のインデックスに1が加算され、mod 26が使用されます。mod 26は、26のインデックスを0にラップします。


CodeGolf SEへようこそ!私はPythonの専門家ではありませんが、4つのスペースをタブ用に交換して大量のバイトを節約できると思います。
AdmBorkBork

空白を削除するだけで131バイトになりました。一つの更なるバイトをすることを実現することによってgolfedことができる(x+27)%26のと同じ結果を持っている(x+1)%26
ブラックフクロウカイ

@AdmBorkBork BlackOwlKai助けてくれてありがとう!投稿を編集しました。
asdf60367134

str(d)==dtry / exceptに依存する代わりに、with を使用して文字列かどうかを確認できます。次に、try / exceptが不要になったため、リスト内包表記ですべてを実行できます。これについてもう少し考えさせていただきますが、この方法で100バイト未満を簡単に取得できます;)
Value Ink



2

Gema、55文字

<N>=@sub{$1;1}
z=a
<L>=@int-char{@add{@char-int{$1};1}}

汚れた解決策。文字の増分をラップアラウンドするのは痛々しいほど長いので、別のルールを得ました。

入力は何でも構いませんが、セパレータを使用するだけです。(数字と文字の間の区切り記号を省略することもできます。変更するための1文字の価格で、文字間の区切り記号も省略<L1>できます。)

サンプル実行:

bash-5.0$ gema '<N>=@sub{$1;1};z=a;<L>=@int-char{@add{@char-int{$1};1}}' <<< "['a', 2, 3, 'b']"
['b', 1, 2, 'c']

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

Gema、66文字

<N>=@sub{$1;1}
<L>=@cmpi{$1;z;@int-char{@add{@char-int{$1};1}};a;}

きれいなソリューション。半分は比較的効率的で、半分は純粋な痛みです。

サンプル実行:

bash-5.0$ gema '<N>=@sub{$1;1};<L>=@cmpi{$1;z;@int-char{@add{@char-int{$1};1}};a;}' <<< "['a', 2, 3, 'b']"
['b', 1, 2, 'c']

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


2

R、77 85バイト

@Giuseppeに8バイトのうんちをありがとう

function(l)Map(function(x)"if"(i<-match(x,L<-c(letters,"a"),0),L[i+1],x-1),l)

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

入力をリストとして受け取ります。@Giuseppeによる大きな変更の後、これを利用Mapして関数をリストに適用します。matchキャラクターのテストに利用します。テスト中、返送用に拡張文字リストとインデックスが保存されます。


私はcharactersが有限であると思うのは、それらはにキャストさnumericれてis.finiteおり、したがってNA
ジュゼッペ

@ジュゼッペは、それらの線に沿って何かになると思った。is.doubleと同じバイトですが、使用する必要がありました:)
MickyT


あなたを取り除くために申し訳ありませんがis.finite、私は自分でそれをクラックするだろうと思った
ジュゼッペ

1
非常に素晴らしい@Giuseppe、考えは考えていないMapmatch。毎日何かを学ぶのは良いことです:)
MickyT


2

網膜52 50 48 58 41 37バイト

T`zl`l
\b0
-
\d+
*
-_*
-$.0
_(_*)
$.1

-4バイト、@ FryAmTheEggmanに感謝します(言及するために、バグがありました:の1 → -1代わりに1 → 0)。
10はでバグを修正するためにバイト10かなりしばらくの間、私をねじ込み、このような迷惑なエッジケースを..しかし、41にそれをgolfed今バイト。(今、コメントで言及されている@Neil@CowsQuackの <40バイトのバージョンに興味があります。ありがとう@Neilを変換0-、最初に負の値を処理するヒントについてにたくさん助け。)
どうやら私は-4バイト...>、この時点で境界線を必要としません。>

I / Oはコンマ区切りです。

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

説明:

すべて"zabcdefghijklmnopqrstuvwxy(z)"を音訳する"abcdefghijklmnopqrstuvwxyz"

T`zl`l

すべてのスタンドアロン0sを次のように置き換えます-

\b0
-

すべての数をアンダースコアに置き換えて、すべての数値を単項に変換します。

\d+
*

すべての負の値の場合、後ろにゼロ以上の単項行があります。マイナス記号を保持し、この一致の合計長(を含む-)を取得して、整数に戻します:

-_*
-$.0

正の整数に関して:単一の単項行に一致することにより正の整数に一致し、その後にゼロ個以上の単項行が続きます。そして、それらをそのキャプチャグループの長さに置き換えて、その単一の単項行を削除し、同時に整数に戻します:

_(_*)
$.1


1

PHP、50バイト

for(;''<$a=$argv[++$i];)echo$a<a?--$a:(++$a)[0],_;

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

テスト

_末尾の区切り文字で区切られた文字/整数を出力します。

PHPでは、文字を直接インクリメントできるため、それを利用しました。しかしzにインクリメントされるaaためにそれを変換するために、a(++$a)[0]だけインクリメントされた値の最初の文字を出力する使用されています。


1

Japt -m13 12 バイト

シャギーのおかげで-1バイト

;¤?UÉ:Cg8+Uc

それを試してみてください

説明:

;o ?UÉ:Cg8+Uc
-m              // Map U through the input:
 o              // Try to create a range [1...U]
   ?            //   If that creates a range (number):
    UÉ          //     Return U-1
      :         //   Else, return:
;      C        //     alphabet (a...z)
        g       //     Index:
         8+Uc   //       8 + char-code of U

;ターンC小文字のアルファベットに


からzにラップするようには見えませんa
シャギー

@Shaggy Whoops、私はそれを見逃した。+2バイトの一時的な修正を追加しました
Oliver

3進法なしに(まだ)修正する方法を見つけられませんでした。これはあなたの好みにあまりにも似ているため、今は削除しています。o-> ¤ここで1バイト節約できます。
シャギー

1
+2その後、-1シャギーのおかげで、より正確になります!:D
シャギー

1
@Shaggy The +2Oliverに感謝しました:P
Oliver

1

Haskell、52 51バイト

map q
q"z"="a"
q x|x>"`"=succ<$>x|1<2=show$read x-1

Haskellでは混合型のリストが許可されていないため、文字と数字が取得され、文字列として返されます。

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

すべてのリスト要素を確認します。文字列がの場合"z"、return "a"; 文字列の最初の文字が>の場合'`'(つまり、数字ではなく文字)の場合、文字列内の文字の後継を返します。それ以外の場合は数値でなければならないため、整数に変換し、1を減算して再び文字列に変換します。

編集:@coleのおかげで-1バイト。


これは51バイトで動作しますか?
コール

@cole:はい。ありがとう!
nimi

1

ゼリー、13バイト

®i‘ị®µ’e?€Øa©

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

ジョナサンアランによる巧妙な修正

注:これは完全なプログラムではありません。TIOのフッターを使用すると、コマンドライン引数を使用して入力して関数をテストできます。


入力の負の値(またはchrの範囲)での作業が不適切 ®i‘ị®µ’e?€Øa©私は信じているゼロの修正です。
ジョナサンアラン

@ジョナサンアランハ、私はそれがその場合に正確に動作しないことを忘れていました。皮肉なことに、入力のs ~を考慮する条件として使用することを避けたので-1...また、どのように短縮するの®i‘ị®でしょうか...
Erik the Outgolfer



1

K(oK)、27バイト

{$[9+@x;`c$97+26!8+x;x-1]}'

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

-8 ngnとdzaimaに感謝:)


1
{$[-9=@x;x-1;90=x;"A";`c$1+x]}'特殊なケースをインライン化して大文字を使用する31バイト(および'入力はリストである必要があるためカウントする必要があります)
dzaima

@scrawl dzaimaは正しいと思います- '数えるべきです。ここでは必要ありませんもう少し長い式だ':>「」 -とまた、「Z」の世話をする{`c`i[t]$(-26*x~'"z")+x+1-2*t:x~'0+x}
NGN

またはさらに良い-投影のリストを作成して、それらを適用します@'{(`c$97+26!-96+;-1+)[x~'0+x]@'x}。ここで-96(1マイナス「A」のASCIIコードである)で置き換えることができ8、それが26モッズかかったとして
NGN

大文字を選択してさらに-1バイト:{(`c$65+26!14+;-1+)[x=_x]@'x}
ngn

@dzaimaは、次のように短縮できます-9=@x->x=_x
ngn

0

ルーン文字のエンチャント、36バイト

\$ka'~?*3({':+1\
R';$ >i::0Sqn=?/1-$

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

一般的なプロセスは、入力を読み取り、0(文字列への強制)を先頭に追加し、数値に変換し直して(単一の文字は常に-1を返します)、入力と比較します。同じ場合は、数値でなければならず、1を減算して出力します。同じでない場合は、charである必要があります。1を減算し{ます。より小さい場合は、印刷します。それ以外の場合は、で置き換えてa印刷します。

プログラムがスタックアンダーフローを実行するまで繰り返します。

1バイト;節約するために出力が区切られます(末尾に1バイトあります)。入力はスペースで区切られます。


0

スタックス、17 バイト

àºÇ╝'♫d▬♣ΩÜEƒ6╩╬ó

実行してデバッグする

これはもっと短くすることができるように思えますが、前回のリリースから新しいスタックス機能を使用する機会に抵抗することはできません。

入力全体を文字列として扱う:

  1. 正規表現は数字の連続を置き換えます eval(match) - 1。正規表現ブロックの置換は文字列ではなく整数であるため、これは新しい機能です。
  2. 正規表現は、小文字のアルファベットに沿ってリングを翻訳することにより、一連の文字を置き換えます。


0

C#、148バイト

(object[] o)=>{var l=new List<object>();foreach(var h in o){try{l.Add((int)h-1);}catch{var c=((char)h+1);if(c>122){c=97;}l.Add((char)c);}}return l;}

Repl.itリンク

ゴルフをしていない:

var inputList = new object[] {'a', 2, 'z', 6};
var outputList = new List<object>();
foreach (var currentItem in inputList)
{
    try
    {
        outputList.Add((int)currentItem-1);
    }
    catch
    {
        var currentItemPlusOne = ((char)currentItem + 1);
        if (currentItemPlusOne > 122)
        {
            currentItemPlusOne = 97;
        }
        outputList.Add((char)currentItemPlusOne);
    }
}

0

、16バイト

WS⟦⎇№βι§β⊕⌕βιI⊖ι

オンラインでお試しください!リンクは、コードの詳細バージョンです。各行が単一の小文字または整数であるSTDINで入力を受け取り、STDOUTで別の行に出力します。説明:

WS

空行に達するまで、STDINから繰り返し入力します。

この式を独自の行に出力します。

⎇№βι

これは、事前定義された小文字のアルファベットのサブストリングですか?

§β⊕⌕βι

その場合、次の文字を周期的にインデックス付けして印刷します。

I⊖ι

それ以外の場合は、値をデクリメントし、暗黙的な印刷のために文字列にキャストバックします。


0

Zsh、47バイト

a=({a..z} a)
for i
<<<${a[$a[(i)$i]+1]:-$[--i]}

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

a=({a..z} a)                  # append extra 'a' to the end to handle 'z' case
for i                         # for i in "$@" arguments
<<<${a[$a[(i)$i]+1]:-$[--i]}
       $a[(i)$i]              # first (i)ndex of $i in list (if not found, set to after last index)
      [         +1]           # increment
   ${a[           ]        }  # value in array at index. if lookup fails, empty string
   ${              :-$[--i]}  # if empty, decrement $i and substitute instead
<<<                           # print to stdout



0

T-SQL 2012、61バイト

入力には大文字が必要です。

入力としてテーブル変数を使用します。

SELECT iif(x<'a',left(x-1,9),char((ascii(x)-64)%26+65))FROM @

オンラインで試す


0

SimpleTemplate、80バイト

これは私が作った言語で書かれました。

コンパイラーの制限により、これ以上減らすことはできません。

{@eachargv}{@if_ is matches"@\d+@"}{@incby-1_}{@echol_}{@else}{@inc_}{@echol_.0}

そして今、無制限:

{@each argv as value}
    {@if value is matches "@\d+@"}
        {@inc by -1 value}
    {@else}
        {@inc by 1 value}
    {@/}
    {@echo value, "\n"}
{@/}

そして説明:

  • {@each argv as value}-のすべての値をループしますargv。(argv渡されたすべての引数を含む)。が存在しない
    場合、as <var>デフォルト_変数が想定されます。
  • {@if value is matches "@\d+@"}- value正規表現と一致するチェック"@\d+@"
  • {@inc by -1 value} -値を-1増やします(基本的には減分)。
  • {@echo value, "\n"}および{@echol_}- echol渡された値を出力し、最後に行を追加します。
  • {@else} -自明
  • {@inc by 1 value}-値を1増やします。by <value>が欠落している場合、1と見なされます。
  • {@echo value.0, "\n"}および{@echol_.0}- echol渡された値を出力し、最後に行を追加します。
    これは、チャレンジルールのために必要ですz wraps to a
    @inc文字列で使用されると、文字が増加し、ヒットするzとにラップしaaます。
    最初の文字を出力すると、7バイトのコストでチャレンジを満たします。
  • {@/}- {@else}上記を閉じます(オプション)。
  • {@/}- {@each}上記を閉じます(オプション)。

これを試すことができます:http : //sandbox.onlinephpfunctions.com/code/7533641a0aa1fc8bf4699a9c758690de186b052f

渡された各引数render()は、考慮される新しい値になります。


-1

Perl、64バイト

foreach (@ARGV){$_=~m/[a-zA-Z]/?++$_:--$_;print substr $_,0,1;}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.