Benim yolumda bir sayı

Gryphon 09/06/2017. 20 answers, 1.959 views
code-golf number

İnsanlar bana bir sayı karesinin kendiliğinden çarpılarak çıkarılan sayı olduğunu söylüyorlar. Açıkçası yanlış. Bir sayıyı kare olarak yerleştirmenin doğru yolu, bir kareye çıkarmaktır; onu, kendisine ait sayıların sayısına eşit sayıda kez üst üste yığarak ve sonuçtaki kareden gelen tüm sayıları, hem yatay hem de yalnızca soldan sağa doğru) ve dikey olarak (yalnızca yukarıdan aşağıya doğru) ve ardından bunları bir araya getirin. Yani 123 numara için önce kare oluşturun:

123
123
123 

Ardından, kareden tüm satırları ve sütunları alıp bir araya getirirsiniz:

123+123+123+111+222+333 

Bu bize 1035 sonucunu verir.

Negatif sayılar için, normal şekilde yığın yaparsınız (yalnızca digits sayısını digits , böylece negatif işaret uzunluğa dahil edilmez) ve yatay sayıları normal olarak (negatif işaretlerle) okuyun ve sonra negatif işaretleri yok sayın dikey sayıları. Böylece, -144 sayısı için -144 alıyoruz:

-144
-144
-144 

Bu bize -144-144-144+111+444+444 ; bu -144-144-144+111+444+444 eşittir

Yalnızca bir basamaklı sayılarda, kare her zaman iki katına eşittir (yatay olarak bir kez ve dikey olarak bir kez okunur). Yani 4 bize verir

4 

Bu bize 4+4 1'e karşılık 4+4 verir.

Ondalık kısımları olan numaralar için, normal olarak yığını yapın (yalnızca digits sayıyı yığınladığınız süre içinde saydığınızdan ve bu nedenle ondalık noktanın sayılmaz olduğunu unutmayın) ve dikey sayıları okurken ondalık simgeleri yok sayın. Örneğin, 244.2 sayısı bize

244.2
244.2
244.2
244.2 

Bu bize 14308.8 244.2+244.2+244.2+244.2+2222+4444+4444+2222 14308.8 244.2+244.2+244.2+244.2+2222+4444+4444+2222 14308.8 244.2+244.2+244.2+244.2+2222+4444+4444+2222 14308.8 244.2+244.2+244.2+244.2+2222+4444+4444+2222 ve bu 14308.8 .

Kesirli veya karmaşık sayılar kare olamaz.

Senin görevin:

Numaraları kendi yolumla elle taramaktan bıktım, bu yüzden süreci otomatikleştirmeye karar verdim. Bana bir float veya dize alan, hangisi sizce tercih ederseniz, girdi olarak bir program veya işlev yazın, kendi yolum kare biçimlendirme sonucunu döndürür.

Ö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 bu kareleri yazarken sıkışık oluyor ve bilgisayarım kopyala / yapıştırmayı desteklemiyor, bu nedenle yazabileceğiniz en az kod içeren giriş (bazı nedenlerden dolayı bayt cinsinden ölçülmüş) kazanıyor!

5 Comments
Gryphon 07/29/2017
Bunun kum havuzunda çok uzun süre olmadığının farkına vardım (yalnızca bir günün biraz üzerindeydi), ancak zaten 7 tane upvote vardı, bu yüzden muhtemelen göndermeye hazır olduğunu düşündüm.
1 Leaky Nun 07/29/2017
"123.45" ve "244.2" float'lar geçerli değildir, çünkü bilgisayar ikili olarak sayı saklar. Sorun, ondalık gösterime dayanıyana kadar normalde bir problem değildir.
3 Leaky Nun 07/29/2017
@Gryphon Burası başarısız olduğu yerdir. 244.2 , float numarası değil. "244.2" dizesine dönüştürülemez.
2 Leaky Nun 07/29/2017
@Gryphon Ancak bu gibi davranışlar çok rahatsız edici hale getirir.
7 Gryphon 07/29/2017
Neden üç yakın oy? Eğer 11 kişi soruya cevap verebilirse, muhtemelen oldukça açıktır diye düşünüyorum!

20 Answers


Erik the Outgolfer 07/29/2017.

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 
4 comments
3 Jonathan Allan 07/29/2017
Ooo açıklama ne zaman lütfen
1 Jonathan Allan 07/29/2017
Ayrıca, tek öncü sıfırın, -1 <girdi <1 için girdi üzerinde bir gereklilik olduğuna dikkat edeceğim (yani, 0.45 ve .45, farklı girdiler fakat aynı sayıda, yalnızca eski kabul edilebilir)
Erik the Outgolfer 07/29/2017
@JonathanAllan İkincisi zaten işlenmemiştir.
Erik the Outgolfer 07/29/2017
@JonathanAllan Bitti.

