문자열의 모든 숫자를 곱하십시오


19

수상자 : Chilemagic , 대규모 21 바이트!

답변을 계속 제출할 수 있지만 더 이상 이길 수 없습니다. 원본 게시물 유지 :


당신의 목표는 문자열에서 모든 숫자를 찾아 각 숫자에 사용자가 입력 한 값을 곱하는 것입니다

  • 소수에 대해 걱정할 필요가 없습니다.
  • 사용자는 숫자와 문자열을 입력합니다
  • 사용자는 어떤 시점에서 숫자와 문자열을 입력해야 하지만 프로그램에서 읽는 방법은 중요하지 않습니다. stdin을 사용하거나 텍스트 파일을 읽는 등의 작업을 수행 할 수 있지만 사용자는 일정 시점에서 키보드의 9 버튼을 눌러야합니다
  • 컴파일하고 실행할 수있는 모든 것이 허용됩니다.

예:

문장 입력 :이 1 is22a 3352 문장 50

숫자 입력 : 3

출력 :이 3 is66a 10056 문장 150


  • 이 콘테스트는 2014 년 9 월 6 일에 게시됩니다 (게시 후 7 일).
  • 이것은 이므로 가장 짧은 코드가 승리합니다.

임의의 숫자를 곱해야합니다. 예를 업데이트했습니다.
Jon

난 당신의 도전에서 "9 버튼을 누르십시오"의 중요성 또는 사용을 이해하지 못합니다. 주어진 예제에서 어떻게 또는 어디에 적용됩니까?
대런 스톤

3
@ 대런 그는 기본적으로 숫자를 하드 코딩 할 수 없다고 말합니다.
Beta Decay

2
관련된 숫자의 크기, 특히 오버플로 가능성에 대해 가정 할 수 있습니까? 위의 결과에 따라 "-1234"를 "-"로 처리 한 다음 1234 또는 -1234로 처리합니까?
Alchymist

1
@IlmariKaronen의 질문에 추가하려면 : "Bond is agent 007"-> "Bond is agent 21"또는 "Bond is agent 0021"또는 "Bond is agent 021"에서 와 같이 선행 0으로 수행 할 작업 또는 ...?
Hagen von Eitzen

답변:


24

업데이트-Perl-17

s/\d+/$&*$^I/ge

15 자 + 2 개 -i-p플래그

-i플래그를 사용하여 파일 확장명을 입력 할 수 있지만 파일을 읽지 않으므로 숫자를 가져와 변수에 $^I할당 할 수 있습니다.

로 실행 :

perl -e'print"This 1 is22a 3352sentence 50"' | perl -i3 -pe's/\d+/$&*$^I/ge'

펄-21

@Dennis의 의견에 따라 업데이트되었습니다.

$n=<>;s/\d+/$&*$n/ge

-p플래그로 실행하십시오 .

예제 실행 :

perl -e'print"This 1 is22a 3352sentence 50\n3"' | perl -pe'$n=<>;s/\d+/$&*$n/ge'

설명:

$n=<>; 숫자를 읽다

-p 출력을 인쇄합니다

s/\d+/$&*$n/ge<>로 입력을 읽고 하나 이상의 숫자를 검색하고 숫자와 숫자의 숫자로 바꾸십시오. g전역, e이다 eval의 S ///의 교체 물약. $&일치하는 항목을 포함하고 숫자에 곱합니다 $n.

당신은 더 약 읽을 수 s///있는 perlop 더 펄에서 정규 표현식에 대한 perlre .

다른 해결책 :

@ F.Hauri는 s 스위치 를 사용하여 $n변수를 4 에 할당 할 수 있다고 지적했습니다. 이 문자의 수는 확실하지 않지만 여기에 남겨 두겠습니다.

perl -spe 's/\d+/$&*$n/ge' -- -n=4 <<<'This 1 is22a 3352sentence 50'

<>=~대신을 사용하여 더 많은 문자를 저장할 수 있다고 생각합니다 _$=<>;. 또한 s초보자를 위해 정규식 의 일부가 무엇을 의미 하는지 설명해 주 시겠습니까?
Tal

