Zahlen verringern sich, Buchstaben erhöhen sich


18

Zufällig inspiriert von Zahlen, die zunehmen, während Buchstaben abnehmen

Bei einer Liste von gemischten Buchstaben und ganzen Zahlen (z. B. ['a', 2, 3, 'b']) erhöhen Sie die Buchstaben um eine Stelle im Alphabet (Umbruch bei zbis a) und verringern Sie die Zahlen um 1. Für das obige Beispiel sollte die Ausgabe sein ['b', 1, 2, 'c'].

  • Die Eingabe kann eine Liste gemischter Typen, eine durch Trennzeichen getrennte Zeichenfolge, eine Liste von Zeichenfolgen usw. sein.
  • zwickelt sich zu a, 1geht aber zu 0und 0geht zu -1usw.
  • Die Eingabe wird immer nur [a-z]und ganze Zahlen sein. Sie können Großbuchstaben [A-Z]als Eingabe wählen, wenn dies für Sie einfacher ist.
  • Die Eingabe ist garantiert nicht leer.
  • Die Eingabe darf nur Ziffern oder nur Buchstaben enthalten.

Beispiele:

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]

Regeln und Erläuterungen

  • Eingabe und Ausgabe können auf jede bequeme Weise erfolgen .
  • Sie können das Ergebnis an STDOUT drucken oder als Funktionsergebnis zurückgeben.
  • Die Ausgabe muss nicht dasselbe Format wie die Eingabe haben (z. B. können Sie die Eingabe als Zeichenfolge und die Ausgabe als Liste verwenden).
  • Es ist entweder ein vollständiges Programm oder eine Funktion zulässig.
  • Falls zutreffend, können Sie davon ausgehen, dass die Eingabe- / Ausgabe-Ganzzahlen in den systemeigenen intBereich Ihrer Sprache passen .
  • Standardlücken sind verboten.
  • Dies ist daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Byte) gewinnt.

1
Wenn die Zahl gleich "Integer.MinValue" ist oder der niedrigste Wert einer vorzeichenbehafteten Ganzzahl in meiner Sprache liegt, sollte ich "Integer.maxValue" unterlaufen oder den Countdown fortsetzen?
Nzall

1
@Nzall Undefiniertes Verhalten. Der fünfte Aufzählungspunkt unter Regeln und Erläuterungen gibt an, dass sowohl Eingabe- als auch Ausgabe-Ganzzahlen in den systemeigenen intBereich Ihrer Sprache passen , sodass Sie niemals Integer.MinValueeine Eingabe erhalten würden.
AdmBorkBork

Antworten:



5

Python 3 , 59 Bytes

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

Probieren Sie es online!

-1 Byte danke an Erik den Outgolfer



@EriktheOutgolfer Integer vs String-Vergleich scheint in Ihrer Lösung nicht zu funktionieren.
Jitse

Oh ja, dafür brauchst du Python 2.
Erik der Outgolfer

Ah ja, dann scheint es zu funktionieren. Trotzdem spart das Ersetzen von -96mit +8ein Byte.
Jitse

''!=i*0ist drei Bytes kürzer als meine str(i)>'9', gute Arbeit
Black Owl Kai


5

Ruby , 34 Bytes

Versuchen Sie für jedes Element, das Element -1 zurückzugeben. Strings können dies nicht, daher treten Fehler auf und werden von der rescueKlausel aufgefangen, die stattdessen succden nächsten Buchstaben im Alphabet zurückgibt. succ"rollt über" an zund kehrt zurück aa, also nehmen wir einfach das erste Zeichen in der zurückgegebenen Zeichenfolge.

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

Probieren Sie es online!



3

Python 3 , 182 130 118 Bytes

-51 Bytes dank @AdmBorkBork und @Black Owl Kai, -1 Bytes dank @Black Owl Kai, -12 Bytes durch Ersetzen .append()mit +=[]und Ersetzen n+1mit-~n

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

Probieren Sie es online!

Ich habe dies gemacht, während sich die Frage in der Sandbox befand, habe sie aber erst jetzt veröffentlicht. : P

