Bir sayı kare benim yolum


32

İnsanlar bana bir sayı karesinin kendisinin çarptığı sayı olduğunu söyleyip duruyorlar. Bu açıkça yanlıştır. Bir sayıyı karelemenin doğru yolu, bir kareye dönüştürmektir, üstündeki basamak sayısına eşit sayıda üst üste istifleyerek ve ardından elde edilen kareden tüm sayıları her iki yatay olarak da okumaktır. yalnızca soldan sağa) ve dikey olarak (yalnızca yukarıdan aşağıya) ve sonra bunları birlikte ekleyin. Öyleyse, 123 sayısı için önce kareyi yaratın:

123
123
123

Sonra tüm satırları ve sütunları kareden alın ve birleştirin:

123+123+123+111+222+333

Bu bize sonucunu veriyor 1035.

Negatif sayılar için, yığın normalde (yalnızca sayısını unutmayın basamak ve sonra (negatif işaretler) normalde yatay sayıları okuyun ve sonra negatif işaretleri görmezden negatif işareti uzunluğu dahil değildir, bu yüzden) dikey sayılar. Yani, sayı -144için kare olsun:

-144
-144
-144

Hangisi bize -144-144-144+111+444+444, hangisi eşittir567

Yalnızca bir rakam olan sayılar için kare her zaman iki katına çıkar (eşit olarak bir kez yatay ve bir kez okunur). Yani 4bize verir

4

Hangisi bize 4+4, hangisi eşittir 8.

Ondalık kısım içeren sayılar için normal şekilde istifleyin (sayıyı istifleme sayınızda yalnızca rakamların sayıldığını unutmayın; bu nedenle ondalık sayı sayılmaz) ve dikey sayıları okurken ondalık sembolleri yok sayın. Örneğin, sayı 244.2bize verir

244.2
244.2
244.2
244.2

Hangisi bize 244.2+244.2+244.2+244.2+2222+4444+4444+2222, hangisi eşittir 14308.8.

Kesirli ya da karmaşık sayılar kesilemez.

Senin görevin:

Sayıları elle karıştırmaktan bıktım, bu yüzden işlemi otomatikleştirmeye karar verdim. Bana bir float veya string alan, hangisini tercih ederseniz edin, girdi olarak alın ve yolumun karesini almanın sonucunu döndüren bir program veya işlev yazın.

Örnekler:

123    -> 1035
388    -> 3273
9999   -> 79992
0      -> 0
8      -> 16
-6     -> 0
-25    -> 27
-144   -> 567
123.45 -> 167282.25
244.2  -> 14308.8
2      -> 4
-0.45  -> 997.65
0.45   -> 1000.35

puanlama:

Ellerim tüm bu kareleri yazmaktan sıkılıyor ve bilgisayarım kopyala / yapıştır özelliğini desteklemiyor, bu nedenle yazmam için en az kod içeren giriş (bir nedenden dolayı bayt cinsinden ölçülür) kazanıyor!


1
"123.45" ve "244.2", bilgisayar sayıyı ikilik olarak sakladığından, kendi içinde geçerli bir değişken değildir. Bu normalde sorun ondalık gösterime dayanana kadar sorun olmaz.
Leaky Nun