@Tal 문자열입니다.
카즈 울프

3
나는 확신 @Mew는 "대체"에 대한의
마틴 청산

1
당신이 사용하는 경우 (1) $&대신에 $1, 당신은 줄일 수 있습니다 (\d)\d. 2. -p스위치 를 사용하고 입력 순서를 변경하면 say<>=~및 을 삭제할 수 있습니다 r.
Dennis

1
당신은 사용할 수 있습니다 -swhipe로 전환 한 $n=<>아웃 : perl -spe 's/\d+/$&*$n/ge' -- -n=4 <<<'This 1 is22a 3352sentence 50'(렌더링 않습니다 This 4 is88a 13408sentence 200)
F. 하우리

9

자바 스크립트 (ES6) -48 44 자

하나의 문자를 저장 한 @bebe 에게 감사합니다 . 업데이트 : 8 / Mar / 16, 다른 네 문자 제거

b=(p=prompt)();p(p().replace(/\d+/g,y=>y*b))

언 골프 :

var sentence = prompt(),
    num = parseInt(prompt(), 10); // base 10

sentence = sentence.replace(/\d+/g, digit => digit * num);

alert(sentence);

43 자

(p=prompt)(p(b=p()).replace(/\d+/g,y=>y*b))

b=(p=prompt)();p(p().replace(/\d+/g,y=>y*b))

먼저 숫자를 입력 한 다음 문장이 필요합니다. @bebe에게 다시 한번 감사드립니다.


숫자 입력을 파싱 할 필요가 없습니다.
be be

@bebe 물론입니다! 나는 몰랐다! 고마워요!
Gaurang Tandon

(p=prompt)(p(b=p()).replace(/\d+/g,y=>y*b))다른 하나 (그러나 이것은 먼저 승수를 요구합니다)
bebe

@bebe 감사합니다!
Gaurang Tandon

6

파이썬 2 (79)

import re
n=input()
s=input()
print re.sub('\d+',lambda x:`int(x.group())*n`,s)

샘플 런

입력:
$ python mult.py
3
"This 1 is22a 3352sentence 50"
산출:
This 3 is66a 10056sentence 150

온라인 데모 : http://ideone.com/V6jpyQ


훌륭한. I 추측은 re.sub베타 붕괴와 I (다른 두 파이썬 제출)을 다시 구현할하려고 한 방법이다. 너무 쉬웠을 텐데 ... 내가 배운 다른 것! ;)
Falko

@Falko re.sub, 당신은 문자열 교체 논리를 골프에서 훌륭한 일을했습니다
Cristian Lupascu

@Falko 동의합니다. re.sub정확히 내가 원하는 것입니다!
Beta Decay

4

파이썬 2-126

import re
n=input()
s=input()
for i in list(re.finditer('\d+',s))[::-1]:s=s[:i.start()]+`int(i.group())*n`+s[i.end():]
print s

먼저 입력 : 정수 n.

두 번째 입력 : 문자열 s(예 : 따옴표 "abc42")


4

CJam, 47 33 30 바이트

q_A,sNerN%\[_A,s-Ner~](f*]zs1>

STDIN에서 숫자와 문자열 (순서대로 구분하고 단일 공백으로 구분)을 읽습니다.

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

예제 실행

$ cjam multiply.cjam <<< '7 N0 R3GUL4R 3XPR35510N5 1N CJ4M M4K3 M3 4 54D P4ND4'
N0 R21GUL28R 21XPR248570N35 7N CJ28M M28K21 M21 28 378D P28ND28

작동 원리

q                                 " Read from STDIN (“Q”) and push a second copy.         ";
  A,s                             " Push “0123456789” (thanks, @aditsu).                  ";
 _   NerN%                        " Replace digits with linefeeds and split at linefeeds. ";
          \ _A,s-Ner              " Replace non-digits with linefeeds.                    ";
                    ~             " Evaluate the resulting string.                        ";
           [         ]            " Collect the results in an array.                      ";
                      (f*         " Multiply all other integers by the first.             ";
                         ]z       " Interleave the elements of both arrays.               ";
                           s1>    " Flatten the result and discard the leading space.     ";