Ungolfed

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

Erläuterung

Für jedes Element in der eingegebenen Liste xwird versucht, 1 zu subtrahieren und zur eventuell zurückgegebenen Liste hinzuzufügen. Wenn ein Fehler auftritt (weil das Element ein String ist), wird der Index des Buchstabens im Alphabet um 1 addiert und dieser Mod 26 wird genommen. Der Mod 26 bricht einen Index von 26 auf 0 zurück.


Willkommen bei CodeGolf SE! Ich bin kein Python-Experte, aber ich denke, Sie können 4 Leerzeichen gegen Tabulatoren tauschen, um eine Menge Bytes zu sparen.
AdmBorkBork

Ich habe es auf 131 Bytes gebracht, indem ich Whitespace beseitigt habe. Ein weiteres Byte kann golfen werden, indem erkannt wird, dass (x+27)%26es das gleiche Ergebnis wie(x+1)%26
Black Owl Kai

@AdmBorkBork BlackOwlKai Danke für die Hilfe! Ich habe den Beitrag bearbeitet.
asdf60367134

Sie können mit ternary str(d)==dprüfen, ob es sich um eine Zeichenfolge handelt, anstatt sich auf try / except zu verlassen. Dann, da Sie try / except nicht mehr brauchen, können Sie das Ganze in einem Listenverständnis machen! Ich lasse Sie ein bisschen mehr darüber nachdenken, aber Sie können auf diese Weise leicht unter 100 Bytes kommen;)
Value Ink



2

Gema , 55 Zeichen

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

Schmutzige Lösung. Das Herumwickeln in Buchstabenschritten ist schmerzhaft lang, daher gibt es eine separate Regel.

Die Eingabe kann alles Mögliche sein, verwenden Sie nur einige Trennzeichen. (Sie können sogar Trennzeichen zwischen Zahlen und Buchstaben weglassen. Mit dem Preis von 1 Zeichen für den Wechsel zu können <L1>Sie auch Trennzeichen zwischen Buchstaben weglassen.)

Probelauf:

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']

Probieren Sie es online!

Gema, 66 Zeichen

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

Saubere Lösung. Halb relativ effizient, dann halb reiner Schmerz.

Probelauf:

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']

Probieren Sie es online!


2

R 77 85 Bytes

Danke @ Giuseppe für die 8 Bytes

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

Probieren Sie es online!

Nimmt die Eingabe als Liste. Nach einer großen Änderung durch @ Giuseppe wird hiermit Mapeine Funktion auf die Liste angewendet . Es nutzt match, um für einen Charakter zu testen. Während des Tests werden die erweiterte Briefliste und der Index für die Rücksendung gespeichert.


Ich nehme an, characters sind nicht endlich, weil sie von gegossen numericwerden is.finiteund sind so NA?
Giuseppe

@ Giuseppe dachte, es wäre etwas in diese Richtung. Obwohl es die gleichen Bytes wie is.double sind, musste ich es benutzen :)
MickyT


Es tut mir leid is.finite, dass ich dich losgeworden bin. Ich dachte, ich würde es selbst
Giuseppe,

1
@ Giuseppe sehr nett, hätte nicht gedacht Mapund match. Es ist gut, jeden Tag etwas zu lernen :)
MickyT

2

MathGolf , 14 Bytes

▄\╧¿ò'z=¿Å'a)(

Probieren Sie es online!

Nimmt Buchstaben als Kleinbuchstaben.

Erläuterung

▄\╧              Is the element in the lowercase alphabet?
   ¿ò            If so:
     'z=           Is it equal to z?
        ¿Å         If so:
          'a         Push 'a'
            )      Else: Increment the string
             (   Else: Decrement the number

2

Retina , 52 50 48 58 41 37 Bytes

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

-4 Bytes dank @FryAmTheEggman (und für die Erwähnung hatte ich einen Fehler: 1 → -1statt 1 → 0).
+10 Bytes, um einen Fehler mit 1und zu beheben 0. Solch ein nerviger Edge-Fall, der mich eine ganze Weile fertig gemacht hat. Aber jetzt hat er auf 41 Bytes golfen. (Jetzt bin ich neugierig auf die in den Kommentaren erwähnten <40-Byte-Versionen @Neil und @CowsQuack .) Vielen Dank an @Neil für den Tipp, das 0zu konvertieren -und zuerst mit den negativen Werten umzugehen hat
mir sehr geholfen.) Anscheinend brauche ich die Grenzen an dieser Stelle nicht, also -4 Bytes ..>.>

