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

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'

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!


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


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


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.     ";

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
$ 

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

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]")

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

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”


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


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

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.


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.


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

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


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 .


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

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


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

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)


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.

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!

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

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

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]!=''])

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

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.

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"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.