이것은 지금까지 가장 이상한 코드입니다 !!!
azerafati

1
@ Blulua : 이것은 내가 작성한 가장 이상한 코드 조차 아닙니다 . : P
Dennis

흠, 3 * 7 = 27?
aditsu

롤, 예, 둘 다 투표했습니다. 이것들은 세상을 더 나은 곳으로 만들지 않을 것입니다. 어떻게 읽을 수있는 지구 프로그래밍 언어가 이것으로 바뀌었을까요?
azerafati

@aditsu : 분할 대 반복, 전투는 계속됩니다. : P
Dennis

4

Bash + coreutils, 38 바이트

eval echo `sed "s/[0-9]\+/$\[$1*&]/g"`

STDIN 및 승수에서 입력 문자열을 명령 행 매개 변수로 읽습니다.

산출:

$ ./multstr.sh 3 <<< "This 1 is22a 3352sentence 50"
This 3 is66a 10056sentence 150
$ 

6
흥미로운 아이디어이지만 문자열에 Bash에 특수한 문자가 포함되어 있지 않은 경우에만 작동합니다. 이것은 시도 하지 않을 문자열의 예입니다 .1 D4R3 Y0U: ; rm -rf /
Dennis

@Dennis 네, 그것은 다소 불행한 경고입니다
Digital Trauma

3

LINQPad의 C #, 124

똑바로. LINQPad에서 CTRL + 2 를 사용하십시오 (언어 : C # 문).

var s=Console.ReadLine();var k=int.Parse(Console.ReadLine());new Regex("\\d+").Replace(s,t=>""+int.Parse(t.Value)*k).Dump();

승수가 첫 번째 입력 매개 변수로 제공되면 116 자로 수행 할 수 있습니다.

var k=int.Parse(Console.ReadLine());new Regex("\\d+").Replace(Console.ReadLine(),t=>""+int.Parse(t.Value)*k).Dump();

편집하다:

아래 Abbas의 의견 덕분에 Regex 정적 메소드 를 인스턴스화하지 않고 사용하여 골프를 더 많이 할 수도 있습니다 .

var k=int.Parse(Console.ReadLine());Regex.Replace(Console.ReadLine(),"\\d+",t=>""+int‌​.Parse(t.Value)*k).Dump();

C #의 코드 골프는 쉽지 않습니다! 귀하의 노력에 대해 답변을 받고 싶지 않으므로 내 답변을 게시하는 대신 팁을 제공합니다. 새로운 Regex ( "...") 대신 정적 Regex.Replace (string, string, string) 사용 .바꾸다(...); 짧은 승수-첫 번째 버전은 다음과 같습니다 var k=int.Parse(Console.ReadLine());Regex.Replace(Console.ReadLine(),"\\d+",t=>""+int.Parse(t.Value)*k).Dump();. 두 버전 모두 5 개의 문자를 절약하여 긴 버전의 경우 119, 승수 첫 번째 버전의 경우 111을 얻습니다
Abbas

1
그러나 팁을 주셔서 감사합니다. 나는 C # Regex Golfing과 관련하여 다른 사람들이 나에게서 할 수없는 것과 당신에게서 할 수있는 것을 배울 수 있도록 원래의 대답을 변경하지 않기로 결정했습니다.
Jacob

나는 당신을 이해하지만 당신은 또한 당신의 답변에 편집 으로 내 팁을 추가 할 수 있습니다 . 사용자는 팁이있는 주석 목록보다 더 많이 읽는 경향이 있습니다.
Abbas

확실한. 답변이 수정되었습니다.
Jacob

2

코브라-171

use System.Text.RegularExpressions
class P
    def main
        a=int.parse(Console.readLine?'')
        print Regex.replace(Console.readLine,'\d+',do(m as Match)="[int.parse('[m]')*a]")

2

파이썬 3-141

더 이상 골프를 칠 수 없다고 생각합니다 ...

import re
n=input()
f=input()
o=''
p=0
for i in re.finditer('\d+',f):o+=f[p:i.start()]+str(int(i.group())*int(n));p=i.end()
o+=f[p:]
print(o)

예:

3     # This is input
h3110 # This is input
h9330 # This is output

10
hello100 hello100
hello1000 hello1000

2
불행히도이 방법은 효과가 없습니다. 첫 번째 숫자를 두 번 수정하기 때문에 for n=2s="1 2"yield 입니다. 그것은 내가 지금 파이썬 2에서 직면하고있는 것과 같은 문제입니다 ...;)4 4replace
Falko