Jonathan Allan 07/29/2017.

Jöle , 13 12 bayt

fØDẋ€L$ŒV+VS 

Karakterlerin listesini kabul eden monadik bir bağlantı (iyi oluşturulmuş bir ondalık sayı, tek öncü sıfır -1 < n < 1 için bir gerekliliktir) ve bir sayı döndürür.

Try it online!

14 bayt kabul eder ve sayıları döndürür (giriş +/-10-5 ile ŒṘ limited ile sınırlıdır): ŒṘ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 
4 comments
Erik the Outgolfer 07/29/2017
Umm, +€ değerini -1 için 15 bayt sürümünde + ile değiştirebilirsiniz.
Jonathan Allan 07/29/2017
Zaten yaptın, teşekkürler!
Erik the Outgolfer 07/29/2017
15 baytlık bir sürümde değil. DÜZENLEME: Sanırım çok erken 3 saniye ...
Jonathan Allan 07/29/2017
Yup sadece 15 bayt versiyonunu gördüğünüzü fark etti - tekrar teşekkürler!

nimi 07/29/2017.

Haskell, 59 56 bayt

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

Girdi, 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 

ETHproductions 07/29/2017.

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. 

Ian H. 07/31/2017.

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

Saved 9 bytes thanks to @TheLethalCoder
@TheLethalCoder sayesinde başka bir 8 bayt daha kaydedildi

