Elektrik prizi


23

Bu NCPC 2005'ten bir problem . Roy'un tek bir elektrik prizine sahip bir dairesi var, ama bir sürü elektrik prizine sahip. Sahip olduğu güç şeritlerini kullanarak sahip olabileceği maksimum çıkış sayısını hesaplayın. Güç şeridi başına çıkış sayısı giriş olarak verilmiştir.

Sırasıyla, şeritlerin çıkış sayısı sırasıyla

p1,p2,,pn

o zaman çıkış sayısı ,

1n+ipi

veya

1+p11+p21++pn1
.

Program veya fonksiyona giriş boş olmayan bir pozitif tamsayı dizisidir.

Örnekler

2 3 4
> 7
2 4 6
> 10
1 1 1 1 1 1 1 1
> 1
100 1000 10000
> 11098

17
Ve güç şeritlerini zincirlememelisin diye düşünmüştüm ...
Joey

Retina cevabımı söyleyebileceğim kadarıyla unary girişi kullanan tek cevap. Buradaki yorum tartışmalarına bir göz atmak isteyebilirsiniz: codegolf.stackexchange.com/questions/71047/electrical-outlet/… ... Unary çözümünün ruhu içinde olmayan bir kesimin olduğunu düşünüyorsanız Buradaki zorluk, girişin ondalık basamakta olacağını belirtmenizden memnuniyet duyuyorum (ve cevabımı buna göre düzeltir).
Martin Ender

7
Elektrik çok pahalı olduğu için, kodunuz daha fazla enerji kullanmaktan kaçınmak için mümkün olduğu kadar kısa olmalıdır
cat

1
@cat Eski hamsterle çalışan turing makinesini ve mekanik bilgisayarları kazma zamanı.
Pharap

1
@ immibis emin, ancak çıkış uçbiriminiz tarafından yapılanlar değil, bayt akışında yer alan bilgiler olarak kabul edilir.
Martin Ender,

Yanıtlar:



29

Retina , 3 bayt

 1

Sondaki satır besleme kayda değerdir.

Giriş, boşlukla ayrılmış bir tek sayıların listesidir .

Çevrimiçi deneyin!

açıklama

Kod basitçe tüm boşlukları ve 1bunlardan sonra dizgiden çıkarır . İşte bu işe yarıyor:

Tekdüze toplama basittir: sınırlandırıcıları kaldırmakla aynı sayıları birleştirmek. 1 ile düşürmek de basittir: sadece 1her sayıdan bir tane kaldırın . Ancak, azaltılmış girdilerin toplamından 1 tane daha istiyoruz, bu nedenle yalnızca 1boşluklardan sonra bulduğumuz s'leri sileriz, böylece ilk girişi düştük.


1
Unary girişine izin verilip verilmeyeceğini merak ediyorum.
John Dvorak

@JanDvorak, meydan açıkça ondalık girişi belirtmediği sürece, varsayılan değerdir. (Cevaptaki bağlantıya bakın.) Yine de önemli değil, Jelly yine de kazanıyor.
Martin Ender

@ MartinBüttner Hem bu soruda hem de orijinal ödevde örnek veriler var. (Aksi belirtilmedikçe), geçiş için gerekli (yeterli olmasa da) bir kriter olması gerektiğini, kodun sözel örnek verilerle çalıştığını düşünmüyor musunuz?
nitro2k01

1
@ nitro2k01 Hayır (bu durumda çoğu cevap muhtemelen geçersiz sayılır). Zorluk açıkça belirli bir giriş biçimini belirtmediği sürece normalde listelerin herhangi bir yerel liste biçiminde alınabileceğini varsayıyoruz . Aynısı sayı biçimleri için de geçerlidir (en azından tekdüze ve tam sayıların bayt değerlerine izin vermesi, meydan okumaya izin vermediği sürece fikir birliği ile izin verilir). Örnek verileri, her düşünülebilen yerel giriş biçiminde mücadeleye dahil etmek oldukça imkansızdır.
Martin Ender

