Gniazdko elektryczne

23

Jest to problem z NCPC 2005 . Roy ma mieszkanie z tylko jednym gniazdkiem elektrycznym, ale ma kilka listew zasilających. Oblicz maksymalną liczbę gniazd, jakie może mieć za pomocą listew zasilających, które posiada. Liczba gniazd na listwę zasilającą jest podawana jako dane wejściowe.

Okazuje się, że jeśli odpowiednio liczba wylotów pasków jest

p1,p2,,pn

wtedy liczba gniazd wynosi

1n+ipi
,

lub

1+p11+p21++pn1
.

Dane wejściowe do programu lub funkcji to niepusta seria dodatnich liczb całkowitych.

Przykłady

2 3 4
> 7
2 4 6
> 10
1 1 1 1 1 1 1 1
> 1
100 1000 10000
> 11098
Pål GD
źródło
17
I myślałem, że nie powinieneś łączyć listew zasilających ...
Joey
O ile mogę powiedzieć, moja odpowiedź Retina jest jedyną odpowiedzią wykorzystującą dane jednoargumentowe. Możesz rzucić okiem na dyskusję na komentarzach: codegolf.stackexchange.com/questions/71047/electrical-outlet/ ... ... Jeśli uważasz, że jednoetatowe rozwiązanie to zbyt duży hack, który nie jest w duchu wyzwanie, cieszę się, że określiłeś, że dane wejściowe powinny być w systemie dziesiętnym (i odpowiednio poprawią moją odpowiedź).
Martin Ender,
7
Ponieważ energia elektryczna jest tak droga, twój kod powinien być tak krótki, jak to możliwe, aby uniknąć zużycia większej ilości energii
kot
1
@cat Czas wykopać starą maszynę napędzaną chomikami i komputery mechaniczne.
Pharap,
1
@immibis na pewno, ale dane wyjściowe byłyby traktowane jako informacja zawarta w strumieniu bajtów, a nie jak to się dzieje z renderowaniem przez twój terminal.
Martin Ender,

Odpowiedzi:

29

Siatkówka , 3 bajty

 1

Końcowe podawanie linii jest znaczące.

Dane wejściowe to rozdzielona spacjami lista liczb jednoargumentowych .

Wypróbuj online!

Wyjaśnienie

Kod po prostu usuwa wszystkie 1ciągi, a także następujące po nich ciąg. Oto dlaczego to działa:

Dodawanie jednostkowe jest proste: po prostu połącz liczby, które są takie same jak usunięcie ograniczników. Zmniejszenie o 1 jest również proste: wystarczy usunąć znak 1z każdej liczby. Chcemy jednak o 1 więcej niż suma zmniejszonych danych wejściowych, więc po prostu usuwamy tylko te, 1które znajdziemy po spacji, a tym samym zmniejszamy wszystko oprócz pierwszego.

Martin Ender
źródło
1
Zastanawiam się, czy należy zezwolić na wprowadzanie danych w unary.
John Dvorak
@JanDvorak jest domyślnie, chyba że wyzwanie wyraźnie określa dane dziesiętne. (Zobacz link w odpowiedzi.) Nie ma jednak znaczenia, że ​​Jelly i tak wygrywa.
Martin Ender
@ MartinBüttner Istnieją przykładowe dane zarówno w tym pytaniu, jak i w pierwotnym zadaniu. Czy nie sądzisz (chyba że zaznaczono inaczej), że powinno to być niezbędne (choć niewystarczające) kryterium do przekazania, że ​​kod działa z dosłownie przykładowymi danymi?
nitro2k01
1
@ nitro2k01 Nie (w takim przypadku większość odpowiedzi prawdopodobnie byłaby nieprawidłowa). O ile wyzwanie nie określa jednoznacznie jednego konkretnego formatu wejściowego , zwykle zakładamy, że listy mogą być pobierane w dowolnym rodzimym formacie listy . To samo dotyczy formatów liczb (przynajmniej jednoargumentowych i przyjmowania liczb całkowitych, ponieważ wartości bajtów są dozwolone przez konsensus, chyba że wyzwanie je zabrania). Włączenie przykładowych danych do każdego natywnego formatu wejściowego w wyzwaniu jest prawie niemożliwe.
Martin Ender
@ MartinBüttner Imo, to nie jest problem, którym zajmuje się zalecenie. To, co nadal przemawia przeciwko temu, to to, że (chyba się mylę) to nie działa, ponieważ unary jest obsługiwanym lub rodzimym formatem liczb w Retina, ale zdarza się, że działa podczas przetwarzania łańcucha jako danych łańcucha. To jest hack. To nawet sprytny hack, ale wciąż nie jestem przekonany, że jest to zgodne z zasadami. Jeśli rozdzielone spacjami liczby jednoargumentowe były rodzimym formatem w Retinie w taki sam sposób, jak lista bajtów jest rodzimym formatem w bf, zgodziłbym się, że zalecenie ma zastosowanie i miałbym inne zdanie.
nitro2k01
9