a=>{var c=(a+"").Replace(".","").Replace("-","");int i=0,l=c.Length;var r=a*l;for(;i 

Çevrimiçi deneyin!

Bir dize girdi olarak alır ve 'kareli' sayıyı bir kayan nokta olarak çıkarır.


Bu kod aşağıdaki algoritmayı izlemektedir:

  1. Girdi olarak ondalık işaretleri ve semboller olmaksızın yeni bir dize oluşturun, böylece uzunluğumuzu ve sütun sayısını oradan alabiliriz.

  2. Girdi zamanını nokta 1'de oluşturduğumuz dizenin uzunluğunu hesaplayın.

  3. 'Kare'mizdeki her sütun için, sütun numarasını ve satır uzunluğunu içeren yeni bir dize oluşturun ve sonucumuza ekleyin.

Örnek:

Girdi: -135.5

  1. Ondalık basamak ve sembolleri değiştirirsek, 1355 uzunluğunda 4 uzunluğunda dize elde ederiz.
  2. Giriş zamanı 4: -135.5 * 4 = -542 .
  3. Şimdi her bir sütun için yeni dizeler oluşturuyoruz, onları ayrıştırıyor ve sonuçlarımıza ekliyoruz:
    1111 , 3333 , 5555 , 5555 .

Bu rakamları 15012 , 15012 elde 15012 , bu da tam olarak programımızın çıktısı olacaktır.

5 comments
1 Dada 07/31/2017
Siteye hoş geldiniz, güzel ilk cevap (özellikle açıklamalarınız takdir!)!
Ian H. 07/31/2017
@Dada Teşekkürler! Bile zor string.Replace() gibi şeyler kazandı bayt tarafından oldukça string.Replace() , ancak thats o inşaat tek yolu sanırım!
TheLethalCoder 07/31/2017
i ve l şamandıralara ayarlayarak bazı baytları kurtarabilir.
Ian H. 07/31/2017
@ The LethalCoder Bunun gibi bir düşünce, ne yazık ki indeksleme şamandıralarla çalışmaz ve .Length örtülü olarak şamandıraya dönüştürülemez.
1 TheLethalCoder 07/31/2017
a=>{var c=a.Replace(".","").Replace("-","");int i=0,l=c.Length;var r=float.Parse(a)*l;for(;i 141 bayt. Girişi bir float olarak alarak ve n+"" olan bir dizeye float kaydedebilir, ancak kontrol etmedim.

Erik the Outgolfer 07/29/2017.

Brachylog , 23 bayt

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

Çevrimiçi deneyin!

Brachylog şamandıralarla iyi geçmiyor ...

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) 

Zgarb 07/29/2017.

Husk , 15 bayt

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

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

açıklama

Yerleşik ayrıştırma işlevi r varsayılan bir değeri döndürmek yerine geçersiz girdiler üzerinde ayrıştırma hataları verdiğini biraz sinir bozuyor; bu da, rakamlardan oluşmayan sütunları açıkça filtrelemem gerektiği anlamına geliyor. Hatalı biçimlendirilmiş girdilerden 0 fΛ± ve 3 bayt tasarruf edebilirim.

§+ȯṁ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 

Mr. Xcoder 07/29/2017.

Python 3 , 95 94 87 85 84 bayt

 def f(i):l=[x for x in i if"/" 

Test Süiti .

Python 3 , 78 bayt

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

Test odası.

İkinci yaklaşım, @ officialaimm'in özümüyle esinlenen Python 3'e bir bağlantı noktasıdır.


ThePirateBay 07/31/2017.

JavaScript, 75 62 bayt

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

Çevrimiçi deneyin

-2 bytes thanks to Arnauld
-5 bytes thanks to Shaggy (işlevi bir sayı almalı ama şimdi diğer yanıtların çoğunun aldığı dizgeyi görüyorum)


Xcali 08/05/2017.

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

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

Çevrimiçi deneyin!

Dom kodundan bazı hileleri kullanarak 4 bayt tıraş etti

Explained:

 @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 
3 comments
Dom Hastings 07/31/2017
Benzer bir yaklaşımla geldi, ancak $ \ kullanarak ve döngüden çıkıp birkaç baytlık bir alanı kapmayı başardı: çevrimiçi denemelisin!
Xcali 08/05/2017
Senden bazılarımı tıraş etmek için ilham almıştım. Sonunda "} {" yapı nedir? Ben buna aşina değilim.
Dom Hastings 08/05/2017
Bu siteden öğrendiğim bir şey, temelde -n ve -p kelimenin tam anlamıyla bir while(){...} -p sarın, böylece }{ bunlardan -p . Bu, $_ değerini kaldırır ancak değişkeniniz olarak $\ , her bir yazdırma işlemine $\ eklendiğinden yine de yazdırılacaktır. Bunun içinde numaralar veya başka şeyler saklayabileceğiniz ve $_ değerini göz ardı edebileceğiniz anlamına gelir. Harika bir açıklama yaptığından emin değilim, ancak Perl'de golf oynamaya yönelik ipuçlarına göz atın , eminim daha iyi anlatacağınızdan eminim! Seviyenize rağmen sevindim!

Erik the Outgolfer 07/29/2017.

Jöle , 17 bayt

ŒṘfØDẋ€L©$ŒV;ẋ®$S 

Çevrimiçi deneyin!


Erik the Outgolfer 07/29/2017.

Pyth, 18 bayt

s+RvQsM*RF_lB@jkUT 

Deneyin burada.


Mr. Xcoder 07/29/2017.

Pyth , 21 20 bayt

K@jkUTQ+smv*lKdK*lKv 

Test odası.

@ EriktheOutgolfer'ın cevabından tamamen farklı bir yaklaşım benimsiyor ve bu da 22'den 21'e kadar sohbette 1 baytlık golf oynamamda yardımcı oldu.


açıklama

  K@jkUTQ+s.ev*lKbK*lKv   K @ jkUTQ - Sayılara filtre uygular ve bunları K değişkenine atar.           m - Harita.  D değişkenli basamaklarla yinelendi             v - Değerlendirin (float'a dönüştürün).              * lKd - Her dizgenin rakamını K uzunluğuna çarpar.          s - Toplam         + - Toplam                   * lKvQ - Sayıyı rakamların uzunluğuna çarpar String 

officialaimm 07/30/2017.

Python 2 , 81 74 bayt

-7 bytes thanks to @Mr. Xcoder -7 bytes thanks to @Mr. Xcoder : '/'

  • 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"/" 

Çevrimiçi deneyin!

Açıklama:

Sayın 123.45 girdi olarak verilir. [i for i in`x`if"/" , stringified tamsayıların listesini verir ['1','2','3','4','5'] (ayrıca z ). Şimdi [x]+z ie [123.45,'1','2','3','4','5'] her elemana len(z) çarpılarak burada 5 len(z) ve herbiri bir Float (böylece dizeler buna göre de [617.25,11111.0,22222.0,33333.0,44444.0,55555.0] ), [617.25,11111.0,22222.0,33333.0,44444.0,55555.0] elde edilir. Sonunda sum(...) hesaplarız sum(...) ve 167282.25 elde 167282.25 .

4 comments
Mr. Xcoder 07/29/2017
78 bayt . i.isdigit() "/"
1 Mr. Xcoder 07/29/2017
74 bayt . i.isdigit() "/" ile değiştirebilirsiniz, çünkü her ikisi de . ve - basamaklardan daha düşük ASCII kodlarına sahip, aralarında / arasındadır
officialaimm 07/29/2017
@ Mr.Xcoder Çok teşekkürler!
Mr. Xcoder 07/29/2017
Rica ederim. Benim cevabıma bir alternatif olarak Python 3'e taşıdım

Bruce Forte 07/30/2017.

Octave , 100 82 bayt

@TomCarpenter @TomCarpenter'a teşekkürler, ödevlerin bir dönüş değeri var ve bana 18 bayt kazandırdığını öğrettiğiniz için teşekkürler!

 @(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ısının kendisine n kere eklenmesinin ardından sütunların toplamını eklememiz gerektiğidir. Toplam s' * logspace(0,n-1,n) , sütunların toplamına ulaşır, örneğin eğer v=-123.4 , matris şu şekilde olacaktır:

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

Bu yüzden sadece sum lazım ve işimiz bitti.

1 comments
1 Tom Carpenter 07/30/2017
Hepsini bir isimsiz işleve smashing yaparak 18 bayttan tasarruf edebilirsiniz: @(v)(n=nnz(s=strrep(num2str(abs(v)),'.','')-'0'))*v+sum(sum(‌​s'*logspace(0,n-1,n)‌​)) . Çevrimiçi deneyin!

Mr. Xcoder 07/30/2017.

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) - Açık bir String parametresi s olan bir fonksiyonu tanımlar.

  • let k=s.filter{"/"<$0} - let k=s.filter{"/"<$0} filtre uygulayın: Bu ikisini de fark ettim - ve . tüm basamaklardan daha küçük ASCII değerlerine sahip ve / arasında . , - ve 0 . Dolayısıyla, sadece Python cevabımda yaptığım gibi, "/" mevcut karakterden küçük olup olmadığını kontrol ettim.

  • print(...) - Sonuçları yazdırır.

  • Float(s)!*Float(k.count) - String'i ve basamak sayısını Float(s)!*Float(k.count) dönüştürür ve çarpar (Swift Float ve Int çarpımına :() izin vermez). Yani, x sayısını ekler, burada x içerdiği basamak sayısıdır.

  • k.mapNO maps over k with the current value $0 . - k.map{} , k üzerinde geçerli değeri $0 olan haritalandırır. String(repeating:$0,count:k.count) her basamağı alır, x aynı sayıda rakam ve Float(...)! bir kayan nokta sayıya dönüştürür.

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

  • Ve nihayet + iki sonucu özetliyor.


Bir örnek alalım!

Dize "0.45" diyelim. Öncelikle rakamları filtreliyoruz, bu yüzden 0, 4, 5 ile bırakılıyoruz. "0.45" i Float'a dönüştürdük ve rakamlarla çarpacağız: 0.45 * 3 = 1.35 . Ardından, her basamağı alıp, o hanenin kare genişliğini doldurana kadar (kaç basamak var): 0, 4, 5 -> 000, 444, 555 olmak üzere bir Dize haline 0, 4, 5 -> 000, 444, 555 . Bunu topluyoruz, 000 + 444 + 555 = 999 . Sonra sonuçları bir araya 1.35 + 999 = 1000.35 : 1.35 + 999 = 1000.35 .


TheLethalCoder 07/31/2017.

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

Saved 2 bytes thanks to @Ian H.

Çevrimiçi deneyin!

Tam / Biçimlendirilmiş sürüm:

 namespace System.Linq
{
    class P
    {
        static void Main()
        {
            Func 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();
        }
    }
} 
2 comments
Ian H. 07/31/2017
var d=(n+ ... yerine var d = (n ... kullanarak başlangıçta 2 bayt kaydedebilirsiniz.
TheLethalCoder 07/31/2017
@IanH. Tüm alanları kaldırmayı unuttum -_- Bir destek çağrısı yaparken cevaplamak için elimden gelen şey buydu.

Jenny_mathy 08/09/2017.

Mathematica, 107 bayt

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

Titus 08/11/2017.

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; 

-nR ile boru olarak -nR .

PHP 7.1'de uyarılar verilebilir. Düzeltmek için $c,$e ile $c>0?$c:0,$e tekrar et.


C McAvoy 07/31/2017.

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!

Döngüler her basamaklı karakterin üzerinde döner ve toplam basamaklı karakter sayısıyla tekrarlar, bunu bir tam sayı haline getirir ve bunu n ekler. Bu şekilde, n , dikey kısım olan basamak tekrarlaması ile birlikte, toplamın yatay parçası olan d katına eklenir. Başlangıçta str.isdigit ama >"/" kullanıldı, bu str.isdigit diğer kullanıcılar sayesinde bayt çok kaydedildi. N'yi bir dize olarak alarak iki bayttan tasarruf eder, ancak çıktı messier'dir.

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

Çevrimiçi deneyin!

Related questions

Hot questions

Language

Popular Tags