Yanlış Sayıya Yanlış Sayı


19

Yanlış Sayıya Yanlış Sayı

Bu meydan okumada, karışık bir sayıyı uygunsuz bir kesire dönüştüreceksiniz.

Uygunsuz kesirler daha az sayı kullandığından, kodunuzun olabildiğince kısa olması gerekir.


Örnekler

4 1/2
9/2

12 2/4
50/4

0 0/2
0/2

11 23/44
507/44

Şartname

Giriş paydasının asla 0 olmayacağını varsayabilirsiniz. Giriş her zaman x y/zx, y, z'nin keyfi negatif olmayan tamsayılar biçiminde olacaktır . Çıktıyı basitleştirmeniz gerekmez.


Bu yani bayt en kısa kod kazanır.


5
"Ayrıştırma" etiketini eklemelisiniz. Eminim çoğu cevap giriş ayrıştırma ve çıkış biçimlendirme matematik yapmaktan daha fazla bayt harcayacak.
nimi

3
Çıktı rasyonel bir sayı türü olabilir mi veya bir dize mi olmalı?
Martin Ender

2
@AlexA .: ... ancak mücadelenin büyük bir kısmı. Açıklamasına göre, etiket bu gibi durumlarda kullanılmalıdır.
nimi

7
Can x, yve znegatif olmak?
Dennis

2
Meydan okumaya dayanarak, varsayıyorum, ancak "xy / z" girdi biçimi zorunlu mu, yoksa alan yeni bir çizgi ve / veya x,y,zayrı girişler olabilir mi? Cevapların çoğu, giriş formatının gerçekten zorunlu olduğunu varsaymaktadır x y/z, ancak bazıları bu sorunun kesin bir cevaba sahip olması gerekmez.
Kevin Cruijssen

Yanıtlar:


1

Japt, 10 bayt

Woohoo, şu anda CJam'ı yeniyor!

U*W+V+'/+W

Çevrimiçi deneyin!

Nasıl çalışır

       // Implicit: [U,V,W] = eval(input). This automatically discards the slash.
U*W+V  // Calculate the new numerator: (whole part * denominator) + numerator.
+'/+W  // Add the slash and the denominator.
       // Implicit: output last expression

Dün farkına varıncaya kadar, bir cevaptan 15 tekrar nasıl kazandığımı anlamaya çalışarak biraz zaman geçirdim: ilk yeşil onay işaretim! \ o /
ETHproductions


7

CJam, 16 15 14 bayt

l'/']er~:Xb'/X

veya

l'/']er~_@b'/@

Burada test edin.

açıklama

l      e# Read input.
'/']er e# Replace the "/" with a "]".
~      e# Evaluate the string as code. If the input was "i n/d", this pushes [i n] d.
:X     e# Store the denominator in X.
b      e# Treat [i n] as base-d digits. This effectively computes i*d + n.
'/     e# Push a slash.
X      e# Push the denominator.

Diğer sürüm, biraz daha fazla yığın kaydırma kullanarak bir değişken kullanmaktan kaçınır.


CJam'de daha fazla temel dönüşüm kullanmaya başlamam gerekiyor.
Esolanging Fruit

Alternatif bir sürüm: '//~\S/1$b'/@13 bayt. Düzenleme : oh Girişi unuttum l.
Chromium

4

Mathematica, 58 bayt

