Zeichen am angegebenen Index entfernen

33

(stark inspiriert durch das String-Element am angegebenen Index )

Wenn eine Zeichenfolge sund eine Ganzzahl angegeben werden, ndie einen Index in darstellen s, wird die Ausgabe smit dem Zeichen an der n-ten Stelle entfernt.

0-Indizierung und 1-Indizierung sind zulässig.

  • Bei der 0-Indizierung ist ndies nicht negativ und kürzer als die Länge von s.
  • Für die 1-Indizierung ist npositiv und kleiner oder gleich der Länge von s.

sbesteht nur aus druckbaren ASCII-Zeichen ( \x20-\x7E, oder  bis ~).

Jede angemessene Eingabe / Ausgabe ist zulässig. Es gelten Standardlücken .

Testfälle (0-indiziert):

n s        output
0 "abcde"  "bcde"
1 "abcde"  "acde"
2 "a != b" "a = b"
3 "+-*/"   "+-*"
4 "1234.5" "12345"
3 "314151" "31451"

Testfälle (1-indiziert):

n s        output
1 "abcde"  "bcde"
2 "abcde"  "acde"
3 "a != b" "a = b"
4 "+-*/"   "+-*"
5 "1234.5" "12345"
4 "314151" "31451"

Das ist , also gewinnt die kürzeste Antwort in Bytes.

ETHproductions
quelle
9
Niemand anderes antwortet, C # gewinnt ... zu spät :(
TheLethalCoder
Können wir davon ausgehen, dass das Zeichen in diesem IDX nur einmal vorkommt?
programmer5000
1
@ programmer5000 Letzter Testfall 3, 314151-> 31451. Ich würde nicht annehmen.
TheLethalCoder
@ programmer5000 Nein. Siehe letzten Testfall.
ETHproductions
2
Vielleicht wäre eine Bestenliste hilfreich, es gibt bereits viele Antworten, die durchsucht werden müssen.
Mr. Xcoder

Antworten:

23

C #, 20 - 19 Bytes

s=>n=>s.Remove(n,1)
TheLethalCoder
quelle
13

Alice , 13-12 Bytes

Danke an Leo für das Speichern von 1 Byte.

/oI\!e]&
@ q

Probieren Sie es online!

Die erste Zeile der Eingabe ist die Zeichenfolge, die zweite Zeile ist der auf 0 basierende Index.

Erläuterung

/    Reflect to SE. Switch to Ordinal. While in Ordinal mode, the IP bounces
     diagonally up and down through the code.
I    Read the first line of input (the string).
!    Store the string on the tape, which writes the characters' code points to 
     consecutive cells (the tape is initialised to all -1s).
]    Move the tape head right. This moves it by an entire string, i.e. to the
     cell after the -1 that terminates the current string.
     The IP bounces off the bottom right corner and turns around.
]    Move the tape head right by another cell.
!    Store an implicit empty string on the tape, does nothing. It's actually
     important that we moved the tape head before this, because otherwise it
     would override the first input code point with a -1.
I    Read the second line of input (the index) as a string.
/    Reflect to W. Switch to Cardinal.
     The IP wraps around to the last column.
&]   Implicitly convert the first input to the integer value it contains
     (the index) and move the tape head that many cells to the right, i.e.
     onto the character we want to delete. Note that Ordinal and Cardinal mode
     have two independent tape heads on the same tape, so the Cardinal tape
     head is still on the first cell of the string input before we do this.
e!   Store a -1 in the cell we want to delete.
\    Reflect to SW. Switch to Ordinal.
q    Push the entire tape contents as a single string. This basically takes
     all cells which hold valid code points from left to right on the tape 
     and concatenates the corresponding characters into a single string. Since
     we wrote a -1 (which is not a valid code point) over the target character,
     this will simply push the entire input string without that character.
o    Output the result.
@    Terminate the program.
Martin Ender
quelle
10

K (Kona), 1 Byte

_

Ich muss builtins lieben. 0-basierte Indizierung. Verwendung:

k)"abcdef" _ 3
"abcef"
Simon Major
quelle
Der Verwendung des richtigen Werkzeugs für den Job eine ganz neue Bedeutung geben.
MD XF
1
Ha - Sie wollen das richtige Werkzeug für den Job sehen? codegolf.stackexchange.com/a/121700/49493
Simon Major
Ich habe einen Weg gefunden, dies mit einem noch kürzeren Programm zu tun. Leider ist in diesem Kommentarfeld nicht genügend Platz zum Erklären ;-)
Mawg
8

