지정된 색인에서 문자 제거


33

( 지정된 인덱스의 문자열 요소에서 크게 영감을 얻음 )

의 색인을 나타내는 문자열 s과 정수가 주어지면- 번째 위치 의 문자가 제거 된 상태로 출력 됩니다.nssn

0 인덱싱 및 1 인덱싱이 허용됩니다.

  • 0 인덱싱의 경우 n음이 아니고 길이보다 작습니다 s.
  • 1- 인덱싱의 n경우 양수이고 길이보다 작거나 같습니다 s.

s인쇄 가능한 ASCII 문자로만 구성됩니다 ( \x20-\x7E또는  통과 ~).

합리적인 입 / 출력이 허용됩니다. 표준 허점이 적용됩니다.

테스트 케이스 (0 인덱스) :

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

테스트 사례 (1 색인) :

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

이것은 이므로 바이트 단위의 최단 답변이 이깁니다.


9
아무도 다른 대답, C #을 :( 너무 늦게 ... 경력이 없다
TheLethalCoder

해당 idx의 문자가 한 번만 나타나는 것으로 가정 할 수 있습니까?
programmer5000

1
@ programmer5000 마지막 테스트 사례 3, 314151-> 31451. 나는 그렇지 않다고 가정합니다.
TheLethalCoder

@ programmer5000 아니요. 마지막 테스트 사례를 참조하십시오.
ETHproductions

2
리더 보드가 도움이 될 수 있습니다. 이미 검색 한 답변이 많이 있습니다.
Mr. Xcoder

답변:



13

Alice , 13 12 바이트

1 바이트를 절약 해 준 Leo에게 감사합니다.

/oI\!e]&
@ q

온라인으로 사용해보십시오!

입력의 첫 번째 줄은 문자열이고 두 번째 줄은 0 기반 인덱스입니다.

설명

/    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.


10

K (코나), 1 바이트

_

내장을 좋아해야합니다. 0 기반 인덱싱 용법:

k)"abcdef" _ 3
"abcef"

'작업에 적합한 도구 사용'에 대한 완전히 새로운 의미를 부여합니다.
MD XF

1
하-당신은 직업에 맞는 도구를보고 싶습니까? codegolf.stackexchange.com/a/121700/49493
Simon Major

더 짧은 프로그램 으로이 작업을 수행하는 방법을 발견했습니다. 불행히도, 이 코멘트 박스에는 ;-) 를 설명하기에 충분한 공간없습니다
Mawg

8

하스켈 , 28 24 바이트

Laikoni 덕분에 -4 바이트,이 버전은 1 인덱스입니다.

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

오래된 답변 :

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

값을 취하는 간단한 재귀 함수입니다. 인덱스는 0입니다.

내 첫 번째 코드 골프이므로 아마도 최적의 솔루션이 아닙니다. 오 잘


2
PPCG에 오신 것을 환영합니다!
마틴 엔더

1
또한 당신은 Haskell에서 골프 팁 수집에 관심이있을 수 있습니다 .
Laikoni

7

매스 매 티카, 18 바이트

1- 색인

#2~StringDrop~{#}&

입력

[1, "abcde"]

고마워 마틴 엔더


4
제 생각에는 "합리적인 입 / 출력이 허용됩니다"는 입력을 다음과 같이 취할 수있게 ["abcde", {1}]하는데,이 경우 StringDrop에만 트릭을 수행합니다. 어떻게 생각해? (당신은 명시 적으로 1 인덱스라고 언급하고 싶을 수도 있습니다.) 나는 항상 Mathematica 답변을 게시하는 사람들을 보게되어 기쁩니다 :)
Greg Martin



5

GCC c 기능, 25

1 기반 인덱싱.

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

여기에 정의되지 않은 동작이 많으므로 스트레이 벨로시 랩터를 조심 하십시오 .

  • strcpy()매뉴얼 페이지 말한다 복사 중복, 행동은 정의되지 않은 것을 객체 사이에 일어난 경우 . 여기에는 srcdest 문자열 이 겹치지 만 작동하는 것처럼 보이므로 glibc가 더 조심 스럽거나 운이 좋았습니다.
  • 대답은 s+=n전에 발생 한다는 사실에 의존 합니다 s-1. 표준은 그러한 보증을 제공하지 않으며, 실제로 정의되지 않은 동작으로이 아웃을 호출합니다. 다시 말하지만 x86_64 Linux의 gcc 컴파일러에서 필요에 따라 작동하는 것 같습니다.