E / A ist durch Kommas getrennt.

Probieren Sie es online aus.

Erläuterung:

Alle umschreiben "zabcdefghijklmnopqrstuvwxy(z)"zu "abcdefghijklmnopqrstuvwxyz":

T`zl`l

Ersetzen Sie alle Standalones 0durch -:

\b0
-

Konvertieren Sie alle Zahlen in unäre Zahlen, indem Sie sie durch die Anzahl der Unterstriche ersetzen:

\d+
*

Für alle negativen Werte mit null oder mehr unären Linien: Behalten Sie das Minuszeichen bei und berechnen Sie die Gesamtlänge dieser Übereinstimmung (einschließlich der -), die zurück in eine Ganzzahl konvertiert wurde:

-_*
-$.0

Für die positiven Ganzzahlen gilt: Passen Sie eine positive Ganzzahl an, indem Sie eine einzelne unäre Linie gefolgt von null oder mehr unären Linien abgleichen. Ersetzen Sie sie dann durch die Länge dieser Erfassungsgruppe, um diese einzelne unäre Linie zu entfernen und sie gleichzeitig wieder in ganze Zahlen umzuwandeln:

_(_*)
$.1


1

PHP , 50 Bytes

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

Probieren Sie es online!

Tests

Gibt Buchstaben / Ganzzahlen aus, die durch _ein nachstehendes Trennzeichen getrennt sind.

In PHP können Sie Buchstaben direkt inkrementieren, also habe ich es ausgenutzt. Aber das zwird inkrementiert aa, um es in adas umzuwandeln , (++$a)[0]was nur das erste Zeichen des inkrementierten Werts ausgibt.


1

Japt -m , 13 12 Bytes

-1 Byte dank Shaggy

;¤?UÉ:Cg8+Uc

Versuch es

Erläuterung:

;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

Hinweis : ;verwandelt sich Cin Kleinbuchstaben


Es sieht nicht so aus, als würde das von znach umhüllt a.
Shaggy

@ Shaggy Whoops, das habe ich verpasst. Ich habe einen temporären Fix für +2 Bytes hinzugefügt
Oliver

Konnte (noch) keinen Weg finden, meinen Fehler ohne einen Ternären zu beheben, was ihn für meinen Geschmack zu ähnlich macht, so dass ich ihn vorerst lösche. o-> ¤spart euch hier ein byte.
Shaggy

1
+2und dann wäre -1dank Shaggy genauer! : D
Shaggy

1
@ Shaggy Das +2war dank Oliver: P
Oliver

1

Haskell, 52 51 Bytes

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

Da Haskell keine Listen gemischter Typen zulässt, werden Buchstaben und Zahlen als Zeichenfolgen zurückgegeben.

Probieren Sie es online!

Überprüfen Sie für jedes Listenelement: Wenn die Zeichenfolge ist "z", geben Sie zurück "a"; Wenn das erste Zeichen der Zeichenfolge> ist '`'(dh ein Buchstabe, keine Ziffer), geben Sie den Nachfolger der Zeichen in der Zeichenfolge zurück. Andernfalls muss es eine Zahl sein. Wandeln Sie sie in eine Ganzzahl um, subtrahieren Sie 1 und verwandeln Sie sie erneut in eine Zeichenfolge.

Edit: -1 Byte dank @cole.


Funktioniert das für 51 Bytes?
Cole

@cole: ja das tut es. Vielen Dank!
nimi

1

Gelee , 13 Bytes

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

Probieren Sie es online!

Clevere Lösung von Jonathan Allan .