@ MartinBüttner Imo, tavsiyenin ele alması sorun değil. Buna hala karşı çıkan şey şudur: (yanılmıyorsam) bu işe yaramaz, çünkü unary, Retina'da desteklenen veya yerel bir sayı biçimidir, ancak dizeyi dize verileri olarak işlediğinizde de işe yarar. Bu bir kesmek. Zekice bir kesmek bile, ama bunun kurallara göre olduğuna ikna olmadım. Boşluktan ayrılmış sıralı sayılar Retina'da bir bayt listesinin bf'deki bir yerel format olduğu gibi yerel bir formatsa, tavsiyenin uygulanacağı konusunda hemfikir olur ve farklı bir fikrim olur.
nitro2k01

9

Altıgen , 18 14 bayt

.?<_(@'")>{+.!

Kırımsız:

  . ? <
 _ ( @ '
" ) > { +
 . ! . .
  . . .

Çevrimiçi deneyin!

Ben yandan uzunluğu 2 olası olduğunu düşünmüyorum, ama orada olmalı bu, daha verimli bir yan uzunluk 3 çözüm olabilir.

Bu, olağan "hepsini azaltma, toplam, artırma" yaklaşımıdır, ancak Hexagony'de tam olarak nasıl çalıştığını göstermek için daha sonra diyagramlar ekleyeceğim.


7

Python, 24 bayt

lambda*n:1-len(n)+sum(n)

Çevrimiçi deneyin


1
Bu, işlevin önce atandığını, ardından diğer değişkenden girişe uygulandığını varsayar.
juandesant,

1
@juandesant ... ki kesinlikle iyi. Bu, geçerli bir başvuru formu olan değişmez bir fonksiyondur.
FlipTack


7

Haskell, 17 15 bayt

foldl1$(+).pred

Kullanım örneği: ( foldl1$(+).pred ) [2,4,6]-> 10.

Eski versiyon, farklı bir yaklaşım, 17 bayt: succ.sum.map pred.


6

J, 6 bayt

+/+1-#

Toplam artı bir eksi uzunluk. Parantezleyin ve uygulayın, şöyle:

   (+/+1-#) 2 3 4
7

6

Labirent , 9 bayt

"?;)!@
+(

Çevrimiçi deneyin!

Her zamanki astar:

  • Labirent 2B ve yığın tabanlı. Yığınların altında sonsuz sayıda sıfır vardır.
  • Komut işaretçisi bir kavşağa ulaştığında, bir sonraki duracak yeri belirlemek için yığının üstünü kontrol eder. Negatif sol, sıfır ileri ve pozitif haklıdır.

Burada sol üst ", no-op, sağa doğru ilerliyoruz. Sırada, ?STDIN'den int (okuma yapan) (tamsayı olarak ayrıştırılamayan karakterleri atmak, örneğin boşluklar). Şimdi iki vakamız var:

Girdi pozitifse, sağa dönerek aşağıdakileri gerçekleştiririz:

(            decrement top of stack
+            add top two stack elements
             [continue loop]

Girdi sıfırsa (EOF'da gerçekleşir), dümdüz ilerleyerek, şöyle devam ediyoruz:

;            pop zero from EOF
)            increment top of stack
!            output top of stack as number
@            halt program

5

Pyth, 5 bayt

hstMQ

artış (toplam (harita (azalma, giriş)))


5

ES6, 25 bayt

a=>a.map(n=>r+=n-1,r=1)|r

4
Ben şöyle yazacaktım: “Oyunu kazandığında azaltma durumundaki ender vakalardan biri” ... ve bu da 25 l=>l.reduce((a,b)=>a+b-1).
edc65

@ edc65 Evet, (,b)pahalı, ama ben de bu sürümü seviyorum.
Neil


4

05AB1E , 4 bayt

Kod:

E<O>

Açıklama:

E     # Evaluates input
 <    # Decrement on list
  O   # Compute the total sum
   >  # Increment on the sum
      # Implicit: output top of the stack

Bir dizi gibi girdi alır (örn. [3, 4, 5]).


Golf
canavarı

4

Yıldızlı , 26 24 bayt

, + '`      + ** `, +'*.

Yeni satır ayrılmış tam sayıları bekler. Çevrimiçi deneyin!

@ MartinBüttner'e -2 bayt için teşekkürler.

,           Read line as integer
 + '        Dupe and jump to label 1 if nonzero
`           Set label 0
      +     Push 1
 *          Sub
*           Add
 `          Set label 1
,           Read line as integer
 + '        Dupe and jump to label 0 if nonzero
*           Add
.           Output as integer

Döngü açılır, böylece ilk sayı azalmaz, bu da artış ihtiyacını ortadan kaldırır. Starry'de rakamları zorlamak ...


Sadece 20 bayt sayıyorum.
Addison Crump,

1
@VoteToClose Önde gelen boşlukları saydınız mı? (Sanırım 26 bayt hakkında konuştuğunuzu farz ediyorum)
Sp3000

4

Bash + GNU yardımcı programları, 16

Varsa Ngüç kabloları, daha sonra olmalıdır N-1virgülle ayrılmış giriş listesinde ayırıcılar. Tek yapmamız gereken ayırıcıları değiştirmek - 1 +ve aritmetik olarak değerlendirmek:

sed s/,/-1+/g|bc

Veya aynı numarayı kullanarak:

Saf Bash (harici yardımcı program yoktur), 19

echo $[${1//,/-1+}]

3

APL (NARS 2000), 13 10 bayt

{1+(+/⍵)-⍴∊⍵}

Düzenleme: Lynn'in (daha iyi) yaklaşımıyla 10'a kadar.

{1++/1-⍨⍵}


3

gs2, 5 bayt

(Cp437 kodlanmış.)

W&Φd'

Bu read-nums dec m1 sum inc.


3

CJam, 7 bayt

q~:(:+)

Burada test et.

Lynn'inkiyle aynı yaklaşım (hepsini azaltma, toplam, artış). Bu da 8 bayt için çalışır (ve belki biraz daha ilginçtir):

q~{(+}*

Bu, listenin üzerine "azaltma, ekleme" katlanır. Bunu yaparak, azaltma, yalnızca birincisi dışındaki tüm öğelere uygulanır, böylece artışa ayrı ayrı bakmamıza gerek kalmaz.


3

C, 60 59 55 bayt

x;main(s){while(~scanf("%i",&x))s+=x-1;printf("%i",s);}


3

Cidden, 7 bayt

,;l@Σ-u

Çevrimiçi deneyin!

Açıklama:

,;l@Σ-u
,        push input
 ;       dupe
  l@     push length (n), swap
    Σ-u  push sum, subtract n, add one

2

Perl 6 , 20 bayt

put 1+sum --«@*ARGS

(Kullanabilirsiniz <<yerine «)

Kullanımı:

$ perl6 -e 'put 1+sum --«@*ARGS' 100 1000 10000
11098

«Bir Perl operatörü mü?
user253751

@ immibis Aslında birçok Perl 6 operatörünün bir parçası. @arraya »+« @arrayb ++«@array @array».method @array»++ « a 'space separated' list of words »Bunlardan bazıları Meta operatörleri olarak bilinir, bunlar diğer operatörlerle birleştirilir. (Perl 5 şu anda bu operatörlere sahip değil.)
Brad Gilbert 21: 37'de

2

Perl 5 23 + 2 = 25 veya 19 + 2 = 21

-apBayraklar gerektirir :

map{$.+=($_-1)}@F;$_=$.

Bir dosyaya kaydedildi ve olarak çalıştır

perl -ap file.pl

EDIT: Başka bir cevap, daha küçük (19 + 2) fakat temelde geçersiz yanıttan kopyalandı:

$.+=$_-1for@F;$_=$.

2

F #, 25 bayt

Seq.fold(fun s n->s+n-1)1

Bu, tamsayıların bir dizi / liste / sırasını alan ve istenen sonucu döndüren bir işlevdir.

Nasıl çalışır:

Seq.foldBir dizinin her bir elemanına bir işlev uygulamanıza izin verirken bir halini taşırken bu durumu bir arada uygulayabilirsiniz. Birinci elemana uygulanan işlevin sonucu, ikinci elemana ilişkin işleve getirilecek olan durumu vb. Verir. Örneğin, listeyi özetlemek için şöyle yazardınız [1; 3; 4; 10]:

Seq.fold (fun sum element -> sum + element) 0 [1; 3; 4; 10]
         (       function to apply        ) ^ (sequence to process)
                                     ( initial state )

Hangi şekilde uygulanacak:

// First, initial state  + first element
0 + 1  = 1
// Then, previous state + next element until the end of the sequence
1 + 3  = 4
4 + 4  = 8
8 + 10 = 18

Son hali ile dönüş değeri Seq.fold.


2

5 karakter / 7 bayt

ï⒭+‡_

Try it here (Firefox only).

10 bitlik karakterlerle özel bir kodlama kullanır (thx @Dennis!). encode('ï⒭+‡_')Kodlanmış formu almak ve decode(/*ENCODED TEXT HERE*/)kodlanmış formu çözmek için JS konsolunda çalıştırın .

açıklama

Javascript ES6'ya şu şekilde çevirir:

i=>i.reduce(($,_)=>$+--_)

İlginç kodlama.
lirtosiast,

Aynı zamanda oldukça iyi çalışıyor.
Mama Fun Roll,

2

Mornington Crescent , 1909 1873 1839 bayt

Take Northern Line to Stockwell
Take Victoria Line to Seven Sisters
Take Victoria Line to Victoria
Take Circle Line to Victoria
Take Circle Line to Bank
Take Circle Line to Hammersmith
Take Circle Line to Cannon Street
Take Circle Line to Hammersmith
Take Circle Line to Cannon Street
Take Circle Line to Bank
Take Circle Line to Hammersmith
Take District Line to Upminster
Take District Line to Hammersmith
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Turnham Green
Take District Line to Hammersmith
Take District Line to Turnham Green
Take District Line to Notting Hill Gate
Take Circle Line to Notting Hill Gate
Take Circle Line to Bank
Take Circle Line to Embankment
Take Northern Line to Stockwell
Take Northern Line to Embankment
Take Circle Line to Temple
Take Circle Line to Hammersmith
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Blackfriars
Take Circle Line to Embankment
Take District Line to Parsons Green
Take District Line to Bank
Take Circle Line to Hammersmith
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Upminster
Take District Line to Becontree
Take District Line to Parsons Green
Take District Line to Embankment
Take Circle Line to Blackfriars
Take Circle Line to Bank
Take Northern Line to Angel
Take Northern Line to Bank
Take Circle Line to Bank
Take District Line to Upminster
Take District Line to Bank
Take Circle Line to Bank
Take Northern Line to Mornington Crescent

Çevrimiçi deneyin!


“Tüm talimatların% 90'ı Bölge Çizgisi'ne girmeyi içermektedir.” İlçe, tüm aritmetik istasyonlarının bulunduğu bölge. Ancak, TIO'da, hiçbir örnek için işe yaramaz gibi görünmüyor .
NieDzejkob

Mümkün oldukça kısa satır adlarını kullanarak 1873 bayt
NieDzejkob

TIO'nun tercümanı bir hata yaptı ve Turnham Green'i uygulamıyor
pppery

İyi yakaladın. Yukarı doğru düzelten bir PR gönderdim.
NieDzejkob

1

Python 3, 79 bayt

import sys
print(sum(map(lambda x: int(x)-1, sys.stdin.readline().split()))+1)

Yeni bir satırı iki bayt olarak sayıyor gibisiniz. Belki bir bayttan tasarruf etmek için noktalı virgül ile değiştirin. Birkaç boşluk da kaldırılabilir.
Daffy

1

Yakut, 30 bayt

$*.inject(1){|s,v|s+=v.to_i-1}

Yeterince basit - 1'den başlayarak, her biri -1 olan verilen sayıları toplayın (komut satırları girilir $*). Utanç injectçok uzun bir kelimedir.


1

PowerShell, 19 bayt

$args-join'-1+'|iex

Not 1 + p1-1 + p2-1 + ... + pn-1eşdeğerdir p1-1 + p2-1 + ... + pn.

İle girişi ayrı bir komut satırı argümanı olarak alır $args. Biz gibi bir dize oluşturmak için -joinbir -1+sınırlayıcı ile birlikte 2-1+3-1+4. Dize daha sonra Invoke-Expression(benzer şekilde eval) iletilir ve sonucu verir.


1

Perl, 21 + 2 = 23 bayt

$a+=$_-1for@F;say++$a

Gerektirir -ave -E:

$ perl -aE'$a+=$_-1for@F;say++$a'<<<'2 3 4'
7

Önceden bölünmüş öğelere sahip değişkenleri -aelde etmek için bayrağı kullanabilir @Fve -n yerine -n ​​ile değiştirebilirsin say, böylece 21 + 2'ye $a+=$_-1for@F;$_=++$a
düşürürsün

-pBunun yerine kullanmak sayaynı, çünkü $_=yine de kullanmam gerekiyor .
andlrc,

@ChatterOne -aiyi bir fikir!
andlrc,

1

Brainfuck, 15 bayt

Varsayım: Tüm girdiler tükendiğinde, operatör 0 döndürür ve 0 fişli uzatma kablosu yoktur. Ayrıca, IO'nun ASCII karakter kodları yerine bayt değerlerinde olması gerekir.

+>,[-[-<+>],]<.

Açıklama: Bu 2 kayıt kullanır. Takılabilen cihaz sayısını temsil eden bir "Değer" akümülatör kaydı ve mevcut kablonun değerini izleyen bir "mevcut kablo" kaydı. Mevcut çıkış için değeri 1 oranında artırarak başlar. Ardından, her uzatma kablosu için, bir fiş alındığından beri değerden bir tane çıkarır, ardından değeri fiş sayısıyla artırır.

Çoğu çevrimiçi tercüman ham bayt giriş modunda çalışmaz. Çevrimiçi sınamak için bu kodu kullanın:

+>,[->-[>+<-----]>---[-<+>]<[-<->]<[-<+>],]<.

Programı bir yerde test edebilir miyim?
Pål GD

Teşekkürler, bu hataları düzeltti. Bayt modunda çalışan çevrimiçi tercümanların farkında değilim. Herhangi bir çevrimiçi tercüman üzerinde çalışacak olan girdilerden '0' çıkaran bir uygulama oluşturabilirim.
Ethan

Kodu test etmek istiyorsanız, burada çalıştırın: copy.sh/brainfuck Sayısal değerler arasında boşluk bırakmayın . Ne yazık ki, ASCII modunda çalıştığı için demo kodu yalnızca tek haneli değerler üzerinde çalışacaktır. Bununla birlikte, 15 byte sürümü <= 255 değerinde düzgün çalışacaktır. Çalıştırdıktan sonra, son değeri görüntülemek için bellek dökümünü görüntüleyin.
Ethan

Bir gün BF beklenen GÇ için uygun standartlara sahip olacak ve örneğin 'girdi ve çıktı tamamen boş karakterle sonlandı' yerine “standart 3 kullanarak” diyebileceğiz.
Pharap
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.