Haskell , 28 24 Bytes

-4 Byte dank Laikoni, diese Version ist 1-indiziert.

s#n=take(n-1)s++drop n s

Alte Antwort:

f(s:t)0=t;f(s:t)n=s:f t(n-1)

Eine einfache rekursive Funktion, die den Wert annimmt. Sie ist 0-indiziert.

Mein erstes Mal Code-Golfing, vielleicht ist es nicht die optimale Lösung. Naja.

Sgt. Doggo
quelle
2
Willkommen bei PPCG!
Martin Ender
1
Vielleicht interessieren Sie sich auch für die Sammlung von Tipps zum Golfen in Haskell .
Laikoni
7

Mathematica, 18 Bytes

1-indiziert

#2~StringDrop~{#}&

Eingang

[1, "abcde"]

danke Martin Ender

J42161217
quelle
4
Meiner Meinung nach ermöglicht "Jede vernünftige Eingabe / Ausgabe ist zulässig", dass die Eingabe wie folgt interpretiert wird. ["abcde", {1}]In diesem Fall ist StringDropallein der Trick. Was denkst du? (Vielleicht möchten Sie explizit erwähnen, dass es auch 1-indiziert ist.) Ich freue mich immer, wenn Leute Mathematica-Antworten posten :)
Greg Martin
5

CJam , 4 Bytes

q~Lt

Probieren Sie es online!

Erläuterung

q~    e# Read and eval input (push the string and number to the stack).
  Lt  e# Set the nth element of the string to the empty string.
Geschäfts-Katze
quelle
5

GCC c Funktion, 25

1-basierte Indizierung.

f(n,s){strcpy(s-1,s+=n);}

Viele undefinierte Verhaltensweisen hier, achten Sie also auf verirrte Velociraptoren :

  • Die strcpy()Manpage sagt, dass das Verhalten undefiniert ist , wenn zwischen Objekten kopiert wird, die sich überlappen . Hier gibt es eindeutig eine Überlappung der Zeichenfolgen src und dest , aber es scheint zu funktionieren, also ist entweder glibc vorsichtiger oder ich habe Glück gehabt.
  • Die Antwort ist abhängig von der Tatsache, dass das s+=nvor dem passiert s-1. Der Standard gibt keine solchen Garantien und nennt dies tatsächlich undefiniertes Verhalten. Auch hier scheint es mit dem GCC-Compiler unter x86_64 Linux wie erforderlich zu funktionieren.

Probieren Sie es online aus .

Digitales Trauma
quelle
2
In einem Stack-basierten ABI wie x86 müssen strcpydie Argumente in der Reihenfolge von rechts nach links verschoben werden, was das Verhalten erklären würde, aber Sie sagten, Sie würden x86_64Register verwenden ... Vielleicht hat sich der Compiler für Golf entschieden der generierte Code und entschied, dass das Berechnen von s + = n zuerst golfer war!
Neil
5
Ich liebe es, wenn C antwortet: "Das hat keinen offiziellen Grund zu arbeiten, aber es tut es trotzdem, also ... wie."
Quentin
Heiliger Strohsack. Das bläst meins aus dem Wasser. Sehr beeindruckend!
MD XF
1
@Quentin Das ist eines der lustigen Dinge am Code-Golf - du darfst - ermutigt sogar - den schrecklichsten, unsichersten Code schreiben, der normalerweise eine Straftat sein würde ;-)
Digitales Trauma
Ich würde gerne den Grund für die Ablehnung wissen ...
Digitales Trauma
4

MATL , 3 Bytes

&)&

Verwendet 1-basierte Indizierung.

Probieren Sie es online! Oder überprüfen Sie alle Testfälle .

Erläuterung

&    % Specify secondary default number of inputs/outputs for next function
)    % Implicitly input string and number. Index: with & it pushes the char
     % defined by the index and the rest of the string
&    % Specify secondary default number of inputs/outputs for next function
     % Implicitly display (XD): with & it only displays the top of the stack