Hinweis: Dies ist kein vollständiges Programm. Die Fußzeile über TIO ermöglicht die Eingabe mit einem Befehlszeilenargument zum Testen der Funktion.


Funktioniert nicht mit Negativen in der Eingabe (oder über dem chr-Bereich). ®i‘ị®µ’e?€Øa©ist ein Fix für Null, glaube ich.
Jonathan Allan

@ JonathanAllan Hah, ich habe vergessen, dass das in diesem Fall nicht funktioniert. Ironisch, da ich es vermieden habe, s ~als Bedingung für -1die Eingabe zu verwenden ... ®i‘ị®
Und

1

C ++ 17 (gcc) , 120 Bytes

#define O int operator()
struct V{O(char&c){c++-90?:c=65;}O(int&i){--i;}};int f(auto&l){for(auto&x:l)std::visit(V{},x);}

Hier fist die erforderliche Funktion; list sowohl der Eingabe- als auch der Ausgabeparameter, und es wird erwartet, dass es sich um einen Container mit Objekten handelt, die kompatibel sind std::variant<char, int>oder umgekehrt.

Probieren Sie es online!



1

K (oK) , 27 Bytes

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

Probieren Sie es online!

-8 danke an ngn und dzaima :)


1
31 Bytes in {$[-9=@x;x-1;90=x;"A";`c$1+x]}'Großbuchstaben und in Großbuchstaben (und das 'muss als Eingabe gezählt werden, sollte eine Liste sein)
dzaima

@scrawl ich denke dzaima hat recht - das 'sollte gezählt werden. Hier ist ein etwas längerer Ausdruck, der nicht benötigt wird 'und sich auch um "z" -> "a" {`c`i[t]$(-26*x~'"z")+x+1-2*t:x~'0+x}
kümmert

oder noch besser - erstellen Sie eine Liste von Projektionen und wenden Sie diese an mit @':{(`c$97+26!-96+;-1+)[x~'0+x]@'x} . Hier -96(+1 abzüglich des ASCII-Codes von "a") kann durch ersetzt werden, 8da es mit Mod 26 aufgenommen wurde.
ngn

ein weiteres -1 Byte durch Wahl von Großbuchstaben:{(`c$65+26!14+;-1+)[x=_x]@'x}
ngn

@dzaima Ihr verkürzt durch sein -9=@x->x=_x
ngn

0

Runenverzauberungen , 36 Bytes

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

Probieren Sie es online!

Der allgemeine Vorgang besteht darin, die Eingabe zu lesen, eine 0 (Zwang zu Zeichenfolge) voranzustellen, sie in eine Zahl umzuwandeln (ein einzelnes Zeichen gibt immer -1 zurück) und sie mit der Eingabe zu vergleichen. Wenn dies der Fall ist, muss es sich um einen numerischen Wert handeln, 1 wird subtrahiert und gedruckt. Wenn nicht gleich, muss es ein Zeichen sein, subtrahiere 1, vergleiche mit {. Wenn kleiner als, drucken Sie, andernfalls ersetzen Sie es durch aund drucken Sie.

Wiederholen, bis das Programm einen Stapelunterlauf ausführt.

Die Ausgabe wird durch getrennt ;, um 1 Byte zu speichern (und hat ein nachfolgendes Byte ). Die Eingabe ist durch Leerzeichen getrennt.


0

Stax , 17 Bytes

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

Führen Sie es aus und debuggen Sie es

Das fühlt sich an, als ob es möglich sein sollte, eine kürzere Version zu erstellen, aber ich kann der Gelegenheit nicht widerstehen, eine neue Stax-Funktion aus der letzten Version zu verwenden.

Behandlung der gesamten Eingabe als Zeichenfolge:

  1. Regex ersetzt Ziffernfolgen durch eval(match) - 1. Dies ist die neue Funktion, da das Ersetzen von Regex-Blöcken keine Zeichenfolge, sondern eine Ganzzahl ist.
  2. Regex ersetzt Buchstabenfolgen durch Ringübersetzung um das Kleinbuchstaben.

0

Python 3, 66 Bytes

lambda X:[x-1if type(x)==int else chr(97+(ord(x)+8)%26)for x in X]

Bearbeiten:

Ich habe die Lösung von Jitse bis jetzt nicht gesehen. Der Trick von if ''! = I * 0 ist großartig!


0

148 Bytes

(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 Link

Ungolfed:

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

Kohle , 16 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Übernimmt die Eingabe in STDIN, wobei jede Zeile entweder ein Kleinbuchstabe oder eine Ganzzahl ist, und gibt sie in separaten Zeilen in STDOUT aus. Erläuterung:

WS

Wiederholt von STDIN eingeben, bis eine leere Zeile erreicht ist.

Geben Sie diesen Ausdruck in einer eigenen Zeile aus.

⎇№βι

Ist dies eine Teilzeichenfolge des vordefinierten Kleinbuchstaben?

§β⊕⌕βι

Wenn ja, drucken Sie den nächsten Buchstaben zyklisch aus.

I⊖ι

Verringern Sie andernfalls den Wert und setzen Sie ihn für den impliziten Druck in einen String zurück.


0

Zsh , 47 Bytes

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

Probieren Sie es online!

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

C (GCC) , 93 86 Bytes

f(int**s){for(char**p=s,*z;z=*p++;)64&*z?*z=*z-'z'?++*z:97:sprintf(z,"%d",atoi(z)-1);}

Probieren Sie es online!

Die Eingabe ist eine abgeschlossene NULLAnordnung von abgeschlossenen '\0'Zeichenfolgen, z{"a", "b", "c", "17", NULL} .

-7 Bytes dank @ceilingcat


0

Perl 6 , 31 Bytes

*>>.&{(try $_-1)||chr ord ++$_}

Probieren Sie es online!

Anonym Welches Lambda, das jedes Element der Liste zuordnet und versucht, eines davon zu subtrahieren, andernfalls es zu erhöhen und das erste Zeichen in dem Fall zu übernehmen, in dem es zumgebrochen wird aa.



0

SimpleTemplate, 80 Byte

Dies wurde in einer Sprache geschrieben, die ich gemacht habe.

Aufgrund von Einschränkungen im Compiler kann ich es nicht mehr reduzieren.

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

Und jetzt ungolfed:

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

Und die Erklärung:

  • {@each argv as value}- durchläuft alle Werte in argv. ( argventhält alle übergebenen Argumente).
    Wenn das as <var>nicht vorhanden ist, die Standardeinstellung_ angenommen.
  • {@if value is matches "@\d+@"}- prüft, ob valuemit dem regulären Ausdruck übereinstimmt "@\d+@".
  • {@inc by -1 value} - erhöht den Wert um -1 (im Grunde genommen eine Verringerung).
  • {@echo value, "\n"}und {@echol_}- echolgibt die übergebenen Werte aus und fügt am Ende eine Zeile hinzu.
  • {@else} - selbsterklärend
  • {@inc by 1 value}- erhöht den Wert um 1. Wenn das by <value>fehlt, wird angenommen, dass es 1 ist.
  • {@echo value.0, "\n"}und {@echol_.0}- echolgibt die übergebenen Werte aus und fügt am Ende eine Zeile hinzu.
    Dies ist erforderlich , weil die Herausforderung Regeln: z wraps to a.
    Wenn an @incfür eine Zeichenfolge verwendet wird, werden die Zeichen inkrementiert und bei einem Treffer zwird ein Zeilenumbruch ausgeführtaa .
    Die Ausgabe des ersten Zeichens erfüllt die Herausforderung auf Kosten von 7 Bytes.
  • {@/} - schließt die {@else}obige (optional).
  • {@/}- schließt das {@each}obige (optional).

Sie können dies anprobieren: Adresse http://sandbox.onlinephpfunctions.com/code/7533641a0aa1fc8bf4699a9c758690de186b052f

Jedes übergebene Argument für render()ist ein neuer Wert, der berücksichtigt wird.


-1

Perl, 64 Bytes

foreach (@ARGV){$_=~m/[a-zA-Z]/?++$_:--$_;print substr $_,0,1;}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.