Pomnóż wszystkie liczby w ciągu

19

Zwycięzca: Chilemagic , ogromne 21 bajtów!

Możesz kontynuować przesyłanie odpowiedzi, jednak nie możesz już wygrać. Zachowano oryginalny post:


Twoim celem jest znalezienie wszystkich liczb w ciągu i pomnożenie każdej z nich indywidualnie przez wartość wprowadzoną przez użytkownika

  • Nie będziesz musiał się martwić o ułamki dziesiętne
  • Użytkownik wprowadzi liczbę i ciąg znaków
  • Użytkownik musi w pewnym momencie wpisać liczbę i ciąg znaków, jednak metoda odczytana przez program nie ma znaczenia. Może to być standardowe wejście, czytanie pliku tekstowego itp., Jednak użytkownik musi w pewnym momencie nacisnąć przycisk 9 na klawiaturze (na przykład)
  • Wszystko, co można skompilować i uruchomić, jest dopuszczalne

Przykład:

Wprowadzanie zdań: To 1 to22a 3352 zdanie 50

Wprowadzanie liczb: 3

Wyjście: to 3 to 66a 10056odsetność 150


  • Konkurs kończy się 6 września 2014 r. (7 dni od opublikowania).
  • To jest , więc wygrywa najkrótszy kod
Jon
źródło
Dowolną liczbę należy pomnożyć. Zaktualizowałem mój przykład.
Jon
Nie rozumiem znaczenia ani użycia „naciśnij przycisk 9” w swoim wyzwaniu. Jak lub gdzie to ma zastosowanie w podanym przykładzie?
Darren Stone
3
@Darren Zasadniczo mówi, że nie można na stałe zakodować numeru.
Beta Decay
2
Czy możemy przyjąć założenia dotyczące wielkości zaangażowanych liczb, w szczególności możliwości przepełnienia? Czy w zależności od wyników powyższego traktujemy „-1234” jako „-”, a następnie 1234 lub jako -1234?
Alchymist
1
Aby dodać do pytania @ IlmariKaronen: Co zrobić z zerami wiodącymi, jak w „Bond jest agentem 007” -> „Bond jest agentem 21” lub „Bond jest agentem 0021” lub „Bond jest agentem 021” lub…?
Hagen von Eitzen,

Odpowiedzi:

24

Aktualizacja - Perl - 17

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

15 znaków + 2 dla -ii -pflagi.

Możemy użyć -iflagi do wprowadzenia rozszerzenia pliku, ale ponieważ nie czytamy żadnych plików, możemy go użyć, aby uzyskać numer, a zmienna $^Izostanie mu przypisana.

Biegnij z:

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

Perl - 21

Zaktualizowano zgodnie z komentarzem @ Dennisa.

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

Uruchom z -pflagą.

Przykładowy przebieg:

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

Wyjaśnienie:

$n=<>; przeczytaj numer

-p wypisuje dane wyjściowe

s/\d+/$&*$n/geOdczytaj dane wejściowe za pomocą <> i wyszukaj jedną lub więcej cyfr i zastąp je cyframi pomnożonymi przez liczbę. gjest globalny, ejest evalmiksturą zastępującą s ///. $&zawiera co zostało dopasowane i pomnożona przez liczbę, $n.

Możesz przeczytać więcej na temat s///w perlop więcej o Perl regexes w perlre .

Inne rozwiązanie:

@ F.Hauri wskazał, że możesz również użyć s przełącznika, aby przypisać $nzmienną do 4. Nie jestem pewien, ile znaków to liczy, ale zostawię ją tutaj:

perl -spe 's/\d+/$&*$n/ge' -- -n=4 <<<'This 1 is22a 3352sentence 50'
hmatt1
źródło
Myślę, że możesz uratować jeszcze kilka postaci, używając <>=~zamiast _$=<>;. Czy mógłbyś również wyjaśnić, co oznacza sczęść wyrażenia regularnego dla nas, nowicjuszy?
Tal
@Tal String.
Kaz Wolfe
3
@Mew Jestem pewien, że chodzi o „substytucję”
Martin Ender
1
1. Jeśli używasz $&zamiast $1, możesz skrócić (\d)do \d. 2. Jeśli użyjesz -pprzełącznika i zmienisz kolejność wprowadzania, możesz upuścić say<>=~i r.
Dennis
1
Możesz użyć -sprzycisku, aby whipe $n=<>się: perl -spe 's/\d+/$&*$n/ge' -- -n=4 <<<'This 1 is22a 3352sentence 50'(czynią: This 4 is88a 13408sentence 200)
F. Hauri
9