ToExpression@StringReplace[#," "->"+"]~ToString~InputForm&

Bu, basitleştirilmiş sonucu döndürür. Dize yerine rasyonel bir sayı çıktısı iyi ise, 19 bayt kaydedebiliriz:

ToExpression@StringReplace[#," "->"+"]&

4

PowerShell, 47 44 42 Bayt

Çarpılan 44 hala düzenli 44; (

$l,$n,$d=$args-split'\D';"$(+$l*$d+$n)/$d"

Regex kullanarak birkaç bayt golf -split. Normal ifadeyi değiştirerek TessellatingHeckler sayesinde birkaç kez daha golf oynadım .

$args-split'\D'Bizim giriş argüman alır ve olmayan basamaklı karakterler böler. Burada biri boşlukta diğeri karakterde olmak üzere iki bölme gerçekleştirir /. Sonuçlar daha sonra eşzamanlı atama kullanılarak üç değişkende saklanır. Daha sonra dize çıktısını bir kod bloğu, bir eğik çizgi ve daha sonra yeniden enominator olarak yürütülen ( ecom $lnumarası $denominator artı $numerator) olarak formüle ediyoruz./$d


Merhaba, Ben -split ' |/'"bir | bu | ya da bu" regex ile bir karakter kaydetmek ya da -split '\D'bir rakam ve s (h) iki karakter ave herhangi bir şey bölmek için kullanabilirsiniz düşünüyorum . @Downgoat çıktı biçiminde biraz esnek olmaya istekliyse '{0}*{2}+{1};{2}'-f($args-split'\D')|iex, 40 bayttır ve sayılar birbirinin üstünde bile olduğundan daha soğuk çıktıya sahiptir!
TessellatingHeckler

1
@TessellatingHeckler Normal ifade yardımı için teşekkürler. Downgoat'tan girdi istedim. Ancak $l,$n,$d=$args-split'\D';+$l*$d+$n;$d37 yaşında daha kısadır ve mantıksal olarak burada olduğu gibi aynı modeli izler.
AdmBorkBork

Oh evet, sadece matematik! (Bu da Perl cevabını yenmek için yeterli olacaktır)
TessellatingHeckler

3

On Ayak Lazer Kutuplu Java 1.03, 79 + 25 (içe aktarma) = 104 bayt

gerektirir import sj224.tflp.math.*;

String m(String[]a){return ""+new BigRational(a[0]).add(new BigRational(a[1]));}

Bu neredeyse kesinlikle 1.04 ile çalışacak, ama şimdiye kadar sadece 1.03 ile test ettim, çünkü zaten inşa yolunda 1.03 ile kurulmuş bir java projem oldu.


3

JavaScript (ES6), 44 41 bayt

m=>([x,y,z]=m.match(/\d+/g),+y+x*z+"/"+z)

@ETHproductions sayesinde 3 bayt tasarruf edildi !

açıklama

Çok basit.

m=>
  ([x,y,z]=m.match(/\d+/g), // x, y and z = numbers from input
    +y+x*z                  // numerator
    +"/"+z                  // denominator
  )

Ölçek

Test, çoğu tarayıcıda çalışacak tahribatsız atamaya sahip değildir.


Güzel! Sen kullanabilirsiniz [p,q,r]=yerine p=daha sonra değiştirmek p[0], p[1]ve p[2]ile p, qve rsırasıyla. Bu değişiklikten sonra 41 elde ediyorum:m=>([p,q,r]=m.match(/\d+/g),+q+p*r+"/"+r)
ETHproductions

@ETHproductions Bahşiş için teşekkürler! Aslında bir yıkıcı ödev kullanmayı düşündüm ama Chrome'da çalışmıyorlar ve test etmek için elimde Firefox yoktu. : P
user81655

İlk çarpı 44'üm! : D
user81655

Bunun m.split(/\W/g)yerine bir bayt kaydetmek için kullanabilirsiniz
Kritixi Lithos

2

Julia, 58 50 bayt

s->eval(parse((r=replace)(r(s," ","+"),"/","//")))

Bu, bir dizeyi kabul eden ve bir Rationalyazım nesnesi döndüren anonim bir işlevdir . Bunu aramak için bir ad verin, örn f=s->....

Girişin rasyonel olarak değerlendirilen bir ifade olması için biraz manipüle edilebildiği gerçeğinden faydalanabiliriz. Özellikle, bir tam sayı artı bir rasyonel bir rasyoneldir ve rasyonlar çift eğik çizgi ile gösterilir. Dönüyoruz Yani eğer 4 1/2içine 4+1//2, değerlendirilen sonuç olacaktır 9//2.

Ungolfed:

function f(s::AbstractString)
    # Replace the space in the input with a plus
    r1 = replace(s, " ", "+")

    # Replace the / with //
    r2 = replace(r1, "/", "//")

    # Parse the resulting expression as a rational
    return eval(parse(r2))
end

2

Smalltalk - 76 karakter

Girdi, Smalltalk'in dizi sınırlayıcısı ve doğal kesir gösterimiyle tam olarak eşleşir. Eğer bu kadar ayrıntılı olmasaydı, ciddi bir yarışmacı olabilirdi!

Compiler evaluate:'|p|p:=0.#(',FileStream stdin nextLine,')do:[:q|p:=p+q].p'

Çok basit basitleştirme bir gereklilik değildi, Smalltalk bunu otomatik olarak yapıyor!


2

Bash + coreutils, 28

dc<<<${@/\// }sarla*+n47Plap

$@tüm komut satırı parametrelerine ${@/\// }genişler , bu nedenle 'yığına yerleştirilen ile /değiştirilen tüm komut satırı parametrelerine genişler . Gerisi basit yığın manipülasyonu ve aritmetiğidir.dc


2

Haskell , 74 67 63 bayt

r=read
f x|(a,(c,s:d):_)<-lex<$>lex x!!0=show(r a*r d+r c)++s:d

Çevrimiçi deneyin!

açıklama

H.PWiz'in anladığı gibi , dizeyi parçalarına ayırmak için Haskell'in lexer'ını kullanabiliriz. (Daha önce ben kullanıyordum span(>'/')) Ve Laikoni olduğuna dikkat çeken <$>tıpkı eserleri mapSndarasından Data.Tuple.

Desen koruması, kodumuzu kullanmak istediğimiz üç numaraya böler lex. lexilk jetonu kırmak için haskell'in sözlüğünü çağırır. Her öğenin dizeyi ayrıştırmanın olası bir yolunu temsil eden bir liste döndürür. Bu elemanlar, ilk elemanın ilk belirteç ve geri kalan dizenin ikinci eleman olduğu tupllerdir. Şimdi giriş formatı çok düzenli olduğu için sadece bir tane ayrıştırma yapacağız, bu yüzden her zaman birincisini alabiliriz. Yaptığımız ilk şey lexgirdiye çağırmak

lex x

Sonra listeden paketini açıyoruz ve bize 2-demet veriyoruz

lex x!!0

İlk belirteç, karışık ayrışmanın tamamının bir kısmı olacaktır. Sonra tuples olduğu için tupleın ikinci elemanına uygulamak için bir takma ad Functorskullanabiliriz .(<$>)fmaplex

lex<$>lex x!!0

Bu boşlukta yer alır ve bir sonraki jetonu kesirimizin payıdır. Şimdi bunu kullanarak bir kalıp eşleşmesine bağlarız <-. Bizim modelimiz

(a,(c,s:d):_)

ailk simgemiz olan kesirin tamamını kapar. :_bizim ikinci sonuç listesinden açar lex. cikinci kez belirlediğimiz jetonu, yani kesirin payıdır. Geri kalan her şey, s:donu ilk karakterine ayıran, a'nın formatı /ve payda olacak geri kalanı ile garanti edilir .

Şimdi girdiyi ayrıştırdığımız için gerçek hesaplamayı yapıyoruz:

show(r a*r d+r c)++s:d

rDaha önce bağladığımız okuma fonksiyonu nerede .

lexBir listenin başarısız olması durumunda boş, başarılı olması durumunda boş olmadığını döndürmesi önemlidir . Neden bu bir Maybebilmiyorum.



@ H.PWiz Bu lex'ın büyük bir kullanımıdır.
Buğday Büyücüsü


2
/
H.PWiz


1

Javascript ES6, 62 bayt

p=prompt;b=p(a=+p()).split`/`;alert((+b[1]*a+ +b[0])+"/"+b[1])

1
Çok hoş! Bazı ipuçları: Sen kullanabilirsiniz [b,c]=yerine b=daha sonra kullanmak byerine b[0]ve cyerine b[1]. Ayrıca, denklemi yeniden düzenleyebilirsiniz, böylece parantez gerekmez: p=prompt;[b,c]=p(a=+p()).split/;alert(+b+c*a+"/"+c)
ETHproductions 18:15

1

Perl, 82 61 38 bayt

#!perl -paF/\D/
$_=$F[0]*$F[2]+$F[1]."/$F[2]"

Bu muhtemelen daha fazla golf olabilir.

değişiklikler

  • Bir normal ifade kullanarak 16 bayt split, <>yerine 5 bayt kaydedildi <STDIN>.
  • Dennis sayesinde 16 bayt kurtardı.

Mesele #!perl -paF/\D/(9 bayt) ile kullanabilirsiniz $_=$F[0]*$F[2]+$F[1]."/$F[2]".
Dennis

@Dennis bunu ekledim. Teşekkürler!
ASCIIThenANSI

#!perlShebang ve satır besleme parçası sayılmaz. Bu sadece 38 bayt.
Dennis

@Dennis Oh, tamam. Şimdi düzeltirim. (Parlak tarafta, bu en kısa ikinci ezoterik olmayan cevap olduğunu düşünüyorum)
ASCIIThenANSI

1

Mathematica, 51 bayt

Interpreter["ComputedNumber"]@#~ToString~InputForm&

İlginç bir şekilde, Mathematica bunu yerleşik olarak destekliyor. Bir sayının çıktısına izin verilirse, sadece 28 bayta ihtiyacımız var:

Interpreter@"ComputedNumber"

1

Java, 159 148 142 120 110 bayt

String m(String[]a){Long b=new Long(a[0]),d=new Long((a=a[1].split("/"))[1]);return b*d+new Long(a[0])+"/"+d;}

FlagAsSpam sayesinde bir sürü bayt kaydetti.


@FlagAsSpam Tamamlandı.
SuperJedi224

@FlagAsSpam Ancak değişkenler bildirilmeden bırakılacak!
SuperJedi224

Az önce söylediğim şeyleri dikkate almayın - yaptığınız işi yapmanın kısa yoluLong b=new Long(a[0]),c=new Long((a=a[1].split("/"))[0]),d=new Long(a[1]);
Addison Crump


1

05AB1E , 17 15 bayt

#`'/¡R`Š©*+®'/ý

@MagicOctopusUrn sayesinde -2 bayt .

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

#`         # Split input by spaces and push all items to the stack
           #  i.e. "4 1/2" → "4" and "1/2"
  '/¡      # Push the second item by "/"
           #  i.e. "1/2" → [1,2]
     R`    # Revert the list, and also push all items to the stack
           #  i.e. [1,2] → [2,1] → 2 and 1
Š          # Triple-swap the stack
           #  [4,2,1] → [1,4,2]
 ©         # Store the 2 in the register
  *        # Multiple the top two items
           #  4 and 2 → 8
   +       # Add the top two items
           #  1 and 8 → 9
®          # Push the 2 from the register to the stack again
 '/ý       # Join the two items by "/"
           #  9 and 2 → "9/2"

Esnek giriş ve çıkış formatı ile, tamsayıları sırayla alarak x,z,yve aday ve paydayı ayrı satırlara çıkarmak 4 bayt olur (bu yüzden meydan okumaya etiketini ekledim ..):

*+²»

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

*        # Multiply the first two inputs (x and z)
         #  i.e. 4 and 2 → 8
 +       # Add the third input (y)
         #  i.e. 8 and 1 → 9
  ²      # Take the second input again (z)
   »     # Join the stack by newlines and implicitly print it

@MagicOctopusUrn Teşekkürler, ancak girdi biçimi deneme açıklamasından farklıdır. Görünüşe göre biçim (tek dize olarak) 4 1/2bu özel zorluk için zorunludur. Aksi takdirde benim 4 baytlık versiyonu kullanılmış olurdu (veya çıkış zorunlu ama giriş esnek Bu 6-Byter kullanmak ise: *+'/²J)
Kevin Cruijssen


@MagicOctopusUrn Oh, " Tüm öğeleri ayığının içine it " bile bilmiyordum .. o.Ô Bu meydan okuma için tam olarak neye ihtiyacım vardı! Ve "/" ile birleştirme ile akıllı. Teşekkürler! :)
Kevin Cruijssen

"A'nın tüm öğelerini yığına aktar" komutunu kullanmaktan nefret ediyorum, çünkü "" "ve satır içi kod etiketleriyle evcilleştirilemez.
Sihirli Ahtapot Urn

@MagicOctopusUrn evet, aynı zamanda yorumlarda biraz sinir bozucu (bu yüzden kullanmak yerine " tüm öğeleri ayığına itin " alıntı '`'..
Kevin Cruijssen 15:18


1

Stax , 1 bayt

+

Çalıştırın ve hatalarını ayıklayın ( hata ayıklamak için çok şey olmamasına rağmen)

Zorluk belirtimi "Çıktıyı basitleştirmenize gerek yok" diyor. Basitleştirmeye izin verildiğini varsayarsak , stax'ta bunu yapmak için yerleşik bir talimat var. Girdi, dolaylı olarak bir tam sayı ve rasyonel sayı olarak yorumlanır. +Talimat, rationals hem genişler ekler ve basitleştirir. Sonuç dolaylı olarak yazdırılır.


1

-La -Mfeature = diyelim, 32 bayt 25 bayt ile Perl 5

m|/|;say$_*$'+$F[1],"/$'"

Çevrimiçi deneyin!

(Dom Hastings sayesinde -7 bayt)

$_, ( burada olduğu gibi ) sayısal bağlamlarda x y/zdeğerini değerlendiren girdinin xtamamıdır *. $'sonra gelirse burada içeren regex maç sonrası dizedir /yüzden - z. yDeğeri elde etmek için, -agirdiyi boşluklara ayıran ve @Fdiziye yerleştiren bayrağı kullanırız . Yani burada, @F = ("x", "y/z")bu sayısal bağlamlarda $F[1]="y/z"değerlendirilen anlamına gelir y( ybaşlangıçtaki bitişik basamak dizisi olduğu için $F[1]).


-pBayt sayınızdaki bayrağı saymanız gerekmez ; bunun yerine dili sayıyorsunuz Perl 5 with -p flag, 32 bytes. Mevcut konsensüs için bu meta gönderiye bakın .
Giuseppe

Güzel yaklaşım! Ben sadece biraz gitmek vardı ve 25 bayt bir sürüm yapmayı başardı: Çevrimiçi deneyin! . Kullanmak $'gerçekten tek gerçek farktı!
Dom Hastings

Her iki regex- kullanarak kombinasyonu $'ve -a- $F[n]dizenin parçalarını almak için iyi bir fikir, bunu hatırlamak zorunda olduğunu! Teşekkürler, gönderi güncellendi.
sundar - Monica'yı yeniden

0

Lua, 123 Bayt

m=io.read()z=string x=z.find c=z.sub b=tonumber s=x(m," ")f=x(m,"/")d=c(m,f+1)print(b(c(m,1,s))*b(d)+b(c(m,s,f-1)).."/"..d)

0

Samanyolu 1.6.0 , 31 bayt

'" "\="/"\=>;<A;A;:>*;A+"/"+<+!

Sonunda düşündüğümden çok daha uzun sürdü.


açıklama

'" "\="/"\=>;<A;A;:>*;A+"/"+<+!

'                                # read input from the command line
 " "  "/"               "/"      # push a string to the stack
    \    \                       # split the STOS at the TOS
     =    =                      # dump the TOS to the stack
           >       >             # rotate the stack rightward
            ;  ; ;   ;           # swap the TOS and STOS
             <              <    # rotate the stack leftward
              A A     A          # push the integer representation of the TOS
                  :              # duplicate the TOS
                    *            # multiply the STOS by the TOS
                       +   + +   # add the TOS and STOS
                              !  # output the TOS

kullanım

./mw <path-to-code> -i <input>

0

Python 2.7, 88 Bayt

a = giriş (). bölünmüş ('/'); yazdırma int (a [-1]) * int (a [0] .split () [0]) + int (a [0] .split () [1 ]), '/', bir [1]

Çevrimiçi deneyin !

Girişi tırnak içine almanız gerekir.

Muhtemelen en iyisi değil ...



0

C, 64

main(i,d,n){scanf("%d %d/%d",&i,&n,&d);printf("%d/%d",i*d+n,d);}

STDIN girişini okur. Bence oldukça açıklayıcı.


0

Çek , 120 bayt

>]+>:>32r#v
#d@0+\)  ##:>4;:>5'=:>48-\R-?
dd)R>32-#v
#>15-#v  #?
47r@>@   #v
#dd#v #?
r@>@     #v
    #\d@\: @*@+pd"/"op

Çevrimiçi deneyin!

Ayrıştırma döngüsünü (ikinci satır) yeniden kullanmaya çalışmadan bazı baytları kaydedebilirim. Bu şekilde, döngüyü daha spesifik hale getirebilirim, koşulların büyük karmaşasından kaçınabilirim ve kaydı başka şeyler için kullanabilirim.



0

C #, 112 bayt

s=>{string[]a=s.Split(),b=a[1].Split('/');int o=int.Parse(b[1]);return int.Parse(a[0])*o+int.Parse(b[0])+"/"+o;}

Tam / Biçimli Sürüm:

namespace System.Linq
{
    class P
    {
        static void Main()
        {
            Func<string, string> f = s =>
            {
                string[] a = s.Split(), b = a[1].Split('/');
                int o = int.Parse(b[1]);
                return int.Parse(a[0]) * o + int.Parse(b[0]) + "/" + o;
            };

            Console.WriteLine(f("4 1/2"));
            Console.WriteLine(f("12 2/4"));
            Console.WriteLine(f("0 0/2"));
            Console.WriteLine(f("11 23/44"));

            Console.ReadLine();
        }
    }
}


0

PHP, 65 Bayt

Çevrimiçi deneyin

kod

<?=(($a=preg_split("/[\s,\/]/",$argv))[0]*$a[2]+$a[1])."/".$a[2];

açıklama

$a=preg_split("/[\s,\/]/",$argv); # Split the string on "/" and " "
(($a)[0]*$a[2]+$a[1]) # as always denominator*whole number + numerator 
."/"                  # echo an slash
.$a[2];               # echo de denominator

0

Java 10, 87 bayt

A lambda Stringiçin String.

s->{var p=s.split(" |/");return new Long(p[0])*new Long(p[2])+new Long(p[1])+"/"+p[2];}

Çevrimiçi Deneyin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.