@Falko 프로세스에서 코드를 더 길게 만들었지 만 문제를 해결할 수있었습니다.
Beta Decay

오 잘 했어! 몇 가지 사소한 말 : m=input()아무것도 아끼지 않습니다. 그리고 x=int2 바이트 이상 호출하는 것보다 실제로 int(...)두 번.
Falko

2

매스 매 티카 71 61

Martin Buttner 덕분에 10 개의 문자가 절약되었습니다.

코드의 공백은 가독성을위한 것입니다.

f된 함수 s입력 문자열이며 n의한 곱셈 검색된 문자열 숫자의 수이다.

 StringReplace[#, a : DigitCharacter .. :> ToString[#2 FromDigits@a]] &

 s="This 1 is22a 3352sentence 50"

정수

StringReplace[#, a : DigitCharacter .. :> ToString[#2 FromDigits@a]] &@@{s, 3}

"이 3 is66a 10056 문 150"


유리수

StringReplace[#, a : DigitCharacter .. :> ToString[#2 FromDigits@a]] &@@{s, -7.13}

"이 -7.13 is-156.86a -23899.8 문장 -356.5"


복소수

StringReplace[#, a : DigitCharacter .. :> ToString[#2 FromDigits@a]] &@@{s, -5 + 3 I}

"이 -5 + 3 I-110 + 66 Ia -16760 + 10056 Isentence -250 + 150 I"


1
나는 Mathematica를 모른다. 그러나 귀하의 예에서 모든 숫자와 단어는 공백으로 구분됩니다. "abc42"와 같이 문자에 직접 첨부 된 숫자에서도 작동합니까?
Falko

들어 StringReplace그 공간이 있는지 차이가 없습니다. Chiperyman이 처음 제공 한 예제를 사용했습니다.
DavidC

업데이트 된 예제로 전환했습니다. (나는 Chiperyman이 이전에 제시 한 예를 사용했습니다.) StringReplace공간이 있는지 여부는 차이가 없습니다.
DavidC


2

루아 : 73 69 자

r=io.read
s=r()n=r()s=s:gsub("%d+",function(m)return m*n end)print(s)

샘플 실행 :

bash-4.3$ lua -e 'r=io.read;s=r()n=r()s=s:gsub("%d+",function(m)return m*n end)print(s)' <<< $'This 1 is22a 3352sentence 50\n3'
This 3 is66a 10056sentence 150

1
모든 것을 한 줄에 배치하고 ")"옆에 지시 사항을 매끄럽게하여 골프를 조금 더 할 수 있습니다. "s = r () n = ()"과 같이 완벽합니다.
AndoDaan

1
Doh와 저는 불과 몇 주 전에 Lua에서 골프를위한 팁을 읽었습니다 . : (@ AndoDaan 감사합니다.
manatwork

2

자바 스크립트, ES6, 43 자

이것은 골프에 대한 나의 첫 번째 시도입니다!

(p=prompt)(p(n=p()).replace(/\d+/g,y=>y*n))

최신 Firefox 콘솔에서 실행하십시오. 첫 번째 입력은 숫자이고 두 번째 입력은 숫자에 첫 번째 입력 숫자를 곱한 문자열입니다.

마지막 프롬프트는 출력을 나열합니다.


첫 번째 타이머에 대한 아주 좋은 JS 골프!
Optimizer

숫자를 먼저 읽으면 다른 많은 답변이 더 짧을 수 있습니다. 훨씬 쉬웠습니다.
manatwork

@manatwork-예, 그러나 질문은 주문에 우선 순위를 두지 않으므로 괜찮을 것이라고 생각합니다.

옳은. 이것은 질문 자체의 부족입니다. 개인적으로 나는 답변에서 문자열 + 숫자 순서로 입력을 처리하여 다른 입력과 비교 가능하도록 선호했습니다.
manatwork

1

펄-48 자

$n=<>;print/\d/?$_*$n:$_ for(<>=~/(\d+)|(\D+)/g)

첫 번째 줄에서 숫자를 읽은 다음 문장을 읽고 숫자 또는 숫자가 아닌 덩어리로 나눕니다. 숫자가 아닌 숫자를 그대로 인쇄하면 숫자가 곱해집니다.


1

J-63 자

프로그램은 숫자를 읽은 다음 문장을 읽습니다.

;(*&.".&(1!:1]1)^:(0{i)(<@);.1~1,2~:/\i=.e.&'0123456789')1!:1]1

폭발로 설명 :

;(*&.".&(1!:1]1)^:(0{i)(<@);.1~1,2~:/\i=.e.&'0123456789')1!:1]1
                                                         1!:1]1  NB. read sentence
                                         e.&'0123456789'         NB. is digit? bool vector
                                      i=.                        NB. save to i
                                 2  /\                           NB. between adjacent chars:
                                  ~:                             NB.  true if not equal
                               1,                                NB. pad to sentence length
 (                         ;.1~                         )        NB. cut the sentence
                ^:(0{i)                                          NB. if cut is digits:
  *&.".                                                          NB.  multiply as number
       &(1!:1]1)                                                 NB.  with user input
;                                                                NB. rejoin sentence

J의 PCRE 라이브러리를 사용하여 문장을 먼저 만들면 이것을 54 자로 줄일 수 있습니다 .

;_2(,*&.".&(1!:1]1)&.>)/\'\d+'(rxmatches rxcut])1!:1]1

폭발로 설명 :

                                                1!:1]1  NB. read in sentence
                         '\d+'(rxmatches       )        NB. all /\d+/ matches
                              (          rxcut])        NB. cut by those matches
 _2                     \                               NB. on each nonmatch-match pair:
   (               &.>)/                                NB.  take the match
     *&.".                                              NB.  multiply as number
          &(1!:1]1)                                     NB.  by user input
   (,                 )                                 NB.  prepend nonmatch
;                                                       NB. rejoin sentence

J는 이것에 좋지 않습니다. J가 비관적이기 때문에 불편합니다.

몇 가지 예 :

   ;(*&.".&(1!:1]1)^:(0{i)(<@);.1~1,2~:/\i=.e.&'0123456789')1!:1]1
3
This 1 is22a 3352sentence 50
This 3 is66a 10056sentence 150
   ;(*&.".&(1!:1]1)^:(0{i)(<@);.1~1,2~:/\i=.e.&'0123456789')1!:1]1
100
N0 R3GUL4R 3XPR35510N5 1N J M4K35 M3 54D ALS0
N0 R300GUL400R 300XPR3551000N500 100N J M400K3500 M300 5400D ALS0
   0!:0 <'system\main\regex.ijs'  NB. this is usually preloaded by J on startup anyway
   ;_2(,*&.".&(1!:1]1)&.>)/\'\d+'(rxmatches rxcut])1!:1]1
TH4T'5 M4RG1N411Y B3TT3R
0
TH0T'0 M0RG0N0Y B0TT0R

1

CJam-35

li:X;lN+{_sA,s-,{])\_!!{iX*}*oo}*}/

http://cjam.aditsu.net/ 에서 시도 하십시오

샘플 입력 :

7
CJ4M W1LL H4V3 R3GUL4R 3XPR35510N5 L4T3R

샘플 출력 :

CJ28M W7LL H28V21 R21GUL28R 21XPR248570N35 L28T21R

설명:

프로그램은 각 문자를 거치면서 스택의 숫자를 수집하고 숫자가 아닌 각 숫자에 대해 먼저 숫자 입력과 곱한 숫자를 수집 한 다음 문자를 인쇄합니다.

li:X;X에서 숫자 입력 및 저장합니다 읽기
lN+문자열을 읽어 줄 바꿈 (이 뒤에 숫자에 도움) 추가
{…}/문자열의 각 문자에 대한
- _s복사 문자 및 문자열로 변환을
- A,s-,모든 숫자와 카운트 나머지 문자를 제거; 문자가 숫자 인 경우 결과는 0이거나 그렇지 않은 경우 1입니다
.- {…}*카운트가 1 인 경우 (즉, 숫자가 아닌) 블록을 실행합니다. 그들은 스택에 남아 있도록 숫자 것은, 아무것도하지 않는다
- ](즉, 문자열) 배열로 스택에서 문자를 수집; 문자는 이전의 반복에서 어떤 자리입니다, 게다가 현재의 문자
- )\마지막 항목 (현재의 문자)와 (나머지) 문자열 전에 이동을 분리
- _!!0 경우 1하지 않을 경우 빈 - 부울 값으로 복사 문자열 변환을
- {…}*문자열이 비어 있지 않은 경우 블록을 실행은, 즉, 우리는 현재의 숫자가 아닌 문자 전에 몇 가지 숫자를했다
--- iX*문자열로 변환 정수로 곱하고 X를 곱합니다
- o스택의 맨 위를 인쇄합니다-곱한 숫자 또는 숫자가없는 경우 빈 문자열
- o(두 번째)는 스택의 새 맨을 인쇄합니다-현재 아닌- 숫자 문자


훨씬 더 깔끔한 접근 방식입니다.
Dennis

1

하스켈 (161)

골프

main=do{n<-getLine;l<-getContents;let{g c(t,s)|c>'/'&&c<':'=(c:t,s)|t/=""=([],c:(show.(*(read n)).read$t)++s)|True=(t,c:s)};putStr.tail.snd.foldr g("","")$' ':l}

언 골프

modify :: (Show a, Read a) => (a -> a) -> String -> String
modify f = show . f . read

main=do
  number <- fmap read $ getLine    -- get number  
  l <- getContents                 -- get input

  -- if the current character is a digit, add it to the digits
  -- if the current character isn't a digit, and we have collected
  --    some digits, modify them and add them to the string
  -- otherwise add the current characters to the string

  let go current (digits , string) 
        | current `elem` ['0'..'9'] = (current : digits, string)
        | not (null digits)         = ([], current:(modify (*number) digits) ++ string)
        | otherwise                 = (digits, current:string)

  -- since the result of `go` is a pair, take the second value,
  -- remove the head (it's a space, in order to convert digits at the start)
  -- and print it
  putStr . tail . snd . foldr go ("","")$' ':l

불행히도 Haskell의 Prelude 에는 Regex 라이브러리가 없습니다 .


좋은 골프; {}1 문자의 이득을 위해 가장 바깥 쪽 을 삭제했을 수 있습니다 . 또한 방금이 Haskell 솔루션을 70 바이트로 게시했습니다 : codegolf.stackexchange.com/questions/37110/…
자랑스러운 haskeller

1

flex (-lexer) ( 94 89 자)

 int m;main(c,v)char**v;{m=atoi(*++v);yylex();}
%%
[0-9]+ {printf("%d",m*atoi(yytext));}

명령 줄 인수를 잊어 버린 경우 segfault가 아닌 언 골프 버전 :

%{
#define YY_DECL int y(int m)
%}
%option noyywrap noinput nounput
%%
[0-9]+ {printf("%d",m*atoi(yytext));}
%%
int main(int argc, char** argv) {
  return (argc > 1) ? y(atoi(argv[1])) : 1;
}

다음과 같이 컴파일하십시오.

flex -o m.c m.l
cc -o m m.c -lfl

또는:

flex --noyywrap -o m.c m.l
cc -o m m.c

예 :

$ ./m 163
This 1 is22a 3352sentence 50
This 163 is3586a 546376sentence 8150

1

Groovy -124

Scanner s=new Scanner(System.in)
def x=s.nextLine()
def n=s.nextInt()
x=x.replaceAll(/\d+/,{it->it.toInteger()*n})
println x

실행 가능한 예제를 보려면 제목을 클릭하십시오

시도한 예 :

이 1 is22a 3352 문장 50
3
이 3 is66a 10056 문장 150


이 1 is22a 3352 문장 50
42
이 42 is924a 140784 문장 2100


0

GNU Awk : 86 자

s{n=split(s RS,a,/[^0-9]+/,d);while(++i<n)printf"%s%s",a[i]==""?"":a[i]*$1,d[i]}{s=$0}

샘플 실행 :

bash-4.3$ awk 's{n=split(s RS,a,/[^0-9]+/,d);while(++i<n)printf"%s%s",a[i]==""?"":a[i]*$1,d[i]}{s=$0}' <<< $'This 1 is22a 3352sentence 50\n3'
This 3 is66a 10056sentence 150

0

PHP - 115분의 75 109분의 68

두 가지 버전, 최신 PHP 버전이이를 수행 할 수 있습니다.

echo preg_replace_callback("/\d+/",function($m){return$m[0]*$f;},$s);

이전 PHP 버전 : 개행을 세지 않았고 가독성을 추가했습니다.

function a($s){echo preg_replace_callback("/\d+/",b,$s);}
function b($i){global$f;return$i[0]*$f;}
a($s,$f);

입력 + 출력 예

$s = "ab11cd22"; // string
$f =  3; // -> output: ab36cd69
$f = -2; // -> output: ab-24cd-46

어려운 것은 'function'과 'preg_replace_callback'이라는 단어가 많은 문자를 차지한다는 것입니다.
후 공간 globalreturn달러 (A $)의 VAR (-2 문자) 다음 경우이 arent 필요


\d문자 클래스 (-2 문자) 를 넣을 필요가 없습니다 . 큰 따옴표 (-2 문자)로 함수를 묶을 필요가 없습니다. 세미콜론 (+1 문자)으로 함수 내에서 명령문을 올바르게 종료해야합니다. 그건 그렇고, \d큰 따옴표로 묶인 문자열은로 쓰여 져야 \\d하므로 따옴표를 작은 따옴표로 바꾸는 것이 좋습니다.
manatwork

감사. [0-9]로 시작 0-9하여 \ d로 변경되었습니다 . 함수 주위의 따옴표에 대해 확신이 없었기 때문에 로컬 PHP 버전에서 허용하지 않는 것을 테스트 할 수 없습니다.
Martijn

큰 따옴표는 (적어도 나를 위해) 잘 작동합니다 :)
Martijn

0

C ( 142134 자)

main(a,b)char**b;{char*c=b++[2],*d="0123456789";for(;*c;c+=strspn(c
,d))write(1,c,a=strcspn(c,d)),dprintf(1,"%d",atoi(*b)*atoi(c+=a));}

가독성을 높이기 위해 줄 바꿈을 삽입했습니다. 인자를 첫 번째로, 문자열을 두 번째 명령 행 옵션으로 전달하십시오. 이 구현에는 dprintfPOSIX.1 2008의 일부인 기능 이 필요하며 Windows에서는 사용하지 못할 수 있습니다. 축소되지 않은 출처는 다음과 같습니다.

/*
 * Multiply all numbers in a string by a number.
 * http://codegolf.stackexchange.com/q/37110/134
 * Solution by user FUZxxl
 */

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

extern int
main(int count, char **argv)
{
    char *str = argv++[2], *digits = "0123456789";

    while (*str) {          /* as long as we have not reached the end */
        count = strcspn(str, digits);
        write(1, str, count);

        dprintf(1, "%d", atoi(*argv) * atoi(str += count));
        str += strspn(str, digits);
    }
}

개량

  • 142 → 134 : 문자열을 반복하는 대신 strspnstrcspn을 사용하십시오 .

0

파이썬 89

import re,sys
j,n,s=sys.argv
print re.sub('(\d+)',lambda m:str(int(m.group())*int(n)),s)

예 :

# python numberstring.py 3 '1shoop da2 w007p!'
3shoop da6 w21p!

0

리볼-117

n: do input d: charset"0123456789"parse s: input[any[b: some d e:(e: insert b n * do take/part b e):e | skip]]print s


언 골프 드 :

n: do input 
d: charset "0123456789"

parse s: input [
    any [
        b: some d e: (e: insert b n * do take/part b e) :e
        | skip
    ]
]

print s

0

Clojure의 - 141 개 140 128 문자

저는 Clojure 초보자이지만 FWIW :

(let[[a b]*command-line-args*](println ((fn[s n](clojure.string/replace s #"\d+"#(str(*(read-string %)(read-string n)))))a b)))

샘플 실행 :

bash$ java -jar clojure-1.6.0.jar multstr.clj "This 1 is22a 3352sentence 50" 3  
This 3 is66a 10056sentence 150

Ungolfed (추악하지만 읽기가 다소 쉬움) :

(let [[a b] *command-line-args*]
    (println ( (fn [s n] 
                    (clojure.string/replace 
                        s 
                        #"\d+" 
                        #(str (* (read-string %) (read-string n)))))
                    a b)))

0

파이썬-142

import re
s=raw_input()
i=int(raw_input())
print ''.join([x[0]+str(int(x[1])*i) for x in filter(None,re.findall('(\D*)(\d*)',s)) if x[0]!=''])

0

자바 218

누군가 자바를해야했습니다. 입력 문자열은 명령 행에서 2 토큰입니다.

자바 M '이 1 is22a 3352 문장 50'3

public class M{
    public static void main(String[]a) {
        int m=new Integer(a[1]),n=0,b=0;
        String s="";
        for(char c:a[0].toCharArray()){
            if(c<48|c>57)s=b>(b=0)?s+m*n+c:s+c;
            else n=b*n+c-38-(b=10);
        }
        System.out.println(b>0?s+m*n:s);
    }
}

1
내 테스트에 따르면 if조건은 비트 단위로 |도 작동하며 1 문자가 짧습니다.
manatwork

감사. 코드가 업데이트되었습니다. (실제로 여전히 부울이거나 평가 바로 가기가 없습니다).
Florian F

0

두 가지 대답 : +

순수한 배쉬 (~ 262)

첫째, 너무 짧은 순수 bash 버전이 없습니다 (포크 없음, 외부 바이너리 없음)!

mn () { 
    if [[ $1 =~ ^(.*[^0-9]|)([0-9]+)([^0-9].*|)$ ]]; then
        local num=${BASH_REMATCH[2]} rhs="${BASH_REMATCH[3]}";
        mn "${BASH_REMATCH[1]}" ${2:-3} l;
        echo -n "$[num*${2:-3}]$rhs";
    else
        echo -n "$1";
    fi;
    [ "$3" ] || echo
}

보여 주자 :

mn "This 1 is22a 3352sentence 50" 42
This 42 is924a 140784sentence 2100

(완전히 불가능한 문장은 무엇입니까)

펄 리틀 난독 화 (재미 만)

이 버전 ( @Chilemagic의 답변을 기반으로 함 )은 더 짧지 않지만 토템 스크립트 로 설계되었습니다 .

cat <<eof >mn.pl

#!/usr/bin/perl          -sp
                      eval eval'"'
                      .('['^'(')
           .'/\\'.'\\'.('`'|'$').'+'.'/\\$\&'
                        .'*\\$'
                      .('`'|'.').'/'
                      .('`'|"'")
                      .('`'|'%').'"'

eof chmod +x mn.pl

샘플 실행 :

./mn.pl -n=2 <<<$'This 1 is22a 3352sentence 50\n21.'
This 2 is44a 6704sentence 100
42.

0

하스켈, 70

너무 나쁘다 나는 너무 늦었다 IMHO 이것은이 특정 질문과 언어에 아주 좋습니다. 다른 Haskell 솔루션은 161 자입니다.

[]%n=""
s%n=f s(reads s)n
f _((a,b):_)n=show(a*n)++b%n
f(x:s)_ n=x:s%n

이것은 reads부분적으로 문자열을 구문 분석하는 함수를 사용하여 작동합니다. 예를 들면 다음과 같습니다 reads "34abc" = [(34, "abc")]. 이것은 분명히이 도전에 완벽하게 만듭니다.

용법:

*Main> " This 1 is22a 3352sentence 50"%3
" This3 is66a10056sentence150"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.