JavaScript (ES6) - 48 44 znaków

Dzięki @bebe za uratowanie jednej postaci. Aktualizacja: 8 / Mar / 16, usunęła kolejne cztery postacie

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

Nie golfowany :

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

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

alert(sentence);

43 znaki:

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

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

Wymaga podania liczby, a następnie zdania. Wytnij tutaj jeszcze jeden znak dzięki dzięki @bebe!

Gaurang Tandon
źródło
nie trzeba analizować wprowadzanego numeru
bebe
@bebe Oczywiście! Nie zauważyłem! Wielkie dzięki!
Gaurang Tandon
(p=prompt)(p(b=p()).replace(/\d+/g,y=>y*b))inny (ale najpierw prosi o mnożnik)
bebe
@bebe Też za to dziękuję!
Gaurang Tandon
6

Python 2 (79)

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

Przykładowy przebieg

Wejście:
$ python mult.py
3
"This 1 is22a 3352sentence 50"
Wynik:
This 3 is66a 10056sentence 150

Demo online: http://ideone.com/V6jpyQ

Cristian Lupascu
źródło
Znakomity. Sądzę, że re.submetoda Beta Decay i ja (pozostałe dwa zgłoszenia w języku Python) próbowaliśmy ponownie wdrożyć. Byłoby to takie proste ... Czegoś innego się nauczyłem! ;)
Falko,
@Falko na re.subbok, wykonałeś świetną robotę w grze w golfa w logice zastąpienia łańcucha
Cristian Lupascu
@ Falko Zgadzam się, re.subwłaśnie tego chciałem!
Beta Decay
4

Python 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

Pierwsze wejście: liczba całkowita n.

Drugie wejście: ciąg znaków s(np "abc42". Ze znakami cudzysłowu ).

Falko
źródło
4

CJam, 47 33 30 bajtów

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

Odczytuje liczbę i ciąg (w tej kolejności i oddzielone pojedynczym odstępem) od STDIN.

Wypróbuj online.

Przykładowy przebieg

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

Jak to działa

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.     ";
Dennis
źródło
To najdziwniejszy kawałek kodu w historii !!!
azerafati
1
@Bludream: To nie jest nawet najdziwniejszy kod, który napisałem . : P
Dennis
Hmm, 3 * 7 = 27?
aditsu
lol, tak głosował na oba. Chociaż nie uczynią one świata lepszym miejscem. W jaki sposób, na ziemi, języki programowania, które powinny być czytelne, zmieniły się w to?
azerafati,
@aditsu: Podział kontra iteracja, bitwa trwa. : P
Dennis
4

Bash + coreutils, 38 bajtów

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

Odczytuje ciąg wejściowy ze STDIN i mnożnika jako parametr wiersza poleceń.

Wynik:

$ ./multstr.sh 3 <<< "This 1 is22a 3352sentence 50"
This 3 is66a 10056sentence 150
$ 
Cyfrowa trauma
źródło
6
Ciekawy pomysł, ale zadziała to tylko wtedy, gdy ciąg nie zawiera znaków specjalnych dla Bash ... To jest przykład ciągu, którego nie spróbowałbym:1 D4R3 Y0U: ; rm -rf /
Dennis
@Dennis tak, to raczej niefortunne zastrzeżenie
Digital Trauma
3

C # w LINQPad, 124

Bezpośredni. Proszę użyć CTRL + 2 w LINQPad (Język: Instrukcje C #).

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

Jeśli jako pierwszy parametr wejściowy podano mnożnik, można to zrobić za pomocą 116 znaków:

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

EDYTOWAĆ:

Dzięki poniższemu komentarzowi Abbasa można go jeszcze bardziej pograć w golfa za pomocą statycznej metody Regex , zamiast tworzyć jej instancję:

var k=int.Parse(Console.ReadLine());Regex.Replace(Console.ReadLine(),"\\d+",t=>""+int‌​.Parse(t.Value)*k).Dump();
Jakub
źródło
Fajny, golf w C # nie jest łatwy! Nie chcę uzyskiwać odpowiedzi od twojego wysiłku, więc dam ci wskazówkę zamiast publikować własną odpowiedź: użyj statycznego Regex.Replace (ciąg, ciąg, ciąg) zamiast nowego Regex („...”) .Zastąpić(...); Oto krótka wersja mnożnik pierwszego: var k=int.Parse(Console.ReadLine());Regex.Replace(Console.ReadLine(),"\\d+",t=>""+int.Parse(t.Value)*k).Dump();. W obu wersjach zapisuje to kolejne 5 znaków, co daje 119 na dłuższą wersję i 111 na pierwszą wersję z mnożnikiem
Abbas
1
Dzięki za wskazówkę postanowiłem jednak nie zmieniać mojej oryginalnej odpowiedzi, aby inni mogli dowiedzieć się ode mnie, a co od ciebie - dotyczących golfa C # Regex.
Jacob
Rozumiem cię, ale możesz również dodać moją wskazówkę w odpowiedzi jako edycję . Użytkownicy zwykle czytają to częściej niż listę komentarzy z poradami.
Abbas
Pewnie. Odpowiedź została zredagowana.
Jacob
2

Kobra - 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]")
Obrzydliwe
źródło
2