온라인으로 사용해보십시오 .


2
x86과 같은 스택 기반 ABI에서 strcpy인수는 오른쪽에서 왼쪽으로 푸시해야합니다. 이는 동작을 설명하지만 x86_64레지스터를 사용 하는 것을 사용 한다고 말했을 것입니다. 어쩌면 컴파일러가 골프를 결정했습니다. 생성 된 코드와 컴퓨팅 s + = n이 먼저 골퍼라고 결정했습니다!
Neil

5
나는 C가 대답 할 때 그것을 좋아한다. "이것은 공식적인 이유는 없지만 어쨌든 그렇게한다."
Quentin

이런 세상에. 이것은 물에서 광산을 날려 버립니다. 매우 인상적!
MD XF

1
그 @Quentin에 대한 재미있는 것 중 하나의 코드 골프 - 심지어 장려 - - 당신은 수 있습니다 일반적으로 발사 범죄 ;-) 것이 가장 끔찍한, 안전하지 않은 코드 작성
디지털 외상

다운 보트의 이유를 알고 싶습니다.
Digital Trauma

4

MATL , 3 바이트

&)&

1 기반 인덱싱을 사용합니다.

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

설명

&    % 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

모든 테스트 사례가있는 수정 된 버전에서 코드는 `...T입력이 없을 때까지 무한 루프 내에 있습니다. 각 반복이 끝나면 표시 함수 ( XD)가 명시 적으로 호출되고 스택이 지워져 ( x) 다음 반복을 위해 준비됩니다.


나는 일반 명령 수정 자의 아이디어를 좋아합니다. 다른 골프 언어에서 유용 할 수 있습니다.
ETHproductions

2
@ETHproductions 만약 당신이 이름이 필요하다면, 나는 그것들 을 함수 를 수정할 때 메타 함수 라고 부른다
Luis Mendo

@LuisMendo 공식적인 이름은 operator , 수학 연산자 (일명 고차 함수) 일 것입니다.
Mego

4

Vim, 7 바이트

jDk@"|x

작동 방식 :

두 줄을 기대합니다. 하나는 문자열이고 다른 하나는 숫자입니다.

  1. 두 번째 줄로 이동하여 번호를 레지스터에 복사하십시오.
  2. 첫 번째 줄로 이동 한 다음 @ "|를 사용하여 레지스터의 열로 이동하십시오.
  3. 커서 아래 문자를 삭제

거의 동일한 또 다른 재미있는 솔루션은 다음과 같습니다.jD@"gox
DJMcMayhem

신고-> 마감-> codegolf.stackexchange.com/a/121581/61563 : P 농담의 복제 , 그러나 놀랍게도 비슷합니다.
MD XF

그들은! 7 자 이하로 먼저 내면 상이 있습니까? - P
jmriego

4

자바 8, 39 바이트

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

여기에서 시도하십시오.

자바 7, 67 바이트

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

여기에서 시도하십시오.


작동한다고 가정하면 46 바이트의 "내장" s->n->new StringBuilder(s).deleteCharAt(n)+""; 더 길지만 .
TheLethalCoder

@TheLethalCoder 실제로 작동합니다. 그러나 실제로 조금 더 길다. 아, 항상 codegolf StringBuffer대신에 사용 StringBuilder하십시오. ;)
Kevin Cruijssen

내가 :) 내 대답에 그것을 사용하는 버퍼에 아 좋은 트릭
TheLethalCoder


4

하스켈 , 15 바이트

이를 위해서는 최근에 출시 된 GHC 8.4.1 이상이 필요합니다. 이제 <> Semigroups의 기능으로 Prelude에 있습니다. Semigroup 기능에 특히 유용합니다

take<>drop.succ

온라인으로 사용해보십시오!
tio는 오래된 GHC를 사용하고 있기 때문에 <>헤더로 가져 왔습니다 .


4

R, 40 바이트

다양한 방법을 보여 주려고합니다. 특히 컴팩트하지는 않지만 R의 문자열로 바이올린을 칠 수는 없습니다.

function(s,n)intToUtf8(utf8ToInt(s)[-n])





3

JS (ES6), 41 32 31 바이트

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

이것을 기반으로 합니다 . 커링을 통해 입력을받습니다. 첫 번째는 문자열이고 두 번째는 인덱스입니다.

@JohanKarlsson 덕분에 -9

@ETHproductions 덕분에 -1


3

젤리 , 3 바이트

Ṭœp

(1 기반) 색인과 문자열 (순서대로)을 가져와 결과를 인쇄하는 전체 프로그램.

이진 함수로 두 부분의 목록을 반환합니다.

실제로 인덱스는 n 개의 인덱스 목록 일 수 있으며 ,이 경우 n-1 개의 파트 목록을 반환합니다 .

온라인으로 사용해보십시오! 또는 테스트 스위트를 참조하십시오.

방법?

Ṭœ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

여러 인덱스를 사용하는 예를 들면 다음과 같습니다.

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

3

정력, 10 7

DgJ@"|x

다음과 같은 형식으로 1 색인 입력을받습니다.

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

3 바이트를위한 @DJMcMayhem 에 감사 합니다!


3

자바 8, 45 41 바이트

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

@ OlivierGrégoire 덕분에 4 바이트 절약

내 첫 번째 코드 골프는 아직 Java에 대해 가장 짧지 않더라도 C # 이외의 것으로 대답합니다.


1
1. ;람다 (-1 바이트)로 된 파이널 은 필요하지 않습니다 . 2. 내 눈에는을 반환 할 필요가 없습니다 String. StringBuffer없이 반환하는 +""것이 완벽하게 유효 하다고 생각 합니다 (-3 바이트). 예? BigInteger는 제한되지 않은 표현이며 int,이 경우 StringBuffer/ StringBuilder변경 가능한 표현입니다 String.
Olivier Grégoire

@ OlivierGrégoire 고마워 :) 전에 실제로 Java를 사용해 본 적이 없으므로 모든 개선 사항을 환영합니다
TheLethalCoder


2

자바 스크립트 (ES6), 39 34 33 바이트

n=>s=>s.replace(/./g,c=>n--?c:"")
  • Arnauld 덕분에 5 6 바이트가 절약되었습니다 .



2

PHP, 41 바이트, 35 바이트 (? php 제외)

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

0 인덱스

TIO


실제로이 작업이 정말 놀랍습니다. 는 IS [$argv[2]]지수는 암시 적 범위를 만드는? 또한 IIRC를 사용 <?php 하면 PHP 인터프리터가 필요하지 않은 모드를 가지고 있기 때문에 언어가 무엇인지에 대한 파일에서 일반적으로 그러한 종류의 표시를 불이익을받지 않기 때문에 해제 할 수 있습니다.

@ ais523 기본적으로 그렇습니다. docs : "문자열 내의 문자는 $ str [42]와 같이 정사각형 배열 괄호를 사용하여 문자열 뒤에 원하는 문자의 0부터 시작하는 오프셋을 지정하여 액세스하고 수정할 수 있습니다. 문자열을 이에 대한 문자 배열로 생각하십시오. 목적." php.net/manual/en/language.types.string.php
ME


2

R, 48 47 바이트

( el()주세페 덕분에 1 바이트 절약 )

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

문자열을 개별 문자로 나누고 n 번째를 제거한 다음 다시 연결하십시오.

더 나은 해결책이있을 수 있습니다. strsplit ()은 목록을 반환하므로 다루기 어렵습니다.


TIO에서는 작동하지 않습니다 pryr::f([function body]). 몇 바이트를 el(strsplit(s,""))절약하고 바이트 를 절약 하여 사용 하지만 어떤 이유로 TIO에서도 작동하지 않습니다.
주세페

@Giuseppe 감사합니다! pryr :: f를 사용하면 약간 더러워 질 것입니다. 왜냐하면 그것은 반드시 앞에 와야 install.packages("pryr")하지만 어쩌면 그것은 너무 귀중합니다!
user2390246 18시 42 분

function(s,n)intToUtf8(utf8ToInt(s)[-n])40 바이트
J.Doe

@ J.Doe 좋은 자리! 그것은 매우 다른 접근 방식이므로 자신의 답변으로 게시해야합니다.
user2390246

또 다른 하위 47은 function(s,n)sub(sub(0,n,"(.{0})."),"\\1",s)44입니다.
J.Doe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.