@LeakyNun, bununla ne demek istediğinizi gerçekten bilmiyorum. Sorun çözülemez değil (en azından python'da), çok sayıda bayt olmasına rağmen oldukça kolay bir şekilde yapabileceğimden eminim. Ancak, bazı dize manipülasyon gerektirir.
Gryphon - Reinstate Monica

@Gryphon Yani dizge olarak girdi almalı mıyız?
Sızdıran Rahibe

3
@Gryphon Burası başarısız olduğu yer. 244.2bir şamandıra numarası değil. Dizeye dönüştürülemez "244.2".
Leaky Nun

3
@Gryphon Ancak bu gibi davranışlar onu çok rahatsız edici hale getirir.
Leaky Nun

Yanıtlar:


8

05AB1E , 7 bayt

þSDg×+O

Çevrimiçi deneyin!

açıklama

þSDg×+O Implicit input
þ       Keep digits
 S      Get chars
  D     Duplicate
   g    Length
    ×   Repeat string(s)
     +  Add (implicit input added to all elements)
      O Sum

3
Ooo ne zaman istersen açıklama
Jonathan Allan

1
Ayrıca, tek baştaki sıfırın -1 <giriş <1 (yani 0.45 ve .45 için farklı girdiler, ancak aynı sayı, sadece eski kabul edilebilir) girişindeki bir gereklilik olduğunu unutmayın.
Jonathan Allan

@JonathanAllan İkincisi zaten ele alınmaz.
Outgolfer Erik

@ JonathanAllan Yapıldı.
Outgolfer Erik

7

Jöle ,  13  12 bayt

fØDẋ€L$ŒV+VS

Bir karakter listesi (iyi biçimlendirilmiş bir ondalık sayı kabul eden, tek baştaki sıfıra -1 <n <1 için bir gerekliliktir ) ve bir sayı döndüren bir tek renkli bağlantı .

Çevrimiçi deneyin!

14 kabul etmek ve geri dönüş sayıları (giriş sınırlı baytları +/- 10 -5 göre ŒṘ): ŒṘfØDẋ€L$ŒV+⁸S.

Nasıl?

fØDẋ€L$ŒV+VS - Link: list of characters         e.g. "-0.45"
 ØD          - yield digit characters                "0123456789"
f            - filter keep                           "045"
      $      - last two links as a monad:
     L       -   length (number of digit characters) 3
   ẋ€        -   repeat list for €ach digit          ["000","444","555"]
       ŒV    - evaluate as Python code (vectorises)  [0,444,555]
          V  - evaluate (the input) as Jelly code    -0.45
         +   - addition (vectorises)                 [-0.45,443.55,554.55]
           S - sum                                   997.65

Umm, -1 için 15 bayt sürümü +€ile değiştirebilirsiniz +.
Outgolfer Erik,

Zaten yaptım, yine de teşekkürler!
Jonathan Allan,

Umm, 15 byte versiyonunda değil. EDIT: 3 saniye çok erken sanırım ...
Outgolfer Erik

Yup, 15 byte sürümü dediğinizi fark etti - tekrar teşekkürler!
Jonathan Allan,

6

Haskell, 59 56 bayt

f s|l<-filter(>'.')s=0.0+sum(read<$>(s<$l)++[c<$l|c<-l])

Giriş bir dize olarak alınır.

Çevrimiçi deneyin!

Nasıl çalışır

l<-filter(>'.')s      -- let l be the string of all the numbers of the input string
f s   = 0.0 + sum     -- the result is the sum of (add 0.0 to fix the type to float)
   read<$>            -- turn every string of the following list into a number
   s<$l               -- length of l times the input string followed by
   [c<$l|c<-l]        -- length of l times c for each c in l   

5

Japt v2 , 16 bayt

o\d
l
¬xpV +V*Ng

Çevrimiçi test edin!

açıklama

o\d    First line: Set U to the result.
o      Keep only the chars in the input that are
 \d      digits. (literally /\d/g)

l    Second line: Set V to the result.
l    U.length

¬xpV +V*Ng    Last line: implicitly output the result.
¬             Split U into chars.
 x            Sum after
  pV            repeating each V times.
     +V*Ng    Add V * first input (the sum of the horizontals) to the result.

4

C # (.NET Core), 150 141 133 bayt

@TheLethalCoder sayesinde 9 bayt kaydedildi @TheLethalCoder
sayesinde 8 bayt kaydedildi

a=>{var c=(a+"").Replace(".","").Replace("-","");int i=0,l=c.Length;var r=a*l;for(;i<l;)r+=int.Parse(new string(c[i++],l));return r;}

Çevrimiçi deneyin!

Girdi olarak bir dize alır ve 'kare' sayıyı şamandıra olarak verir.


Bu kod aşağıdaki algoritmayı takip eder:

  1. Girişten yeni bir dize oluşturun, ancak ondalık basamak ve semboller olmadan, uzunluklarımızı ve oradaki sütunların sayılarını alabiliriz.

  2. Girdiyi, nokta 1'de yarattığımız dizginin uzunluğunu hesaplayın.

  3. 'Karemizdeki' her sütun için, sütun numarası ve satır uzunluğuyla yeni bir dize oluşturun ve sonucumuza ekleyin.

Örnek:

Giriş: -135.5

  1. Ondalık noktaları ve sembolleri değiştirirsek 1355uzunluğu olan dizgeyi alırız 4.
  2. Giriş kat 4: -135.5 * 4 = -542.
  3. Şimdi, her sütun için yeni dizeleri oluşturmak, onları ayrıştırmak ve bizim sonuca ekleyin:
    1111, 3333, 5555, 5555.

Bu sayıları toplarsak 15012, elde ettiğimiz şey tam olarak programımızın vereceği şeydir.


1
Siteye Hoş Geldiniz ve ilk cevaplarınız güzel (özellikle de açıklamalar çok beğenildi!)!
Dada

@Dada Teşekkürler! Zorlu durumlardan bile hoşlandığım baytlardan string.Replace()memnun değilim ama sanırım bu işe yarayan tek yol!
Ian H.

Bazı baytları ayarlayarak ive lyüzerek kaydedebilir .
TheLethalCoder

@ TheLethalCoder Bu düşünceye göre, ne yazık ki indeksleme yüzerlerde çalışmaz ve .Lengthdolaylı olarak yüzmeye dönüştürülemez.
Ian H.

1
a=>{var c=a.Replace(".","").Replace("-","");int i=0,l=c.Length;var r=float.Parse(a)*l;for(;i<l;)r+=int.Parse(new string(c[i++],l));return r;}141 bayt. Giriş olarak a alarak floatve bir dizgiyi kullanarak kaydedebilirim , n+""ancak kontrol etmedim.
TheLethalCoder

3

Brachylog , 23 bayt

{∋ịṫ}ᶠ⟨≡zl⟩j₎ᵐ;[?]zcịᵐ+

Çevrimiçi deneyin!

Brachylog yüzerle iyi gitmiyor ...

Açıklama:

{∋ịṫ}ᶠ⟨≡zl⟩j₎ᵐ;[?]zcịᵐ+ Takes string (quoted) input, with '-' for the negative sign
     ᶠ                  Return all outputs (digit filter)
{   }                    Predicate (is digit?)
 ∋                        An element of ? (input)
  ị                       Convert to number (fails if '-' or '.')
   ṫ                      Convert back to string (needed later on)
      ⟨   ⟩             Fork
       ≡                 Identity
         l               Length
                        with
        z                Zip
             ᵐ          Map
            ₎            Subscript (optional argument)
           j              Juxtapose (repeat) (this is where we need strings)
              ;         Pair with literal
               [ ]       List
                ?         ?
                  z     Zip
                   c    Concatenate (concatenate elements)
                     ᵐ  Map
                    ị    Convert to number
                      + Add (sum elements)

3

Kabuğu , 15 bayt

§+ȯṁrfΛ±TṁrSR#±

Bir dize alır ve bir sayı döndürür. Çevrimiçi deneyin!

açıklama

Yerleşik ayrıştırma işlevinin r, varsayılan bir değer döndürmek yerine geçersiz girdilerde ayrıştırma hataları vermesi biraz can sıkıcı bir durumdur; bu, açıkça basamak içermeyen sütunları filtrelemem gerektiği anlamına gelir. Hatalı biçimlendirilmiş girdilerde 0 döndürürse, fΛ±3 bayt bırakıp kurtarabilirim.

§+ȯṁrfΛ±TṁrSR#±  Implicit input, e.g. "-23"
             #±  Count of digits: 2
           SR    Repeat that many times: ["-23","-23"]
         ṁr      Read each row (parse as number) and take sum of results: -46
  ȯṁrfΛ±T        This part is also applied to the result of SR.
        T        Transpose: ["--","22","33"]
     fΛ±         Keep the rows that contain only digits: ["22","33"]
   ṁr            Parse each row as number and take sum: 55
§+               Add the two sums: 9

3

Python 3 , 95 94 87 85 84 bayt

def f(i):l=[x for x in i if"/"<x];k=len(l);print(k*float(i)+sum(int(x*k)for x in l))

Test Takımı .

Python 3 , 78 bayt

lambda x:sum(float(i*len(z))for z in[[i for i in str(x)if"/"<i]]for i in[x]+z)

Test odası.

İkinci yaklaşım, @ officialaimm'in çözümünden ilham alan Python 3'e bir liman.


3

Python 2 , 81 74 bayt

@Mr -7 bayt teşekkürler. Xcoder :'/'<i

  • Tamsayı veya float alır, float döndürür.
lambda x:sum(float(i*len(z))for z in[[i for i in`x`if"/"<i]]for i in[x]+z)

Çevrimiçi deneyin!

Açıklama:

Say 123.45girdi olarak verilir. [i for i in`x`if"/"<x]dize edilmiş tamsayıların bir listesini verir ['1','2','3','4','5'](ki bu da z). Şimdi, [x]+zyani [123.45,'1','2','3','4','5']her bir öğeyi len(z), burada çarparak 5ve her birini bir Float'a dönüştürerek yinelemeliyiz (böylece, dizeler de buna göre dönüştürülür), sonuç verir [617.25,11111.0,22222.0,33333.0,44444.0,55555.0]. Sonunda hesaplar sum(...)ve elde ederiz 167282.25.


78 bayt . Değiştir i.isdigit()ile"/"<i<":"
Sn Xcoder

1
74 bayt . Sen yerini alabilir i.isdigit()ile "/"<ihem çünkü, aslında, .ve -basamak daha düşük ASCII kodları var, adn /aralarında olduğu
Sn Xcoder

Rica ederim. Cevabımın alternatifi olarak Python 3'ü
aktardım

3

JavaScript, 75 62 bayt

a=>(b=a.match(/\d/g)).map(b=>a+=+b.repeat(c),a*=c=b.length)&&a

Çevrimiçi deneyin

Arnaggy sayesinde -2 bayt
- Shaggy sayesinde 5 bayt (Fonksiyonun bir sayı alması gerekiyor, ama şimdi diğer birçok cevabın da string aldığını görüyorum)


3

Perl 5 , 37 33 + 1 (-p) = 38 34 bayt

$_*=@n=/\d/g;for$\(@n){$_+=$\x@n}

Çevrimiçi deneyin!

Dom'un kodundan bazı püf noktaları 4 baytı traş etmek için kullandı.

Açıklaması:

@n=/\d/g;    # extract digits from input
$_*=@n;      # multiply input by number of digits
for$\(@n){   # for each digit:
  $_+=       # add to the input
  $\x@n}     # this digit, repeated as many times as there were digits
             # taking advantage of Perl's ability to switch between strings
             # and numbers at any point

Çok benzer bir yaklaşımla geldim, ancak $ \ kullanarak ve döngüyü terk ederek birkaç bayttan kurtulmayı başardık: çevrimiçi deneyin!
Dom Hastings,

Madeni yıkamak için senden ilham aldım. Sonundaki "} {" yapısı nedir? Buna aşina değilim.
Xcali

Bu siteden öğrendim, temelde -nve -pkelimenin tam anlamıyla while(){...}kodun etrafına sarın , bu yüzden bundan }{koptu. Bu kararsız, $_ancak $\ değişkeniniz olarak kullanırsanız , $\ her baskıya eklendiğinden beri hala yazdırılır . Bunun içinde sayı veya bir şey saklayabileceğiniz ve ihmal edebileceğiniz anlamına gelir $_. Bunun harika bir açıklama olduğundan emin değilim, ancak Perl'deki golf g için ipuçları bakın , daha iyi anlatacağımdan eminim! Ancak puanınızı yardımcı olmak için sevindim!
Dom Hastings



2

Pyth , 21 20 bayt

K@jkUTQ+smv*lKdK*lKv

Test odası.

@ EriktheOutgolfer'in 22-21 sohbette 1 bayt golf yapmama yardımcı olan yanıtından tamamen farklı bir yaklaşım kullanıyor .


açıklama

K@jkUTQ+s.ev*lKbK*lKv

K @ jkUTQ - Rakamları filtreler ve K değişkenine atar.
         m - Harita. D değişkeni ile rakamlar arasında yinelenir
           v - Değerlendir (şamandıra dönüştür).
            * lKd - Her String basamağını K uzunluğuyla çarpar.
        s - Topla
       + - Toplam
                 * lKvQ - Sayıyı, dize uzunluğuyla çarpar Dize

2

Octave , 100 82 bayt

Bana ödevlerin geri dönüş değeri olduğunu ve beni 18bayt olarak kurtardığını öğrettiğin için @TomCarpenter 'a çok teşekkür ederim !

@(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(s'*logspace(0,n-1,n)))

Çevrimiçi deneyin!

Ungolfed / Açıklama

function f=g(v)
  s=strrep(num2str(abs(v)),'.','')-'0';  % number to vector of digits (ignore . and -)
  n=nnz(s);                              % length of that vector
  f=n*v+sum(sum(s'*logspace(0,n-1,n)))   % add the number n times and sum the columns of the square
end

Bunun işleyiş şekli, temelde sayının kendisinin nzamanlarını eklememiz ve ardından sütunların toplamını eklememizdir. Toplama s' * logspace(0,n-1,n), sütunların toplamına ulaşır, örneğin, v=-123.4bu matris şöyle ise:

[ 1     10    100   1000;
  2     20    200   2000;
  3     30    300   3000;
  4     40    400   4000 ]

Yani sadece buna ihtiyacımız var sumve işimiz bitti.


1
Bunları 18 isim yazarak anonim bir işleve sokarak tasarruf edebilirsiniz @(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(s'*logspace(0,n-1,n))). Çevrimiçi deneyin!
Tom Carpenter,

1

Swift 4 , 139 134 bayt

func f(s:String){let k=s.filter{"/"<$0};print(Float(s)!*Float(k.count)+k.map{Float(String(repeating:$0,count:k.count))!}.reduce(0,+))}

Test odası.


açıklama

  • func f(s:String)- fAçık bir String parametresiyle bir işlev tanımlar s.

  • let k=s.filter{"/"<$0}Her iki fark: - basamak Filtreler -ve .tamamen rakamlardan daha küçük ASCII değerleri vardır ve /arasındadır ., -ve 0. Dolayısıyla, "/"Python cevabımda yaptığım gibi, şu anki karakterden daha küçük olup olmadığını kontrol ettim .

  • print(...) - Sonucu yazdırır.

  • Float(s)!*Float(k.count)- Hem String'i hem de basamak sayısını Float'a dönüştürür ve çoğaltır (Swift, Float ve Int çarpımına izin vermiyor :()). Numara ekler Yani xkez nerede xiçerdiği basamak sayısıdır.

  • k.map{Int(String(repeating:$0,count:k.count))!- k.map{}üzerinde haritalar kakım değeri ile $0. String(repeating:$0,count:k.count)her basamağı alır, xaynı basamaklardan oluşan bir Dize oluşturur ve Float(...)!Kayan Nokta sayısına dönüştürür.

  • .reduce(0,+) - Yukarıdaki listenin toplamını alır.

  • Ve nihayet +iki sonucu özetliyor.


Bir örnek alalım!

Dize bizim diyelim "0.45". Öncelikle, rakamları filtreledik, böylece biz kaldık 0, 4, 5. Biz dönüştürmek "0.45"basamak sayısına göre çarpın Float ve alıcı: 0.45 * 3 = 1.35. Sonra her rakamı alıp meydanda (kaç basamak) genişliğini doldurur kadar bu rakamı tekrar bir dize çevirmek: 0, 4, 5 -> 000, 444, 555. Bunu özetliyoruz 000 + 444 + 555 = 999. Sonra sadece birlikte sonuçlarını ekleyin: 1.35 + 999 = 1000.35.


1

C #, 139 137 bayt

using System.Linq;n=>{var d=(n+"").Where(char.IsDigit);return d.Sum(i=>int.Parse(new string(i,d.Count())))+new int[d.Count()].Sum(_=>n);}

@Ian H sayesinde 2 bayt kaydedildi

Çevrimiçi deneyin!

Tam / Biçimli sürüm:

namespace System.Linq
{
    class P
    {
        static void Main()
        {
            Func<double, double> f = n =>
            {
                var d = (n + "").Where(char.IsDigit);
                return d.Sum(i => int.Parse(new string(i, d.Count()))) + new int[d.Count()].Sum(_ => n);
            };

            Console.WriteLine(f(123));
            Console.WriteLine(f(-144));
            Console.WriteLine(f(4));
            Console.WriteLine(f(244.2));

            Console.ReadLine();
        }
    }
}

Başlangıçta var d=(n+ ...yerine 2 bayt kaydedebilirsiniz var d = (n ....
Ian H.

@IanH. Tüm boşlukları kaldırmayı unuttum -_- Bir destek görüşmesi yaparken cevaplamak için aldığım şey bu.
TheLethalCoder

1

Mathematica, 107 bayt

(t=Length[s=#&@@RealDigits[#]//.{a___, 0}:>{a}];If[IntegerPart@#==0,t++];t#+Tr[FromDigits@Table[#,t]&/@s])&

1

PHP, 78 88 +1 bayt

for($e=preg_match_all("#\d#",$n=$argn);~$c=$n[$i++];)$s+=str_repeat($c,$e);echo$s+$n*$e;

İle boru olarak çalıştırın -nR.

PHP 7.1'de uyarılar verebilir. Düzeltmek için $c,$eile tekrarlayın $c>0?$c:0,$e.


0

Python 3 , 68 70 73 77 bayt

lambda n:sum(float(n)+int(_*sum(x>"/"for x in n))for _ in n if"/"<_)

Çevrimiçi deneyin!

Her basamaktaki karakterin üzerinde dolaşır ve bunu genel olarak basamaklı karakterlerin sayısıyla tekrarlar, bunu bir tamsayıya dönüştürür ve bunu ekler n. Bu yol , toplam zamanın yatay kısmı olan ve dikey kısım olan rakam tekrarı ile birlikte neklenmiş dzamanları alır . Başlangıçta kullanılmış, str.isdigitancak >"/"bu konudaki diğer üyeler sayesinde çok fazla bayt kurtardı. nBir dize olarak alarak iki bayt kaydeder , ancak çıkış daha karışıktır.

lambda n:sum(n+int(_*sum(x>"/"for x in str(n)))for _ in str(n)if"/"<_)

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