Python 3-141

Nie sądzę, żebym mógł już grać w golfa ...

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)

Przykład:

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

10
hello100 hello100
hello1000 hello1000
Rozpad beta
źródło
2
Niestety takie podejście nie działa. For n=2i s="1 2"daje 4 4, ponieważ replacedwukrotnie modyfikuje pierwszą liczbę. Z tym samym problemem mam teraz do czynienia w Pythonie 2 ...;)
Falko,
@Falko Udało mi się rozwiązać problem, chociaż wydłużam ten proces
Beta Decay
Dobra robota! Kilka drobnych uwag: m=input()nic cię nie oszczędza. I x=intfaktycznie jest o 2 bajty dłuższy niż int(...)dwukrotne wywołanie .
Falko
2

Mathematica 71 61

Z 10 znakami zapisanymi dzięki Martinowi Buttnerowi.

Odstępy w kodzie służą do odczytu.

fto funkcja, w której sjest ciąg wejściowy i nliczba, przez którą należy pomnożyć odkryte liczby ciągów.

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

Przykłady

 s="This 1 is22a 3352sentence 50"

Liczba całkowita

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

„This 3 is66a 10056sentence 150”


Liczba wymierna

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

„To -7,13 to-156,86a -23899,8-obecność -356,5”


Liczba zespolona

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

„To -5 + 3 I to-110 + 66 Ia -16760 + 10056 Isentence -250 + 150 I”

DavidC
źródło
1
Nie znam Mathematiki. Ale w twoich przykładach wszystkie liczby i słowa są oddzielone spacjami. Czy działa również z cyframi bezpośrednio dołączonymi do liter, np. „Abc42”?
Falko
Dla StringReplaceniego nie ma znaczenia, czy znajdują się miejsca. Użyłem przykładów podanych pierwotnie przez Chiperyman.
DavidC
Przełączyłem się na zaktualizowany przykład. (Użyłem przykładu podanego wcześniej przez Chiperymana). StringReplaceNie ma znaczenia, czy są spacje.
DavidC
2

Rubin 40

a,b=$*
p a.gsub(/\d+/){|s|s.to_i*b.to_i}

Dane wejściowe ze standardowego wejścia.

Przykładowy przebieg:

$ ruby mult.rb "This 1 is22a 3352sentence 50" 3 
"This 3 is66a 10056sentence 150"

Demo online: http://ideone.com/4BiHC8

Cristian Lupascu
źródło
2

Lua: 73 69 znaków

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