In der modifizierten Version mit allen Testfällen befindet sich der Code in einer Endlosschleife, `...Tbis keine Eingabe mehr gefunden wird. Am Ende jeder Iteration wird die Anzeigefunktion ( XD) explizit aufgerufen, und der Stapel wird gelöscht ( x), um ihn für die nächste Iteration vorzubereiten.

Luis Mendo
quelle
Ich mag die Idee generischer Befehlsmodifikatoren, sie könnten in anderen Golfsprachen nützlich sein.
ETHproductions
2
@ETHproductions Wenn Sie einen Namen brauchen, nenne ich sie Meta-Funktionen , wie sie Funktionen ändern
Luis Mendo
@ LuisMendo Ich denke, der formale Name wäre Operatoren , a la mathematische Operatoren (auch bekannt als Funktionen höherer Ordnung).
Mego
4

Vim, 7 Bytes

jDk@"|x

Wie es funktioniert:

Es erwartet zwei Zeilen; eins mit der Schnur und eins mit der Zahl.

  1. Gehen Sie zu Zeile zwei und kopieren Sie die Nummer in das Register
  2. Gehe in die erste Zeile und dann mit @ "| in die Spalte im Register
  3. Löschen Sie das Zeichen unter dem Cursor
jmriego
quelle
Eine andere lustige Lösung, die fast identisch ist, istjD@"gox
DJMcMayhem
Markieren -> Schließen -> Duplikat von codegolf.stackexchange.com/a/121581/61563 : P Scherz, aber sie sind bemerkenswert ähnlich.
MD XF
Sie sind! Gibt es einen Preis dafür, dass Sie zuerst 7 Charaktere haben? :-P
jmriego
4

Java 8, 39 Bytes

s->n->s.substring(0,n)+s.substring(n+1)

Probieren Sie es hier aus.

Java 7, 67 Bytes

String c(int n,String s){return s.substring(0,n)+s.substring(n+1);}

Probieren Sie es hier aus.

Kevin Cruijssen
quelle
Vorausgesetzt, es funktioniert, ein "eingebautes" für 46 Bytes, s->n->new StringBuilder(s).deleteCharAt(n)+"";obwohl es länger ist.
TheLethalCoder
@TheLethalCoder Es funktioniert in der Tat. Aber es ist in der Tat ein bisschen länger. Oh, und immer StringBufferanstelle von StringBuilderCodegolf verwenden. ;)
Kevin Cruijssen
Ah schöner Trick auf den Puffer, den ich in meiner Antwort verwendet habe :)
TheLethalCoder
4

Haskell , 15 Bytes

Dies erfordert den kürzlich veröffentlichten GHC 8.4.1 (oder höher). Nun <> , als eine Funktion in Semigroups, ist im Prelude. Es ist besonders nützlich für die Funktion Semigroup

take<>drop.succ

Probieren Sie es online!
Da tio eine ältere Version von GHC verwendet, habe ich <>in den Header importiert .

H.PWiz
quelle
4

R, 40 Bytes

Nur um die Vielfalt der Möglichkeiten zu zeigen, von denen keine besonders kompakt ist, kann man in R mit Streichern fummeln.

function(s,n)intToUtf8(utf8ToInt(s)[-n])
J.Doe
quelle
3

05AB1E , 5 Bytes

ā²ÊÏJ

Probieren Sie es online!

ā     # push range(1, len(input string) + 1)
 ²Ê   # Check each for != to input index
   Ï  # Keep characters from input where this array is 1
    J # Join
Riley
quelle
3

JS (ES6), 41 32 31 Bytes

y=>i=>y.slice(0,i++)+y.slice(i)

Basierend auf dieser . Übernimmt die Eingabe durch Curry, erstens String, zweitens Index.

-9 danke an @JohanKarlsson

-1 danke an @ETHproductions

programmer5000
quelle
3

Gelee , 3 Bytes

Ṭœp

Ein vollständiges Programm, das den (1-basierten) Index und die Zeichenfolge (in dieser Reihenfolge) verwendet und das Ergebnis druckt.

Als dyadische Funktion wird eine Liste der beiden Teile zurückgegeben.

Tatsächlich kann der Index eine Liste von n Indizes sein, in welchem ​​Fall er eine Liste der n-1 Teile zurückgibt .

Probieren Sie es online! oder sehen Sie sich eine Testsuite an .

Wie?

Ṭœp - Main link: number i, string s                   e.g. "fish 'n chips", 6
Ṭ   - untruth - get a list with 1s at the indexes of i      000001 <-- i.e. [0,0,0,0,0,1]
 œp - partition s at truthy indexes without borders       ["fish ","n chips"]
    - implicit print                                        fish n chips

Als Beispiel für die Verwendung mehrerer Indizes:

      "fish and chips", [6,8]
Ṭ      00000101 <- i.e. [0,0,0,0,0,1,0,1]
 œp  ["fish ","n"," chips"] 
       fish n chips
Jonathan Allan
quelle
3

vim, 10 7

DgJ@"|x

Nimmt 1-indizierte Eingaben im folgenden Format entgegen:

2
abcde
D      delete the number on the first line into register "
gJ     remove the newline while preserving whitespace on line 2
@"     run the " register as a macro - input is used as a count for...
|      the "go to nth column" command
x      delete the character at the cursor

Danke an @DJMcMayhem für 3 Bytes!

Türknauf
quelle
3

Java 8, 45 41 Bytes

s->n->new StringBuffer(s).deleteCharAt(n)

4 Bytes gespart dank @ OlivierGrégoire

Meine erste Code Golf Antwort in etwas anderem als C #, auch wenn es noch nicht die kürzeste für Java ist.

TheLethalCoder
quelle
1
1. Sie brauchen das Finale nicht ;in Lambda (-1 Byte). 2. In meinen Augen brauchen Sie a nicht zurückzugeben String. Ich denke, dass die Rückkehr StringBufferohne die +""vollkommen gültig wäre (-3 Bytes). Beispiel? BigIntegerist eine Darstellung eines unbegrenzten int, in diesem Fall StringBuffer/ StringBuildersind Darstellungen von veränderlichen Strings.
Olivier Grégoire
@ OlivierGrégoire Danke :) Ich habe noch nie Java verwendet, daher sind alle Verbesserungen willkommen
TheLethalCoder
2

Python 3 , 24 Bytes

lambda n,a:a[:n]+a[n+1:]

Probieren Sie es online!

Undichte Nonne
quelle
Verdammt, du hast mich geschlagen!
Notts90
1
Ich denke, dass dies auch für Python 2 gilt
Dead Possum
2

JavaScript (ES6), 39 34 33 Bytes

n=>s=>s.replace(/./g,c=>n--?c:"")
Zottelig
quelle
2

Brainfuck , 14 Bytes

,[>,.<-],,[.,]

Probieren Sie es online!

Liest einen nullbasierten Ein-Byte-Index, unmittelbar gefolgt von der Zeichenfolge.

eush77
quelle
Oh, du hast mich geschlagen: Ich hatte genau die gleiche Lösung. +1
daniero
2

PHP, 41 Bytes, 35 Bytes ohne PHP

<?php $argv[1][$argv[2]]='';echo$argv[1];

0-indiziert

TIO

MICH
quelle
Ich bin wirklich überrascht, dass dies funktioniert. Erstellt der [$argv[2]]Index implizit einen Bereich? Außerdem können Sie IIRC auslassen <?php , weil der PHP-Interpreter einen Modus hat, der ihn nicht benötigt, und weil wir normalerweise nicht für diese Art von Anzeige in einer Datei bestrafen, welche Sprache verwendet wird.
@ ais523 Grundsätzlich ja. From docs: "Auf Zeichen in Zeichenfolgen kann zugegriffen und geändert werden, indem der auf Null basierende Versatz des gewünschten Zeichens nach der Zeichenfolge in eckigen Klammern angegeben wird, wie in $ str [42]. Stellen Sie sich eine Zeichenfolge als Zeichenfolge vor Zweck." php.net/manual/en/language.types.string.php
ME
2

R, 48 47 Bytes

(1 Byte gespart durch Verwendung von el()Dank an Giuseppe)

function(s,n)cat(el(strsplit(s,""))[-n],sep="")

Teilen Sie die Zeichenfolge in einzelne Zeichen auf, entfernen Sie das n-te und verketten Sie es erneut.

Möglicherweise gibt es eine bessere Lösung: strsplit () ist recht unhandlich, da es eine Liste zurückgibt.

user2390246
quelle
Funktioniert nicht mit TIO: pryr::f([function body])Speichert ein paar Bytes und verwendet el(strsplit(s,""))ein Byte, funktioniert aber aus irgendeinem Grund auch nicht mit TIO.
Giuseppe
@ Giuseppe Danke! Ich würde mich ein bisschen dreckig fühlen, wenn ich pryr :: f benutze, da es sicherlich vorhergehen sollte, install.packages("pryr")aber vielleicht bin ich das, was ich zu kostbar finde !
user2390246
function(s,n)intToUtf8(utf8ToInt(s)[-n])für 40 Bytes.
J.Doe
@ J.Doe guter Ort! Das ist ein ganz anderer Ansatz, also sollten Sie ihn als Ihre eigene Antwort veröffentlichen.
user2390246
Ein weiteres Unter-47 ist function(s,n)sub(sub(0,n,"(.{0})."),"\\1",s)für 44.
J.Doe