Sześciokąt , 18 14 bajtów

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

Rozłożony:

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

Wypróbuj online!

Nie sądzę bok długości 2 jest możliwe, ale nie musi może być bardziej wydajny boku długości 3 rozwiązanie tego.

Jest to zwykłe podejście „zmniejszaj wszystko, sumuj, zwiększaj”, ale będę musiał później dodać diagramy, aby pokazać, jak dokładnie działa w Hexagony.

Martin Ender
źródło
7

Python, 24 bajty

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

Wypróbuj online

Mego
źródło
1
Zakłada się, że funkcja jest najpierw przypisywana, a następnie stosowana do danych wejściowych z innej zmiennej.
juandesant
1
@juandesant ... co jest w porządku. Jest to dosłowność funkcji, która jest prawidłową formą złożenia.
FlipTack,
7

Mathematica, 9 bajtów

Tr[#-1]+1&
Simmons
źródło
7

Haskell, 17 15 bajtów

foldl1$(+).pred

Przykład użycia: ( foldl1$(+).pred ) [2,4,6]-> 10.

Stara wersja, inne podejście, 17 bajtów: succ.sum.map pred.

nimi
źródło
6

J, 6 bajtów

+/+1-#

Suma plus jeden minus długość. Nawiasuj i stosuj go w następujący sposób:

   (+/+1-#) 2 3 4
7
Lynn
źródło
6

Labirynt , 9 bajtów

"?;)!@
+(

Wypróbuj online!

Zwykły podkład:

  • Labirynt jest oparty na 2D i oparty na stosach. Stosy mają na dole nieskończoną liczbę zer.
  • Gdy wskaźnik instrukcji dojdzie do skrzyżowania, sprawdza górną część stosu, aby określić, gdzie należy skręcić. Ujemne jest lewe, zero jest do przodu, a pozytywne jest prawe.

Tutaj zaczynamy w lewym górnym rogu ", no-op, kierując się w prawo. Następnie ?czytamy liczbę całkowitą ze STDIN (wyrzucając znaki, których nie można parsować jako liczbę całkowitą, np. Spacje). Teraz mamy dwa przypadki:

Jeśli dane wejściowe są pozytywne, skręcamy w prawo, wykonując:

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

Jeśli wartość wejściowa wynosi zero (co występuje w EOF), idziemy prosto, wykonując:

;            pop zero from EOF
)            increment top of stack
!            output top of stack as number
@            halt program
Sp3000
źródło
5

Pyth, 5 bajtów

hstMQ

inkrement (suma (mapa (dekrementacja, wejście)))

Lynn
źródło
5

ES6, 25 bajtów

a=>a.map(n=>r+=n-1,r=1)|r
Neil
źródło
4
Zamierzałem napisać: „Jeden z rzadkich przypadków, w których redukcja wygrywa”… i to także 25 l=>l.reduce((a,b)=>a+b-1).
edc65
@ edc65 Tak, (,b)jest to kosztowne, ale lubię też tę wersję.
Neil
5

MATL, 3 bajty

qsQ

Wypróbuj online.

Wyjaśnienie

qsQ
q      thread decrement over the input array
  s    sum
   Q   increment
spaghetto
źródło
4

05AB1E , 4 bajty

Kod:

E<O>

Wyjaśnienie:

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

Pobiera dane wejściowe jak tablicę (np [3, 4, 5].).

Adnan
źródło
Bardzo elegancki jak na golfa
Pharap
4

Gwiaździsta , 26 24 bajtów

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

Oczekuje liczb całkowitych oddzielonych znakiem nowej linii. Wypróbuj online!

Dzięki @ MartinBüttner za -2 bajty.

,           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

Pętla jest rozwijana, dzięki czemu pierwsza liczba nie jest zmniejszana, co eliminuje potrzebę zwiększania. Wypychanie liczb jest drogie w Starry ...

Sp3000
źródło
Liczę tylko 20 bajtów.
Addison Crump
1
@VoteToClose Czy policzyłeś wiodące spacje? (Zakładam, że mówisz o 26 bajtach)
Sp3000
4

Narzędzia Bash + GNU, 16

Jeśli występują Nlistwy zasilające, na N-1liście wejściowej oddzielonej przecinkami powinny znajdować się separatory. Wszystko, co musimy zrobić, to wymienić separatory na - 1 +i ocenić arytmetycznie:

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

Lub używając tej samej sztuczki:

Pure Bash (bez zewnętrznych narzędzi), 19

echo $[${1//,/-1+}]
Cyfrowa trauma
źródło
3

APL (NARS 2000), 13 10 bajtów

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

Edycja: do 10 z podejściem Lynna (lepszym).

{1++/1-⍨⍵}

Koneke
źródło
3

gs2, 5 bajtów

(Kodowane CP437).

W&Φd'

To read-nums dec m1 sum inc.

Lynn
źródło
3

CJam, 7 bajtów

q~:(:+)

Sprawdź to tutaj.

Takie samo podejście jak w przypadku Lynna (zmniejszanie wszystkich, suma, przyrost). Działa to również dla 8 bajtów (i może jest nieco bardziej interesujące):

q~{(+}*

Spowoduje to złożenie „zmniejszenia, dodania” nad listą. W ten sposób zmniejszenie jest stosowane tylko do wszystkich elementów oprócz pierwszego, tak że nie musimy osobno zajmować się przyrostem.

Martin Ender
źródło
3

C, 60 59 55 bajtów

x;main(s){while(~scanf("%i",&x))s+=x-1;printf("%i",s);}
stmbgr1
źródło
3

Perl 6, 14 bajtów

{1+[+] --«@_}

stosowanie

my &f = {1+[+] --«@_}

say f([2,3,4]) # 7
say f([2,4,6]) # 10
say f([1,1,1,1,1,1,1,1]) # 1
say f([100,1000,10000]) # 11098
Skróty klawiszowe
źródło
W pełni zamierzałem zredagować moją odpowiedź na to samo (patrz komentarz HTML )
Brad Gilbert b2gills
11 bajtów:{.sum-$_+1}
nwellnhof,
3

Poważnie, 7 bajtów

,;l@Σ-u

Wypróbuj online!

Wyjaśnienie:

,;l@Σ-u
,        push input
 ;       dupe
  l@     push length (n), swap
    Σ-u  push sum, subtract n, add one
Mego
źródło
2

Perl 6 , 20 bajtów

put 1+sum --«@*ARGS

(Możesz użyć <<zamiast «)

Stosowanie:

$ perl6 -e 'put 1+sum --«@*ARGS' 100 1000 10000
11098
Brad Gilbert b2gills
źródło
«Jest operatorem Perla?
user253751
@immibis Właściwie jest częścią kilku operatorów Perla 6 @arraya »+« @arrayb ++«@array @array».method @array»++ « a 'space separated' list of words »Kilka z nich jest tak zwanych operatorów Meta, ponieważ łączą się z innymi operatorami. (Perl 5 obecnie nie ma tych operatorów.)
Brad Gilbert b2gills
2

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

Wymaga -apflag:

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

Zapisano w pliku i uruchom jako

perl -ap file.pl

EDYCJA: Kolejna odpowiedź, mniejsza (19 + 2), ale w zasadzie skopiowana z odpowiedzi dev-null:

$.+=$_-1for@F;$_=$.
ChatterOne
źródło
2

F #, 25 bajtów

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

Jest to funkcja, która pobiera tablicę / listę / sekwencję liczb całkowitych i zwraca wymagany wynik.

Jak to działa:

Seq.foldpozwala zastosować funkcję do każdego elementu sekwencji, jednocześnie przenosząc pewien stan. Wynik działania zastosowany do pierwszego elementu da stan, który zostanie wprowadzony do funkcji dla drugiego elementu i tak dalej. Na przykład, aby podsumować listę [1; 3; 4; 10], zapisz ją w następujący sposób:

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

Które można by zastosować tak:

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

Ostatni stan to wartość zwracana z Seq.fold.

Roujo
źródło
2

𝔼𝕊𝕄𝕚𝕟, 5 znaków / 7 bajtów

ï⒭+‡_

Try it here (Firefox only).

Używa niestandardowego kodowania z 10-bitowymi znakami (dzięki @Dennis!). Uruchom encode('ï⒭+‡_')w konsoli JS, aby uzyskać zakodowaną formę idecode(/*ENCODED TEXT HERE*/) dekodować zakodowaną formę.

Wyjaśnienie

Tłumaczy na Javascript ES6 jako:

i=>i.reduce(($,_)=>$+--_)
Mama Fun Roll
źródło
Ciekawe kodowanie.
lirtosiast
Działa też całkiem nieźle.
Mama Fun Roll
2

Mornington Crescent , 1909 1873 1839 bajtów

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

Wypróbuj online!

pppery
źródło
„90% wszystkich instrukcji dotyczy przejęcia linii District”. To dlatego, że w dzielnicy znajdują się wszystkie stacje arytmetyczne. Jednak w przypadku TIO wydaje się, że nie działa w przypadku żadnego z przykładów .
NieDzejkob
1873 bajtów przy użyciu, gdzie to możliwe, krótszych nazw linii
NieDzejkob
Tłumacz TIO ma błąd i nie implementuje
Turnhama
Dobry chwyt. Wysłałem PR, który naprawia go wcześniej.
NieDzejkob
1

Python 3, 79 bajtów

import sys
print(sum(map(lambda x: int(x)-1, sys.stdin.readline().split()))+1)
Pål GD
źródło
Wygląda na to, że liczysz nowy wiersz jako dwa bajty. Może zastąpić go średnikiem, aby zaoszczędzić bajt. Można również usunąć kilka spacji.
Daffy,
1

Rubinowy, 30 bajtów

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

To proste - zaczynając od 1, zsumuj podane liczby, każda -1 (argumenty wiersza poleceń są włączone $*). Wstyd injectto takie długie słowo.

Chowlett
źródło
1

PowerShell, 19 bajtów

$args-join'-1+'|iex

Zauważ, że 1 + p1-1 + p2-1 + ... + pn-1 jest to równoważne zp1-1 + p2-1 + ... + pn .

Pobiera dane wejściowe jako osobne argumenty wiersza polecenia za pomocą $args. My -joinrazem z -1+ogranicznikiem, aby utworzyć ciąg, taki jak 2-1+3-1+4. Łańcuch jest następnie przesyłany potokowo Invoke-Expression(podobnie do eval) i wyświetla wynik.

AdmBorkBork
źródło
1

Perl, 21 + 2 = 23 bajty

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

Wymaga -ai -E:

$ perl -aE'$a+=$_-1for@F;say++$a'<<<'2 3 4'
7
andlrc
źródło
Możesz użyć -aflagi, aby uzyskać @Fzmienną z już podzielonymi elementami, i zamienić -n na -p, abyś nie potrzebował say, zmniejszając ją do 21 + 2:$a+=$_-1for@F;$_=++$a
ChatterOne
Używanie -pzamiast sayjest takie samo, ponieważ i tak muszę go używać $_=.
andlrc
@ChatterOne -ato dobry pomysł!
andlrc
1

Brainfuck, 15 bajtów

Założenie: Operator zwraca 0 po wyczerpaniu wszystkich danych wejściowych i nie ma przedłużaczy z 0 wtyczkami. Ponadto IO musi zawierać wartości bajtowe zamiast kodów znaków ASCII.

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

Objaśnienie: Używa 2 rejestrów. Rejestr akumulatora „Wartość” reprezentujący liczbę urządzeń, które można podłączyć, oraz rejestr „prądu przewodu”, który śledzi wartość bieżącego przewodu. Zaczyna się od zwiększenia wartości o 1 dla istniejącego gniazdka. Następnie dla każdego przedłużacza odejmuje jeden od wartości, ponieważ pobierana jest wtyczka, a następnie zwiększa wartość o liczbę wtyczek.

Większość internetowych tłumaczy nie działa w trybie wprowadzania surowych bajtów. Aby przetestować online, użyj tego kodu:

+>,[->-[>+<-----]>---[-<+>]<[-<->]<[-<+>],]<.
Ethan
źródło
Czy mogę gdzieś przetestować program?
Pål GD
Thanks, corrected those mistakes. I'm not aware of any online interpreters that operate in byte mode. I can throw together an implementation that subtracts '0' from the inputs that will run on any online interpreter.
Ethan
Jeśli chcesz przetestować kod, uruchom go tutaj: copy.sh/brainfuck Nie umieszczaj spacji między wartościami liczbowymi. Niestety, ponieważ działa w trybie ASCII, kod demonstracyjny będzie działał tylko na wartościach jednocyfrowych. Jednak 15-bajtowa wersja będzie działać poprawnie na wartości <= 255. Po uruchomieniu, zobacz zrzut pamięci, aby zobaczyć końcową wartość.
Ethan
Pewnego dnia BF będzie mieć odpowiednie standardy dla oczekiwanego We / Wy i będziemy mogli po prostu powiedzieć „używając standardu 3” zamiast np. „Wszystkie wejścia i wyjścia są asciii zakończone znakiem null char”.
Pharap,