Przykładowy przebieg:

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
człowiek w pracy
źródło
1
Możesz zagrać w golfa trochę więcej, umieszczając wszystko w jednym wierszu i umieszczając instrukcje obok „)”. Na przykład „s = r () n = ()” jest w porządku.
AndoDaan
1
Doh i kilka tygodni temu przeczytałem Wskazówki dotyczące gry w golfa w Lua . :( Dziękuję, @AndoDaan.
manatwork
2

JavaScript, ES6, 43 znaki

To moja pierwsza próba gry w golfa!

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

Uruchom to w najnowszej konsoli Firefox. Pierwsze wejście to liczba, a drugie wejście to ciąg, z którego liczby należy pomnożyć przez pierwszy numer wejścia.

Ostatni monit wyświetla dane wyjściowe.


źródło
Całkiem niezły JS Golf po raz pierwszy!
Optymalizator
Wiele innych odpowiedzi może być krótszych, jeśli numer zostanie odczytany jako pierwszy. To było o wiele łatwiejsze.
manatwork
@manatwork - Tak, ale pytanie nie daje żadnej preferencji co do kolejności, więc myślę, że powinno być w porządku.
Poprawny. To jest brak samego pytania. Osobiście wolałem obsługiwać dane wejściowe w kolejności ciąg + liczba w moich odpowiedziach, aby były porównywalne z innymi.
manatwork
1

Perl - 48 znaków

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

Przeczytaj cyfrę w pierwszym wierszu, a następnie przeczytaj zdanie i podziel je na części z cyfr lub bez cyfr. Wydrukuj cyfry bez zmian, a liczby zostaną pomnożone.

Tal
źródło
1

J - 63 znak

Program wczytuje liczbę, a następnie zdanie.

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

Wyjaśnione przez wybuch:

;(*&.".&(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

Jeśli skorzystamy z biblioteki PCRE J. i sprawimy, że zdanie będzie najważniejsze, możemy zmniejszyć liczbę znaków do 54 :

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

Wyjaśnione przez wybuch:

                                                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 jest w tym zły, co mogę powiedzieć. Jest to niewygodne, ponieważ J. jest taki nieimperatywny.

Kilka przykładów:

   ;(*&.".&(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
algorytmshark
źródło
1

CJam - 35

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

Wypróbuj na http://cjam.aditsu.net/

Przykładowe dane wejściowe:

7
CJ4M W1LL H4V3 R3GUL4R 3XPR35510N5 L4T3R

Przykładowe dane wyjściowe:

CJ28M W7LL H28V21 R21GUL28R 21XPR248570N35 L28T21R

Wyjaśnienie:

Program przechodzi przez każdy znak, zbierając cyfry na stosie, i dla każdej cyfry najpierw drukuje zebraną liczbę (jeśli istnieje) pomnożoną przez wejście numeryczne, a następnie drukuje znak.

li:X;odczytuje wejście numeryczne i zapisuje je w X
lN+odczytuje ciąg i dołącza nowy wiersz (pomaga w końcowych liczbach)
{…}/dla każdego znaku w ciągu
- _skopiuje znak i konwertuje na ciąg
- A,s-,usuwa wszystkie cyfry i zlicza pozostałe znaki; wynik będzie wynosił 0, jeśli znak był cyfrą lub 1, jeśli nie
- {…}*wykonuje blok, jeśli liczba wynosiła 1 (tj. nie cyfra); dla cyfr nic nie robi, więc pozostają na stosie
- ]zbiera znaki ze stosu do tablicy (tzn. łańcucha); znaki to dowolne cyfry z poprzednich iteracji plus bieżący znak
- )\oddziela ostatni element (aktualny znak) i przenosi go przed (pozostałym) ciągiem
- _!!kopiuje ciąg i konwertuje go na wartość logiczną - 0 jeśli pusty, 1 jeśli nie
- {…}*wykonuje blok, jeśli ciąg nie był pusty, tzn. mieliśmy kilka cyfr przed bieżącym znakiem innym niż cyfra
--- iX*konwertuje ciąg na liczbę całkowitą i mnoży przez X
- odrukuje górę stosu - pomnożoną liczbę lub pusty ciąg, jeśli nie mamy liczby
- o(drugi) drukuje nową górę stosu - bieżący non- znak cyfrowy

aditsu
źródło
To bardzo rozsądne podejście.
Dennis
1

Haskell (161)

Grał w golfa

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}

Nie golfił

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

Niestety, Haskell nie ma biblioteki Regex w swoim Preludium .

Zeta
źródło
fajna gra w golfa; mogłeś usunąć skrajne, {}aby zyskać 1 znak. też właśnie opublikowałem to rozwiązanie Haskell z 70 bajtami: codegolf.stackexchange.com/questions/37110/…
dumny haskeller
1

flex (-lekser) ( 94 89 znaków)

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

Wersja bez golfa, która nie segfaga, jeśli zapomnisz argumentu wiersza poleceń (niewiele dłużej):

%{
#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;
}

Połącz z:

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

lub:

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

Na przykład:

$ ./m 163
This 1 is22a 3352sentence 50
This 163 is3586a 546376sentence 8150
rici
źródło
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

Kliknij tytuł, aby zobaczyć wykonalny przykład

Przykłady Wypróbowane:

To 1 is22a 3352sentence 50
3
To 3 is66a 10056sentence 150


To 1 is22a 3352sentence 50
42
To 42 is924a 140784sentence 2100

Małe dziecko
źródło
0

GNU Awk: 86 znaków

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

Przykładowy przebieg:

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
człowiek w pracy
źródło
0

PHP - 75/115 68/109

Dwie wersje, nowsze wersje php mogą to zrobić:

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

Starsze wersje php: nie policzyłem nowego wiersza, dodałem te dla czytelności.

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

Przykładowe wejście + wyjście

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

Trochę trudne, słowa „funkcja” i „preg_replace_callback” zajmują wiele znaków.
Spacja po globali returnnie są potrzebne, jeśli po niej następuje $ var (-2 znaki)

Martijn
źródło
Nie trzeba wstawiać \dklasy postaci (-2 znaki); nie ma potrzeby ujmowania funkcji w podwójne cudzysłowy (-2 znaki); musisz poprawnie zakończyć instrukcję wewnątrz funkcji średnikiem (+1 znak). Nawiasem mówiąc, \dw cudzysłowie należy napisać jako \\d, więc lepiej zmień cudzysłowy na pojedyncze.
manatwork
Dzięki. Zaczęło się od [0–9], zmieniono 0-9na \ d. Nie byłem pewien co do cytatów wokół funkcji, nie mogę tego przetestować, moja lokalna wersja php na to nie pozwala.
Martijn
Podwójne cytaty działają dobrze (przynajmniej dla mnie) :)
Martijn
0

C ( 142 134 znaków)

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));}

Dodano nową linię dla lepszej czytelności. Przekaż czynnik jako pierwszy, łańcuch jako drugą opcję wiersza poleceń. Ta implementacja wymaga dprintffunkcji, która jest częścią POSIX.1 2008 i może nie być dostępna w systemie Windows. Oto niezminimalizowane źródło:

/*
 * 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);
    }
}

Ulepszenia

  • 142 → 134: Użyj strspni strcspnzamiast zapętlać ciąg.
FUZxxl
źródło
0

Python 89

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

na przykład:

# python numberstring.py 3 '1shoop da2 w007p!'
3shoop da6 w21p!
Sammitch
źródło
0

Rebol - 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


Nie golfowany:

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
draegtun
źródło
0

Clojure - 141 140 128 znaków

Jestem początkującym Clojure, ale FWIW:

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

Przykładowy przebieg:

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

Nie golfista (brzydki, ale mam nadzieję, że nieco łatwiejszy do odczytania):

(let [[a b] *command-line-args*]
    (println ( (fn [s n] 
                    (clojure.string/replace 
                        s 
                        #"\d+" 
                        #(str (* (read-string %) (read-string n)))))
                    a b)))
Michael Easter
źródło
0

Python - 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]!=''])
Xirion11
źródło
0

Java 218

Ktoś musiał zrobić java. Ciąg wejściowy to 2 tokeny w wierszu poleceń.

java M 'This 1 is22a 3352sentence 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);
    }
}
Florian F.
źródło
1
Według mojego testu ifwarunek działa |również bitowo , czyli o 1 znak krótszy.
manatwork
Dzięki. Kod zaktualizowany. (W rzeczywistości jest to wciąż wartość logiczna lub po prostu bez skrótu do oceny).
Florian F
0

Dwie odpowiedzi: +

Pure Bash (~ 262)

Po pierwsze, istnieje niezbyt krótka wersja czysto bashowa (bez rozwidlenia, bez zewnętrznych plików binarnych)!

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
}

Pokażmy:

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

(Które zdanie jest całkowicie nieprawdopodobne)

Perl trochę zaciemniony (tylko dla zabawy)

Ta wersja (oparta na odpowiedzi @ Chilemagic ) nie jest krótsza, ale została zaprojektowana jako skrypt totemowy :

cat <<eof >mn.pl

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

eof chmod +x mn.pl

Przykładowy przebieg:

./mn.pl -n=2 <<<$'This 1 is22a 3352sentence 50\n21.'
This 2 is44a 6704sentence 100
42.
F. Hauri
źródło
0

Haskell, 70

szkoda, że ​​jestem za późno IMHO to całkiem nieźle jak na to konkretne pytanie i język. inne rozwiązanie Haskell tutaj ma 161 znaków.

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

działa to przy użyciu readsfunkcji, która częściowo analizuje ciąg. na przykład reads "34abc" = [(34, "abc")]. to oczywiście czyni go idealnym do tego wyzwania.

stosowanie:

*Main> " This 1 is22a 3352sentence 50"%3
" This3 is66a10056sentence150"
dumny haskeller
źródło